Tensorflowを使ってシンプルなニューラルネットワークの構築について簡単な説明をしてみます。データにMNISTデータを使います。
まず、Tensorflowをインストールしましょう。1
MNISTデータは、各画像のラベルがその画像内の実際の値を示す手書き数字の集合である。各画像は28×28ピクセルで、この配列を7842のベクトルに平坦化します。
まず、Tensorflowをインポートし、MNISTのデータをロードします。
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist= input_data.read_data_sets('MNIST_data',one_hot=True)
モデルにデータを渡すために、まず28×28イメージデータ用と、結果格納用に(0〜9)に1つずつ、Tensorflowプレースホルダを作成します。
X = tf.placeholder(tf.float32, shape=[None, 784]) Y = tf.placeholder(tf.float32, shape=[None, 10])
次に「重み」と「バイアス」用に変数を作成します。
W = tf.Variable(tf.zeros([784, 10])) b = tf.Variable(tf.zeros([10]))
モデルを訓練するときに役立つ、いくつかのパラメータを定義します。
batch_size = 100 learning_rate = 0.01 training_epochs = 10
モデルを宣言します。隠れ層のないシンプルなニューラルネットワークです。
y = tf.nn.softmax(tf.matmul(X,W) + b)
モデルを訓練するときの重要なポイントは、コスト関数です。 予測yと目標値Yに基づいて、クロスエントロピー誤差関数を使用します。
cross_entropy = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(y), reduction_indices=[1]))
パラメータの精度を計算します。
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(Y,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
勾配降下法を使用してモデルを訓練します。
train_model = tf.train.GradientDescentOptimizer(learning_rate).minimize(cross_entropy)
Tensorflowでセッションを開始すると、モデルに関連付けられた操作が実行されます。
セッションを作成したら、まず、すべてのTensorflowの変数を初期化する必要があります。初期化するには、セッションのrun()関数を実行します。
run()関数で演算を実行し、訓練データのバッチを作成して反復処理し、最後にモデルの精度を出力します。
with tf.Session() as sess: sess.run(tf.initialize_all_variables()) for epoch in range(training_epochs) : batch_count = int(mnist.train.num_examples/batch_size) for i in range(batch_count): batch_x, batch_y = mnist.train.next_batch(batch_size) sess.run([train_model], feed_dict={X: batch_x, Y: batch_y}) print "Accuracy: ", accuracy.eval(session = sess ,feed_dict={X: mnist.test.images, Y: mnist.test.labels})
Accuracy: 0.9033
この単純なモデルでは、約90%の精度が出ました。
以下、全体のコードになります。
以前の記事「機械学習初心者のためのMNIST(翻訳)」に、Google本家サイトのドキュメントを翻訳していますので、詳細はそちらもご覧ください。