前提・実現したいこと
https://teratail.com/questions/234773#reply-341948
のプログラムがうっごいた後の発展になるのですが、
tensorflowの隠し層をもう1層増やそうとしています(2層から3層に)
2層で動いたプログラムは上記urlの回答部分に乗せています(文字制限のため)
発生している問題・エラーメッセージ
html
1 2Traceback (most recent call last): 3 File "C:\Users?????\Anaconda3\envs\opencvtest001\lib\site-packages\tensorflow_core\python\client\session.py", line 1365, in _do_call 4 return fn(*args) 5 File "C:\Users?????\Anaconda3\envs\opencvtest001\lib\site-packages\tensorflow_core\python\client\session.py", line 1350, in _run_fn 6 target_list, run_metadata) 7 File "C:\Users?????\Anaconda3\envs\opencvtest001\lib\site-packages\tensorflow_core\python\client\session.py", line 1443, in _call_tf_sessionrun 8 run_metadata) 9tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [15,2] vs. [30,2] 10 [[{{node mul}}]] 11 12During handling of the above exception, another exception occurred: 13 14Traceback (most recent call last): 15 File "C:\Users?????\Anaconda3\envs\opencvtest001\testmain03.py", line 303, in <module> 16 keep_prob: 0.5}) 17 File "C:\Users?????\Anaconda3\envs\opencvtest001\lib\site-packages\tensorflow_core\python\client\session.py", line 956, in run 18 run_metadata_ptr) 19 File "C:\Users?????\Anaconda3\envs\opencvtest001\lib\site-packages\tensorflow_core\python\client\session.py", line 1180, in _run 20 feed_dict_tensor, options, run_metadata) 21 File "C:\Users?????\Anaconda3\envs\opencvtest001\lib\site-packages\tensorflow_core\python\client\session.py", line 1359, in _do_run 22 run_metadata) 23 File "C:\Users?????\Anaconda3\envs\opencvtest001\lib\site-packages\tensorflow_core\python\client\session.py", line 1384, in _do_call 24 raise type(e)(node_def, op, message) 25tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [15,2] vs. [30,2] 26 [[node mul (defined at \lib\site-packages\tensorflow_core\python\framework\ops.py:1751) ]] 27 28Original stack trace for 'mul': 29 File "\testmain03.py", line 270, in <module> 30 loss_value = loss(logits, labels_placeholder) 31 File "\testmain03.py", line 170, in loss 32 cross_entropy = -tf.reduce_sum(labels*tf.log(tf.clip_by_value(logits,1e-10,1.0))) 33 File "\lib\site-packages\tensorflow_core\python\ops\math_ops.py", line 899, in binary_op_wrapper 34 return func(x, y, name=name) 35 File "\lib\site-packages\tensorflow_core\python\ops\math_ops.py", line 1206, in _mul_dispatch 36 return gen_math_ops.mul(x, y, name=name) 37 File "\lib\site-packages\tensorflow_core\python\ops\gen_math_ops.py", line 6700, in mul 38 "Mul", x=x, y=y, name=name) 39 File "\lib\site-packages\tensorflow_core\python\framework\op_def_library.py", line 793, in _apply_op_helper 40 op_def=op_def) 41 File "\lib\site-packages\tensorflow_core\python\util\deprecation.py", line 507, in new_func 42 return func(*args, **kwargs) 43 File "\lib\site-packages\tensorflow_core\python\framework\ops.py", line 3360, in create_op 44 attrs, op_def, compute_device) 45 File "\lib\site-packages\tensorflow_core\python\framework\ops.py", line 3429, in _create_op_internal 46 op_def=op_def) 47 File "\lib\site-packages\tensorflow_core\python\framework\ops.py", line 1751, in __init__ 48 self._traceback = tf_stack.extract_stack() 49
該当のソースコード
文字削減のために、参考urlにあるプログラムと被る部分は省略します
python
1 2# -*- coding: utf-8 -*- 3~~~~~~~~~~省略~~~~~~~~~~~~~ 4 5 # 畳み込み層第1レイヤーを作成 6 with tf.name_scope('conv1') as scope: 7 8 W_conv1 = weight_variable([5, 5, 3, 32]) 9 10 # バイアスの数値を代入 11 b_conv1 = bias_variable([32]) 12 13 h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) 14 15 # プーリング層1の作成 16 17 with tf.name_scope('pool1') as scope: 18 h_pool1 = max_pool_2x2(h_conv1) 19 20 # 畳み込み層第2レイヤーの作成 21 with tf.name_scope('conv2') as scope: 22 # 第一レイヤーでの出力を第2レイヤー入力にしてもう一度フィルタリング実施。 23 # 64個の特徴を検出する。inputが32なのはなんで?(教えて欲しい) 24 W_conv2 = weight_variable([5, 5, 32, 64]) 25 26 # バイアスの数値を代入(第一レイヤーと同じ) 27 b_conv2 = bias_variable([64]) 28 29 # 検出した特徴の整理(第一レイヤーと同じ) 30 h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) 31 32 # プーリング層2の作成(ブーリング層1と同じ) 33 with tf.name_scope('pool2') as scope: 34 h_pool2 = max_pool_2x2(h_conv2) 35 36#--------層の追加---------- 37 #畳み込み層第3レイヤーの作成 38 with tf.name_scope('conv3') as scope: 39 W_conv3 = weight_variable([5, 5, 64, 128]) 40 41 # バイアスの数値を代入(第一レイヤーと同じ) 42 b_conv3 = bias_variable([128]) 43 44 #全結合層のほうは7*7*128 の計算をしなければならない? 45 46 # 検出した特徴の整理(第一レイヤーと同じ) 47 h_conv3 = tf.nn.relu(conv2d(h_pool2, W_conv3) + b_conv3) 48 49 # プーリング層3の作成(ブーリング層1と同じ) 50 with tf.name_scope('pool3') as scope: 51 h_pool3 = max_pool_2x2(h_conv3) 52 53#-------------------------------- 54 # 全結合層1の作成 55 with tf.name_scope('fc1') as scope: 56 W_fc1 = weight_variable([7*7*128, 1024]) 57 b_fc1 = bias_variable([1024]) 58 # 画像の解析を結果をベクトルへ変換 59 h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*128]) 60 61 # 第一、第二と同じく、検出した特徴を活性化させている 62 h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) 63 64 # dropoutの設定 65 h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) 66 67 # 全結合層2の作成(読み出しレイヤー) 68 with tf.name_scope('fc2') as scope: 69 W_fc2 = weight_variable([1024, NUM_CLASSES]) 70 b_fc2 = bias_variable([NUM_CLASSES]) 71 72 # ソフトマックス関数による正規化(活性化関数) 73 # ここまでのニューラルネットワークの出力を各ラベルの確率へ変換する 74 75 with tf.name_scope('sigmoid') as scope: 76 y_conv=tf.nn.sigmoid(tf.matmul(h_fc1_drop, W_fc2) + b_fc2) 77 78 # 各ラベルの確率(のようなもの?)を返す 79 return y_conv 80 81# 予測結果と正解にどれくらい「誤差」があったかを算出する 82# logitsは計算結果: float - [batch_size, NUM_CLASSES] 83# labelsは正解ラベル: int32 - [batch_size, NUM_CLASSES] 84def loss(logits, labels): 85 # 交差エントロピーの計算 86 cross_entropy = -tf.reduce_sum(labels*tf.log(tf.clip_by_value(logits,1e-10,1.0))) 87 88 # TensorBoardで表示するよう指定 89 tf.summary.scalar("cross_entropy", cross_entropy) 90 91 # 誤差の率の値(cross_entropy)を返す 92 return cross_entropy 93 94# 誤差(loss)を元に誤差逆伝播を用いて設計した学習モデルを訓練する 95 96def training(loss, learning_keep_prob): 97 #この関数がその当たりの全てをやってくれる様 98 train_step = tf.train.AdamOptimizer(learning_keep_prob).minimize(loss) 99 return train_step 100 101# inferenceで学習モデルが出した予測結果の正解率を算出する 102def accuracy(logits, labels): 103 # 予測ラベルと正解ラベルが等しいか比べる。同じ値であればTrueが返される 104 105 correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(labels, 1)) 106 107 # booleanのcorrect_predictionをfloatに直して正解率の算出 108 # false:0,true:1に変換して計算する 109 accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) 110 111 # TensorBoardで表示する様設定 112 tf.summary.scalar("accuracy", accuracy) 113 return accuracy 114 115~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~~~~~ 116 117 118#TensorBoardのグラフに出力するスコープを指定 119with tf.Graph().as_default(): 120# 画像を入れるためのTensor(28*28*3(IMAGE_PIXELS)次元の画像が任意の枚数(None)分はいる) 121 images_placeholder = tf.placeholder("float", shape=(None, IMAGE_PIXELS)) 122 123 # ラベルを入れるためのTensor(3(NUM_CLASSES)次元のラベルが任意の枚数(None)分入る) 124 labels_placeholder = tf.placeholder("float", shape=(None, NUM_CLASSES)) 125 126 # dropout率を入れる仮のTensor 127 keep_prob = tf.placeholder("float") 128 129 # inference()を呼び出してモデルを作る 130 logits = inference(images_placeholder, keep_prob) 131 132 # loss()を呼び出して損失を計算 133 loss_value = loss(logits, labels_placeholder) 134 135 # training()を呼び出して訓練して学習モデルのパラメーターを調整する 136 train_op = training(loss_value, FLAGS.learning_keep_prob) 137 138 # 精度の計算 139 acc = accuracy(logits, labels_placeholder) 140 141 # 保存の準備 142 saver = tf.train.Saver() 143 144 # Sessionの作成(TensorFlowの計算は絶対Sessionの中でやらなきゃだめ) 145 sess = tf.Session() 146 147 # 変数の初期化(Sessionを開始したらまず初期化) 148 sess.run(tf.global_variables_initializer()) 149 150 # TensorBoard表示の設定(TensorBoardの宣言的な?) 151 summary_op = tf.summary.merge_all() 152 153 # train_dirでTensorBoardログを出力するpathを指定 154 summary_writer = tf.summary.FileWriter(FLAGS.train_dir, sess.graph) 155 156 # 実際にmax_stepの回数だけ訓練の実行していく 157 for step in range(FLAGS.max_steps): 158 for i in range(len(train_image)//FLAGS.batch_size): 159 # batch_size分の画像に対して訓練の実行 160 batch = FLAGS.batch_size*i 161 162 # feed_dictでplaceholderに入れるデータを指定する 163 sess.run(train_op, feed_dict={ 164 images_placeholder: train_image[batch:batch+FLAGS.batch_size], 165 labels_placeholder: train_label[batch:batch+FLAGS.batch_size], 166 keep_prob: 0.5}) 167 168 # 1step終わるたびに精度を計算する 169 train_accuracy = sess.run(acc, feed_dict={ 170 images_placeholder: train_image, 171 labels_placeholder: train_label, 172 keep_prob: 1.0}) 173 print("step %d, training accuracy %g" %(step, train_accuracy)) 174 175 # 1step終わるたびにTensorBoardに表示する値を追加する 176 summary_str = sess.run(summary_op, feed_dict={ 177 images_placeholder: train_image, 178 labels_placeholder: train_label, 179 keep_prob: 1.0}) 180 summary_writer.add_summary(summary_str, step) 181 182 # 訓練が終了したらテストデータに対する精度を表示する 183 print("test accuracy %g" %(sess.run(acc, feed_dict={ 184 images_placeholder: test_image, 185 labels_placeholder: test_label, 186 keep_prob: 1.0}))) 187 188 # データを学習して最終的に出来上がったモデルを保存 189 # "model.ckpt"は出力されるファイル名 190 save_path = saver.save(sess, "model3.ckpt")
試したこと
こんなのを追加すれば行けるかなあと思って書いた(追加した)コードはこちらです
python
1#--------層の追加---------- 2 #畳み込み層第3レイヤーの作成 3 with tf.name_scope('conv3') as scope: 4 W_conv3 = weight_variable([5, 5, 64, 128]) 5 6 # バイアスの数値を代入(第一レイヤーと同じ) 7 b_conv3 = bias_variable([128]) 8 9 #全結合層のほうは7*7*128 の計算をしなければならない? 10 11 # 検出した特徴の整理(第一レイヤーと同じ) 12 h_conv3 = tf.nn.relu(conv2d(h_pool2, W_conv3) + b_conv3) 13 14 # プーリング層3の作成(ブーリング層1と同じ) 15 with tf.name_scope('pool3') as scope: 16 h_pool3 = max_pool_2x2(h_conv3) 17 18#--------------------------------
それに伴って全結合層の7764を 77128 に変更しました
補足情報(FW/ツールのバージョンなど)
tensorflow 2.0.0
python 3.7.5
windows10
あなたの回答
tips
プレビュー