読者です 読者をやめる 読者になる 読者になる

アラカン"BOKU"のITな日常

あれこれ興味をもって考えたことを書いてます

初心に戻ってTensorflowの勉強をやり直さなきゃ駄目だわ!

最初にお詫びしときます。すいません。

 

実はちょっとだけ天狗になってました。(^_^;)

 

そして、今、つまづいてます。(泣)

 

ディープラーニングの勉強のため、ゼロから「おもちゃディープラーニング」を作ったのが、調子にのって天狗になったきっかけです。

arakan-pgm-ai.hatenablog.com

 

もともと、文系で数学も得意でなく、数式が並んだ参考資料をみて、こりゃ無理かもと思いつつ、「駄目でもともとだから、とりあえずやるだけやってみよう。」ではじめたので、できるとも思ってませんでした。

 

それが、意外とできてしまったのです。

 

そして、ステップアップとして、tensorflowをインストールして、チュートリアルを動かしたり、それをちょこちょこ変更してみたりもできるようになったというのが追い打ちをかけました。

 

もう、最初の謙虚な気持ちはどこへやら、「自分、結構いけてるじゃないか・・」と思ってしまったのですね。

 

それで、次は、以下のようなシステムを作ろうと考えました。

f:id:arakan_no_boku:20170503103908j:plain

 

結論から言うと、ここで、完全に挫折して、天狗の鼻(短ーい鼻ですけど)は折れました。

 

理由は簡単です。

 

tensorflowの基本的なことを、中途半端にしか理解しないで、チュートリアルにもないことをやろうとしたからです。

 

基本もできてないのに、いきなり応用・・は、そりゃ無理ですよね。

 

正直、EXCELのマクロとかを覚えたときみたいに、困ったらネットで検索して、サンプル的なものを断片的にでも見ながら、つなげていったら何とかなるんじゃないかと甘く考えていたのですが、すいません、大きな間違いでした。

 

レベルが全く異なります。

 

やれやれ。

 

ついでなので、どこあたりで挫折したかを、書いておきます。

 

そもそものきっかけは、tensorflowでjavaAPIを見つけたことです。

 

インタフェース(View部分)をWebアプリケーションとして使い慣れたJAVAで書いて、学習みたいな重たい処理は、バックエンドでpythonのプログラムで学習させる分業制にするといいんじゃないかというアイディアは、前から持ってました。

 

そうしたら、学習がだんだん重くなってきても、学習部分だけ並列化して負荷分散もしやすいから・・という、まあ、誰でも考えつきそうな単純なアイディアなんですが、面白いなと思ったんです。

 

ただ、どうやってJAVApythonとデータを受け渡したら良いかが、イマイチわからなかったんです。

 

だから、「tensorflow for java」は、まさにうってつけでした。

 

調べてみたら、tensorflow for java の利用方法も簡単でしたしね。

 

Javaの開発はMavenベースでやっているので、pom.xmlに以下のように追加して書き込むだけで、Windows版の「tensorflow for java」が使えるようになりました。

<dependency>
        <groupId>org.tensorflow</groupId>
         <artifactId>tensorflow</artifactId>
         <version>1.1.0-rc0-windows-fix</version>
</dependency>

 

動作確認も以下のコードで簡単にできました。

import org.tensorflow.Graph;
import org.tensorflow.Session;
import org.tensorflow.Tensor;
import org.tensorflow.TensorFlow;

public class HelloTf {
    public static void main(String[] args) throws Exception {
         try (Graph g = new Graph()) {
               final String value = "Hello from " +    TensorFlow.version();

         try (Tensor t = Tensor.create(value.getBytes("UTF-8")))          {
                g.opBuilder("Const", "MyConst").setAttr("dtype", t.dataType()).setAttr("value", t).build();
         }

          try (Session s = new Session(g); Tensor output = s.runner().fetch("MyConst").run().get(0))

         {
                System.out.println(new String(output.bytesValue(), "UTF-8"));
         }
      }
   }
}

 

 

が、天狗の鼻が伸びたのも、ここまででした。

 

この後、pythonで動作確認をした簡単なコードを、JAVA側でリライトしようとしたのですが、ことごとく、うまく動きません。

 

それに加えて、python側でチュートリアルから発展して、自分が必要な独自のデータ形式を定義して、それを使って学習させようとする試みも、まったくうまく行かないどころか、あれこれソースを触りまくっているうちに、何をどうしたら良いのかわけがわからなくなってしまい、泥沼にはまりこんでしまったのです。

 

そうするうちに、自分が、tensorflowの本質的な部分を全く理解していないことに、今更ながらに思い至り、「あ、これは一から勉強しなおして、頭の中を整理したほうが、たぶん早い」と思い至ったわけです。

 

せっかくなので、整理した結果はブログに記録していきます。

 

ですが、たぶん、既に知っている人・・特に理系で数式が苦にならない人とかが見たら、「こんなんわからないなんて、馬鹿じゃないの」とか言われそうなところからやり直すことになりそうなので、「入門の入門(文系向け)」のサブタイトルでもつけようかな。

 

f:id:arakan_no_boku:20170404211107j:plain