Java TensorFlow 〜機械学習を始める(Mavenインストール)〜

イントロダクション

テキストRPGを作成するのにTRPG的なものを作成しようと思っております。そうすると、言語に対応する為の機械学習機能が必要になるので世間に浸透しつつある「Tensor Flow」を使用して見ようとなりました。

準備

とりあえず、TensorFlowの「Jarファイル」をダウンロードしてくればいけるだろうと思いますので、ダウンロードします。

ソースコードは下のサイトからコピってきました。
https://www.tensorflow.org/install/install_java

動かしてみる

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

public class FirstTensor {

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

            // Construct the computation graph with a single operation, a constant
            // named "MyConst" with a value "value".
            try (Tensor t = Tensor.create(value.getBytes("UTF-8"))) {
                // The Java API doesn't yet include convenience functions for adding operations.
                g.opBuilder("Const", "MyConst").setAttr("dtype", t.dataType()).setAttr("value", t).build();
            }

            // Execute the "MyConst" operation in a Session.
            try (Session s = new Session(g);
                 Tensor output = s.runner().fetch("MyConst").run().get(0)) {
                System.out.println(new String(output.bytesValue(), "UTF-8"));
            }
        }
    }
}

結果

動きませんでした。。。。

原因は「ネイティブライブラリがありません」とエラーメッセージに書いてあります。

というわけで本題

本題というのは環境構築のことです。チュートリアルに従いセットアップを行います。

チュートリアルはこちらです。(Googleのサイトです)

結論からいうと「Mavenでインストールを行う。」らしいです。

じゃあやって見よう

まず、プロジェクトを作成するときに「Maven」で作成します。詳細はこちらを参照してください。

まずは、プロジェクトを作成したばかりの状態を下の図に示します。

そして「pom.xml」ファイルがあるのでそれを開きます。

上記のような感じで作成されています。「感じ」というのは内容が作成したプロジェクトの名前により値が変わる為そのように記載しました。

そして、<dependencies>タグを追加します。下のように多少入力すると補完してくれます。

下のように入力します。

ここからがTensorFlowのセットアップになります。

サイトに以下のような記載があります。

このような記載は、いろんなサイトであります。
これは「Maven」で「インストールできるよ」という意味です。

そんなわけで上記の記述をコピーしてペってやります。

すると上記のような吹き出しが見れますので下にある「Import Changes」をクリックします。※右下の吹き出しにあるリンクの左側。

すると下のようなインジケータが起動します。

TensorFlowのインストールが始まります。
結構長いです。。。

参考サイトにはこれだけと書いてあります。

インストール完了

早速、コードをコピって実行して見ました。

よし!

以上です。

駄菓子菓子。。。

TensorFlow Javaのチュートリアルは、PythonとかC++でTensorFlowについて理解のある人向け担っているようです。※先にPython, C++のドキュメントを呼んでくださいみたいな記述がありました。

pythonでの実行は、自分の好みの問題により見送ることにしてC++でやろうと思います。。。

 



IntelliJ IDEA 使い方〜ライブラリの追加 〜

IntelliJ IDEAでのライブラリ追加

プロジェクトを開く

初期画面か作成したプロジェクトを選択

ワークスペースが開く

上部から「ファイル」→「プロジェクト構成」を選択する

下のような画面が表示されるのでから「+」をクリック

ファイルを選択する

画面キャプチャはOpenCvを追加しました。

JDKの追加

  1. プロジェクトの設定(Project Structure)を開く
  2. File -> Project Structureを開く
  3. SDKのセレクトボックスよりAdd SDKを選択
  4. Dwonload SDKを選択

関連ページ一覧

  1. IntelliJ IDEA 環境構築 〜インストールと起動〜
  2. IntelliJ IDEA Git〜Gitリポジトリからクローン〜
  3. IntelliJ IDEA 使い方〜Git接続 Java起動 etc〜
  4. IntelliJ IDEA Jarファイルを作る
  5. IntelliJ IDEA 使い方〜Maven Projectの作成〜
  6. IntelliJ IDEA 使い方〜Mavenでライブラリを追加する〜
  7. IntelliJ IDEA 使い方〜Javaのコンパイルレベル設定〜
  8. IntelliJ IDEA Gradleセットアップ〜コマンド入力部の表示〜
  9. IntelliJ IDEA Discord Botを作る〜Gradle環境のセットアップ〜

Java Basic

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 8.5 〜Array〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜

IntelliJ IDEA 使い方〜Maven Projectの作成〜

IntelliJの基本的な操作

IntelliJでMavenを使うときは、個人的な意見ですが、基本的には依存関係の追加という形で使用します。以下のものがその使い方です。

Maven Projectの作成手順

Create Projectを選択する
※画像で選択しているところは別です

Mavenを選択する

右下の方に色々と並んでいますが構わず「Next」

画面に項目に名前を入れます。
自分の場合
GroupId: zenryokuservicve
Artifact:  tensorflow.prac
※一番下はそのまま。。。

初期状態で値が入力されていますので「Finish」

作成結果を下に示します。

ここから依存関係の追加などを行います。

Mavenコマンド

依存関係を追加してGithubでソースの管理をする。という段階では上記のものでよかったのですが、プログラムの実行を考えていくと足りません。
なので、Mavenを使ってプログラムの実行まで、つまり製造から実行を考慮に入れてMavenでできることをまとめていきたいと思います。

まとめ

大まかに以下の機能がある。

  • ビルド
  • ドキュメンテーション
  • 報告
  • 依存関係
  • SCM
  • リリース
  • 分布

タグ

タグ名 意味
project これは、すべての Maven pom.xml ファイルの最上位要素です。
modelVersion この要素は、この POM が使用しているオブジェクト モデルのバージョンを示します。モデル自体のバージョンが変更されることはほとんどありませんが、Maven 開発者がモデルを変更する必要があると判断した場合、使用の安定性を確保するために必須です。
groupId この要素は、プロジェクトを作成した組織またはグループの一意の識別子を示します。groupId はプロジェクトの主要な識別子の 1 つであり、通常は組織の完全修飾ドメイン名に基づいています。たとえば、org.apache.maven.pluginsすべての Maven プラグインに指定された groupId です。
artifactId この要素は、このプロジェクトによって生成されるプライマリ アーティファクトの一意のベース名を示します。プロジェクトの主な成果物は通常、JAR ファイルです。ソース バンドルなどのセカンダリ アーティファクトも、最終的な名前の一部として artifactId を使用します。Maven によって生成される一般的なアーティファクトの形式は、<artifactId>-<version>.<extension> (たとえば、myapp-1.0.jar) になります。 
version この要素は、プロジェクトによって生成されたアーティファクトのバージョンを示します。Maven はバージョン管理に大いに役立ち、SNAPSHOTプロジェクトが開発状態にあることを示す指定子がバージョンに表示されることがよくあります。このガイドでは、スナップショットの使用法とその仕組みについてさらに詳しく説明します。
name この要素は、プロジェクトに使用される表示名を示します。これは、Maven が生成するドキュメントでよく使用されます。
url この要素は、プロジェクトのサイトがどこにあるかを示します。これは、Maven が生成するドキュメントでよく使用されます。プロパティこの要素には、POM 内のどこからでもアクセスできる値のプレースホルダーが含まれています。
dependencies この要素の子リストはdependency です。POM の基礎。
build この要素は、プロジェクトのディレクトリ構造の宣言やプラグインの管理などを処理します。

Mavenのプロジェクト構成ルール

下のように構成するルールになっている

プロジェクトのフォルダ
|-- pom.xml(POMファイル)
|-- src(ソースフォルダ)
    |-- main(起動するプログラムを配置するフォルダ)
    |   `-- java
    |       `-- com(以下パッケージ)
    |           `-- mycompany
    |               `-- app
    |                   `-- App.java
    `-- test(テスト用のソース)
        `-- java
            `-- com(以下パッケージ)
                `-- mycompany
                    `-- app
                        `-- AppTest.java

POMファイルの構成

<!-- projectタグがルート -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <!-- groupIdでパッケージ -->
  <groupId>com.mycompany.app</groupId>
  <!-- artifactIdもパッケージ、groupIdの下に付く -->
  <artifactId>my-app</artifactId>
  <!-- このバージョンは作成していくとどんどん上がっていく -->
  <version>1.0-SNAPSHOT</version>

  <!-- プロパティ -->
  <properties>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

POMファイルのすべての構成

  • 要素<project>は記述子のルートです。次の表に、使用可能なすべての子要素を示します。
  • <parent>要素には、このプロジェクトの継承元となる親プロジェクトを見つけるために必要な情報が含まれています。注:この要素の子は補間されないため、リテラル値として指定する必要があります。
  • <groupId>要素は、プロジェクトを作成した組織またはグループの一意の識別子を示します。groupId はプロジェクトの主要な識別子の 1 つであり、通常は組織の完全修飾ドメイン名に基づいています。たとえば、org.apache.maven.pluginsすべての Maven プラグインに指定された groupId です。
  • <artifactId>要素は、このプロジェクトによって生成されるプライマリ アーティファクトの一意のベース名を示します。プロジェクトの主な成果物は通常、JAR ファイルです。ソース バンドルなどのセカンダリ アーティファクトも、最終的な名前の一部として artifactId を使用します。Maven によって生成される一般的なアーティファクトの形式は、&lt:artifactId>-&lt:version>.&lt:extension> (たとえば、myapp-1.0.jar) になります。
  • <version>要素は、プロジェクトによって生成されたアーティファクトのバージョンを示します。Maven はバージョン管理に大いに役立ち、SNAPSHOTプロジェクトが開発状態にあることを示す指定子がバージョンに表示されることがよくあります。このガイドでは、スナップショットの使用法とその仕組みについてさらに詳しく説明します。
  • <name>要素は、プロジェクトに使用される表示名を示します。これは、Maven が生成するドキュメントでよく使用されます。
  • <url>要素は、プロジェクトのサイトがどこにあるかを示します。これは、Maven が生成するドキュメントでよく使用されます。
  • <property>要素には、POM 内のどこからでもアクセスできる値のプレースホルダーが含まれています。
  • <dependency>要素の子リストはdependency です。POM の基礎。
  • <build>要素は、プロジェクトのディレクトリ構造の宣言やプラグインの管理などを処理します。

プラグインを使う

Maven には、ビルドとレポートという 2 種類のプラグインがあります。

  • ビルド プラグインはビルド中に実行され、<build/>要素内で構成されます。
  • レポート プラグインはサイトの生成中に実行され、<reporting/>要素内で構成されます。

プラグインを使うことでコマンドにオプションのようなものが付きます。
デフォルトでは、「package」と「site」があるようです。

mvn package
mvn site

POMファイルにプラグインを追記します

pluginsタグの中につぎのようにコンパイラーブラグインを追記します。

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.10.1</version>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                    <compilerArgs>
                      <arg>-cp</arg>
                      <arg>C:\OpenCV\opencv\build\java\opencv-480.jar;C:\JavaFX\javafx-sdk-20.0.1\lib\javafx.fxml.jar;C:\JavaFX\javafx-sdk-20.0.1\lib\javafx.swing.jar;C:\JavaFX\javafx-sdk-20.0.1\lib\javafx.base.jar;C:\JavaFX\javafx-sdk-20.0.1\lib\javafx.swing.jar;C:\JavaFX\javafx-sdk-20.0.1\lib\javafx.controls.jar;C:\JavaFX\javafx-sdk-20.0.1\lib\javafx.graphics.jar;C:\OpenCV\opencv\build\java\x86</arg>
                    </compilerArgs>
                </configuration>
            </plugin>

次のようにコマンドをたたくことができます。

mvn compile

これで、コンパイルできます。
そして、JavaFXを起動したい場合は次のようにプラグインを追加します。
使用できるコマンドは次の通りです。

mvn javafx:run

プラグインのXML

                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.8</version>
                <executions>
                    <execution>
                        <!-- Default configuration for running with: mvn clean javafx:run -->
                        <id>default-cli</id>
                        <configuration>
                            <mainClass>src.main.java.cam.HelloCV</mainClass>
                            <launcher>app</launcher>
                            <jlinkZipName>app</jlinkZipName>
                            <jlinkImageName>app</jlinkImageName>
                            <noManPages>true</noManPages>
                            <stripDebug>true</stripDebug>
                            <noHeaderFiles>true</noHeaderFiles>
                            <options>
                                <option>-cp</option>
                                <option>C:\OpenCV\opencv\build\java\opencv-480.jar</option>
                                <option>-Djava.library.path="C:\OpenCV\opencv\build\java\x64"</option>
                            </options>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

ここでもポイントは、JavaFXとOpenCVを使いたかったので、プログラムを起動するときに次のこと行う必要がありました。

  1. クラスパスにopencv-480.jarを追加する
    -cp C:\OpenCV\opencv\build\java\opencv-480.jar
  2. OpenCVのライブラリ(WIndowsの時はDLL、ほかはSOファイル)のパスを追加
    -Djava.library.path="C:\OpenCV\opencv\build\java\x64"

上記のように、コマンドオプションをつけてやる必要がありました。
実行結果は下のようになりました。

https://www.youtube.com/watch?v=Qe_FEWF0f3g&list=PLXkBhlFfEXqURGqRl2HzJmF8DY9pMCcme

プラグイン要素内の必須要素

以下の要素が必須になる。

  1. groupId
  2. artifactId
  3. version

これらを下のように定義する、project要素がルート(根っこ)にあり、build要素内に、plugins要素→plugin要素を記述する。

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-myquery-plugin</artifactId>
        <version>1.0</version>
        <configuration>
          <url>http://www.foobar.com/query</url>
          <timeout>10</timeout>
          <options>
            <option>one</option>
            <option>two</option>
            <option>three</option>
          </options>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>

関連ページ一覧

IntelliJ IDEA

  1. IntelliJ IDEA 環境構築 〜インストールと起動〜
  2. IntelliJ IDEA Git〜Gitリポジトリからクローン〜
  3. IntelliJ IDEA 使い方〜Git接続 Java起動 etc〜
  4. IntelliJ IDEA Jarファイルを作る
  5. IntelliJ IDEA 使い方〜Maven Projectの作成〜
  6. IntelliJ IDEA 使い方〜Mavenでライブラリを追加する〜
  7. IntelliJ IDEA 使い方〜Javaのコンパイルレベル設定〜
  8. IntelliJ IDEA Gradleセットアップ〜コマンド入力部の表示〜
  9. IntelliJ IDEA Discord Botを作る〜Gradle環境のセットアップ〜

Java Discord

  1. IntelliJ IDEA Discord Botを作る〜Gradle環境のセットアップ〜
  2. Java Discord セットアップ〜Hello Discord〜
  3.  Java Discord ピンポン〜Discordプログラム〜
  4. Java Discord Listener実装〜コマンドを好きなだけ追加しよう〜

 

IntelliJ IDEA 使い方〜Mavenでライブラリを追加する〜

外部ライブラリ追加手順

  1. プロジェクトを開く

  2. Project Structureを開く

  3. 「Module」を選択する

  4. 「Dependency」タブを開く(右側のタブ)

  5. 右側の下にある「+」ボタンを押下

  6. 下にある「Module Dependency」をクリックする

ここから、ツイするライブラリファイル(XXX.jar)などを選択します。

Java Basic network 〜googleの検索画面へアクセス〜

イントロダクション

前回までで、コマンドの入力→結果の表示 + コマンド実行クラス追加の作成を行いました。

今回は、画面から少し離れて、googleの検索画面を開く所を実装します。

設計:クローリング方法

以前、クローリング処理をどのようにやるか?を調べました。

その時に示した手順をJavaのプログラムで実行しようと思います。

以下の手順になります。

  1. Googleの検索テキストボックスに文字列を入力する
  2. 適当なサイトの中身を読み記載内容を自分の中でまとめます。
  3. まとめた内容から理解します。
    ※「理解する」というのが抽象的ですので「〜はXXXをする○○○である」というふうに情報を
      整理することを指し示す事とします。

上の手順は、人間がやるときの手順になるのでプログラムが実行するときの手順に修正します。

  1. Googleの検索画面にアクセスする
  2. Googleの検索画面に検索キーワードを入力する
  3. Googleの検索画面の検索ボタンを押下する
  4. 検索した結果のURLリストからHTMLを取得する
  5. 取得したHTMLよりページの解析を行う
  6. 解析した結果をまとめる(人間が理解できるようにまとめる)

以上のような手順になります。

実装すること

まずは、上記の「1. Googleの検索画面にアクセス」を実装しようと思います。

<実行手順>
・コマンド画面より「acc」コマンドを入力してGoogle画面にアクセスする

まずはここからですので。。。

*コマンド入力に関してはこちらを参照してください

作成するもの

前回まで作成した状態では、以下の手順でコマンドクラスを追加できます。

  1. プロパティファイルに行を追加
  2. CommandIFを実装したクラスを追加

    早い話が。。。

    コマンドを追加してGoogleの検索画面にアクセスしよう!ということです。

    実装部分

    プロパティファイルにキーと値を追加

以下のようにクラスを追加します。

Google検索画面にアクセスする

ちょっと調べてみた所、スレイピング(クローリングと同じ)は規約違反になるようです。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13153706228

じゃ、合法的にやりましょう

世間では、「データサイエンス」なるものが流行っているのでBigデータ利用も増えてきています。(結構前から?) 2018/0701現在

というわけでBigデータから情報を取得する方向に切り替えて行います。

ちょっと調べて、チョチョイとは行かなそうなので次回にします。