俺人〜OREGIN〜俺、バカだから人工知能に代わりに頑張ってもらうまでのお話

俺って、おバカさんなので、とっても優秀な人工知能を作って代わりに頑張ってもらうことにしました。世界の端っこでおバカな俺が夢の達成に向けてチマチマ頑張る、そんな小さなお話です。現在はG検定、E資格に合格し、KaggleやProbSpaceのコンペに参画しながら、Pythonや機械学習、統計学、Dockerなどの勉強中です。学習したことをブログにアウトプットすることで、自分の身に着けていきたいと思います。まだまだ道半ばですが、お時間がありましたら見て行ってください。

TensorFlowで機械学習に挑戦(Pythonによるスクレイピング&機械学習テクニック)

今回は、Dockerで構築したTensorFlowの環境で、機械学習(深層学習)に挑戦しました。 

今回も Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]の第4章を参考にさせていただきながら、取り組んでいます。 

 TensorFlowの環境構築は、前回の記事をご参照ください。

oregin-ai.hatenablog.com

また、Dockerの詳細を勉強したい方は、かめ@usdatascientistさんの「米国AI開発者がゼロから教えるDocker講座」が非常にわかりやすいので、おすすめです。

px.a8.net

 

では、振り返っていきたいと思います。

TensorFlowで機械学習に挑戦

1.全体像

コードは以下の通りで、「mnist-train.py」というファイルに保存しました。

import tensorflow as tf

# MNIST データセットを準備する
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# データを正規化する
x_train, x_test = x_train / 255.0, x_test / 255.0

#層を積み重ねてモデルを構築する
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

#訓練のためにオプティマイザと損失関数を設定する
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

#モデルを訓練してから検証する
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test,  y_test, verbose=2)

では、コードを順に振り返っていきます。

2.MNIST データセットを準備する

以前、SVM機械学習時にも利用した、MNISTのデータセットをkeras.datasetsから読み込みます。

mnist = tf.keras.datasets.mnist 

load_data()メソッドを使って、訓練データと、検証データに分割します。

(x_train, y_train), (x_test, y_test) = mnist.load_data()

3.データを正規化する

MNISTのデータは、0~255の輝度データなので、255.0で割ることで、0~1の不動点小数値に変換(正規化)します。

x_train, x_test = x_train / 255.0, x_test / 255.0 

 4.層を積み重ねてモデルを構築する

keras.modelsのSequentialメソッドを使って、モデルを構築します。

引数に、積み重ねる層(layers)をリスト型で受け渡すことで、深層学習のモデルが構築できます。

model = tf.keras.models.Sequential([

1層目のFlattenは、縦横28x28の2次元データを784個の1次元データに変換します。

  tf.keras.layers.Flatten(input_shape=(28, 28)),

2層目のDenseは、入力データに重みをかけて、128個の出力に変換します。出力は「relu」という関数で変換して出力します。

  tf.keras.layers.Dense(128, activation='relu'),

3層目のDoropoutは、学習時に出力をランダムに削ります。これは学習時に訓練データに特化した「過学習」にならないように、する対策になります。

  tf.keras.layers.Dropout(0.2),

4層目のDenseは、入力データに重みをかけて、10個の出力に変換します。この層は最後の出力となるので、0~9のどの数字だったかを判定するために「softmax」という関数で変換して出力します。0~9のどの手書き文字であったかを確率を表しています。

  tf.keras.layers.Dense(10, activation='softmax')
])

5.訓練のためにオプティマイザと損失関数を設定する

訓練を実施するにあたり、compileメソッドを使って、各種設定を実施します。

optimizerでモデルを学習する際に重みの更新をする手法(最適化手法)を指定します、今回は「adam」を指定します。

model.compile(optimizer='adam',

 optimizerについては、以下もご参照ください。

oregin-ai.hatenablog.com

 損失関数(loss)には、'sparse_categorical_crossentropy'を設定して、'accuracy'(精度)で評価します。

loss='sparse_categorical_crossentropy', metrics=['accuracy'])

6.モデルを訓練して、評価する

fitメソッドでモデルを訓練します。引数は、1つ目が説明変数、2つ目が目的変数、三つ目にエポック数(訓練データ全体を訓練する回数)を指定します。

model.fit(x_train, y_train, epochs=5) 

評価は、evaluateメソッドで行います。引数は、1つ目、2つ目は、fitと同様に検証データの説明変数と目的変数を渡します。三つ目のverboseは、進捗表示をOnにします。

model.evaluate(x_test, y_test, verbose=2)

6.コマンドラインから実行する。

先ほど作成したファイルを実行してみます。

python3 mnist-train.py

f:id:kanriyou_h004:20200704215407p:plain

図1.mnist-train.py実行結果

実行した結果、accuracy(精度、正解率)が、0.9782とかなり高い精度で分類するモデルとすることができました。

以前SVMにて分類した際には、accuracy(精度、正解率)が、0.88程度でしたので、結構精度があがったようです。

SVMでの画像分類については、以下をご参照ください。

oregin-ai.hatenablog.com

今回は、TensorFlowで実際に、機械学習(深層学習)を実施してきました。

深層学習って難しそうだなぁと思っていましたが、TensorFlowを使うことで、意外と簡単に構築できたのは、うれしかったです。

(実際の業務やコンペとかで使いこなせるようになるには、まだまだ修行が必要ですが・・・。)

 

 今後も、Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]で、スクレイピング機械学習開発に取り組んでいきたいと思います。

 

 

 【過去記事】

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】