import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data sess = tf.InteractiveSession() # 再現性の確保のために乱数シードを固定(数値は何でもよい) tf.set_random_seed(12345) # 入力データ # MNISTのワンホット表現での読み込み mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) # 0 入力画像 x = tf.placeholder(tf.float32, name='x') # 1 サイズ変更 x_1 = tf.reshape(x, [-1, 28, 28, 1])#?4階テンソルの1階目の-1(バッチサイズらしいが)とはなんぞや? # 2 畳み込み # ランダムカーネル k_0 = tf.Variable(tf.truncated_normal([4, 4, 1, 10], mean=0.0, stddev=0.1))#?最初の4,4はフィルターサイズ、次の1は出力チャンネル数、10はフィルターの枚数で合ってる? # 畳み込み x_2 = tf.nn.conv2d(x_1, k_0, strides=[1, 3, 3, 1], padding='VALID') # 3 活性化関数 x_3 = tf.nn.relu(x_2) # 4 プーリング x_4 = tf.nn.max_pool(x_3, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='VALID') # 5 サイズ変更 x_5 = tf.reshape(x_4, [-1, 160])#?最初の-1は例によってわからず、160はフィルターストライドとプーリングで28→4へと情報が圧縮された分で、4×4×10ということだと思う。? # 6 全結合 # 重みとバイアス w_1 = tf.Variable(tf.zeros([160, 40]))#?160はいいけど、40はどこから出てきた? b_1 = tf.Variable([0.1] * 40)#?サイズ40の1次元配列で合ってる? # 全結合 x_6 = tf.matmul(x_5, w_1) + b_1#?mutmul->テンソル積って何?出力のx_6はサイズ40の1次元配列? # 7 活性化関数 x_7 = tf.nn.relu(x_6) # 8 全結合 # 重みとバイアス w_2 = tf.Variable(tf.zeros([40, 10]))#?10はどこから出てきた? b_2 = tf.Variable([0.1] * 10) # 全結合 x_8 = tf.matmul(x_7, w_2) + b_2 # 9 確率化 y = tf.nn.softmax(x_8) # 10 損失関数の最小化 # 正解ラベル labels = tf.placeholder(tf.float32, name='labels') # 損失関数(交差エントロピー)と最適化処理(Adam) loss = -tf.reduce_sum(labels * tf.log(y))#?内積の和っぽいのを計算してるのか? optimizer = tf.train.AdamOptimizer().minimize(loss) # 11 精度検証 prediction_match = tf.equal(tf.argmax(y, axis=1), tf.argmax(labels, axis=1))#?argmaxとaxisって何?prediction_matchのデータ型ってサイズサンプルデータ数の1次元配列で合ってるの? accuracy = tf.reduce_mean(tf.cast(prediction_match, tf.float32), name='accuracy')#?meanってことは平均? # パラメーター # バッチサイズ BATCH_SIZE = 32 # 学習回数 NUM_TRAIN = 10_000 # 学習中の出力頻度 OUTPUT_BY = 500 # 学習の実行 sess.run(tf.global_variables_initializer()) for i in range(NUM_TRAIN): batch = mnist.train.next_batch(BATCH_SIZE) inout = {x: batch[0], labels: batch[1]}#?batch[0]が入力のベクトル、batch[1]が正解ラベルのベクトルだと思う。inoutって何だ? if i % OUTPUT_BY == 0: train_accuracy = accuracy.eval(feed_dict=inout)#?feed_dictって何? print('step {:d}, accuracy {:.2f}'.format(i, train_accuracy)) optimizer.run(feed_dict=inout) # テストデータによる精度検証 test_accuracy = accuracy.eval(feed_dict={x: mnist.test.images, labels: mnist.test.labels}) print('test accuracy {:.2f}'.format(test_accuracy))