Neural Network ? 1 にTensorBoardのモニタ解析を追記しておく。
今回は、name_scope()を用いて、Nameスペースを有効に設定しいたことで、グラフ構造が整理されて解りやすくなった。
隠れ層200ニューロンにアップ。
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 71 72 73 74 75 76 77 |
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 = 200 output_nodes = 10 with tf.name_scope('interface') as scope: step_var = tf.Variable(0, trainable=False) # 重み係数を変数として定義 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])) with tf.name_scope('layers') as scope: # レイヤー作成:活性化関数は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 with tf.name_scope('loss_func') as scope: # 損失関数 loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=output_layer, labels=label)) summary_op = tf.summary.scalar('loss', loss) with tf.name_scope('training') as scope: # 最適化関数 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, global_step=step_var) summary = tf.summary.merge_all() # セッション立ち上げ with tf.Session() as sess: writer = tf.summary.FileWriter("logs", graph=sess.graph) sess.run(tf.global_variables_initializer()) # エポックループ for epoch in range(num_epochs): # バッチループ for batch in range(num_batches): image_batch, label_batch = dataset.train.next_batch(batch_size) step = sess.run(step_var) #セッションを動かす:最適化関数にデータをフィード sess.run(optimizer, feed_dict={image: image_batch, label: label_batch}) summary_op2 = sess.run(summary_op, feed_dict={image: image_batch, label: label_batch}) writer.add_summary(summary_op2, global_step=step) # 成功率算定 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 |
Correct %: 93.58999729156494 |
今回は、name_scope()を用いて、Nameスペースを有効に設定しいたことで、グラフ構造が整理されて解りやすくなった。