MNISTの手書き数字画像で、Neural Networkのアルゴリズムをチェックする。
入力層、隠れ層3層、出力層を含む5層構造であり、最も単純な方法をチェックする:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
import tensorflow as tf import tensorflow.contrib.learn as learn # MNISTデータの読み込み dataset = learn.datasets.mnist.read_data_sets('MNIST-data', one_hot=True) # MNISTデータと出力結果を収めるプレースホルダー設定 image = tf.placeholder(tf.float32, [None, 784]) #28x28行列要素を収める label = tf.placeholder(tf.float32, [None, 10]) #0〜9の数字ラベルを収める # レイヤーのノード数設定 hidden_nodes = 100 output_nodes = 10 # 重み係数を変数として定義 w0 = tf.Variable(tf.random_normal([784, hidden_nodes])) w1 = tf.Variable(tf.random_normal([hidden_nodes, hidden_nodes])) w2 = tf.Variable(tf.random_normal([hidden_nodes, hidden_nodes])) w3 = tf.Variable(tf.random_normal([hidden_nodes, output_nodes])) # バイアス値を変数として定義 b0 = tf.Variable(tf.random_normal([hidden_nodes])) b1 = tf.Variable(tf.random_normal([hidden_nodes])) b2 = tf.Variable(tf.random_normal([hidden_nodes])) b3 = tf.Variable(tf.random_normal([output_nodes])) # レイヤー作成:活性化関数はRelu layer_1 = tf.add(tf.matmul(image, w0), b0) layer_1 = tf.nn.relu(layer_1) layer_2 = tf.add(tf.matmul(layer_1, w1), b1) layer_2 = tf.nn.relu(layer_2) layer_3 = tf.add(tf.matmul(layer_2, w2), b2) layer_3 = tf.nn.relu(layer_3) output_layer = tf.matmul(layer_3, w3) + b3 # 損失関数 loss = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits( logits=output_layer, labels=label)) # 最適化関数 learning_rate = 0.01 num_epochs = 20 batch_size = 100 num_batches = int(dataset.train.num_examples/batch_size) optimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss) # 変数を初期化 init = tf.global_variables_initializer() # セッション立ち上げ with tf.Session() as sess: sess.run(init) # エポックループ for epoch in range(num_epochs): # バッチループ for batch in range(num_batches): image_batch, label_batch = dataset.train.next_batch(batch_size) #セッションを動かす:最適化関数にデータをフィード sess.run(optimizer, feed_dict={image: image_batch, label: label_batch}) # 成功率算定 prediction = tf.equal(tf.argmax(output_layer, 1), tf.argmax(label, 1)) success = tf.reduce_mean(tf.cast(prediction, tf.float32)) print('Correct %: ', 100 * sess.run(success, feed_dict={image: dataset.test.images, label: dataset.test.labels})) |
出力結果:
1 2 3 4 5 |
Extracting MNIST-data/train-images-idx3-ubyte.gz Extracting MNIST-data/train-labels-idx1-ubyte.gz Extracting MNIST-data/t10k-images-idx3-ubyte.gz Extracting MNIST-data/t10k-labels-idx1-ubyte.gz Correct %: 93.80999803543091 |
活性化関数とTensorFlowの関数群をチェックしておく。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Rectifier関数(ReLU): tf.nn.relu(input, name=None) Rectifier関数(ただし最大出力制限値=6):tf.nn.relu6(input, name=None) Concatenated ReLU関数: tf.nn.crelu(input, name=None) Exponential Linear Unit (eLU):tf.nn.elu(input, name=None) シグモイド関数:tf.nn.sigmoid(input, name=None) Tanh関数:tf.nn.tanh(input, name=None) Softsign関数:tf.nn.softsign(input, name=None) |
これ起点にもう少し最適化されたアルゴリズムをチェックしていく。。。。