
今、cifar-10のデータをCNNを用いて学習させようとしているのですが、
この畳み込み層を構成して学習を実行sルトTensorFlowの中でエラーが発生しました。
意味のわかる方、回答お願いします。
python
1# 前データ処理関連 2import pickle 3import numpy as np 4# データセットのダウンロード 5dtype = 'float16' 6def unpickle(file): 7 import pickle 8 with open(file, 'rb') as fo: 9 dict = pickle.load(fo, encoding='bytes') 10 return dict 11batch_name = { 1: "data_batch_1", 2:"data_batch_2", 3: "data_batch_3", 4: "data_batch_4", 5: "data_batch_5"} 12A = [] 13for (a,b) in batch_name.items(): 14 tmp = unpickle("cifar-10-batches-py/{}".format(b)) 15 A.append(tmp) 16tmp = unpickle("cifar-10-batches-py/test_batch") 17X_test, Y_test = np.array(tmp[b'data'], dtype=dtype), np.array(tmp[b'labels'], dtype=dtype) 18Y = np.array([]) 19X = np.array([[]]) 20for i in range(5): 21 if i == 0: 22 X = np.array(A[i][b'data'], dtype=dtype) 23 Y = np.array(A[i][b'labels'], dtype=dtype) 24 else: 25 X = np.append(X, np.array(A[i][b'data'], dtype=dtype), axis=0) 26 Y = np.append(Y, np.array(A[i][b'labels'], dtype=dtype)) 27# データセットの整理 28X_image = X.reshape(-1, 3, 1024).copy() 29X_max = np.amax(X_image, axis=2, keepdims=True) 30X_min = np.amin(X_image, axis=2, keepdims=True) 31X_mean = X_image.mean(axis=2, dtype=dtype, keepdims=True) 32X_image_st = (X_image - X_mean)/(X_max-X_min) 33# testデータの方も同様の操作を行う 34X_test_image = X_test.reshape(-1, 3, 1024).copy() 35X_test_max = np.amax(X_test_image, axis=2, keepdims=True) 36X_test_min = np.amin(X_test_image, axis=2, keepdims=True) 37X_test_mean = X_test_image.mean(axis=2, dtype=dtype, keepdims=True) 38X_test_image_st = (X_test_image - X_test_mean)/(X_test_max-X_test_min) 39# RGBの順番にデータが並ぶように結合を直す(ここは勘違い 40# の可能性があります) 41X_image_st2 = X_image_st.reshape(-1, 3, 1024,1) 42X_train = np.concatenate((X_image_st2[:,0], X_image_st2[:,1], X_image_st2[:, 2]), axis=2) 43X_test_image_st2 = X_test_image_st.reshape(-1,3, 1024,1) 44X_test = np.concatenate((X_test_image_st2[:,0], X_test_image_st2[:,1], X_test_image_st2[:, 2]), axis=2) 45 46X_train = X_train.reshape(-1, 1024, 3) 47X_test = X_test.reshape(-1, 1024, 3) 48# ラベルデータの前準備(0~9の値からそのインデックスが1になる 49# ような2次元配列を生成する 50Y_test2 = np.zeros((10000, 10)) 51Y_train = np.zeros((50000, 10)) 52for i in range(10000): 53 Y_test2[i, int(Y_test[i])] = 1 54for i in range(50000): 55 Y_train[i, int(Y[i])] = 1 56 57import tensorflow as tf 58x = tf.placeholder(tf.half, shape=[None, 1024, 3]) 59x_image = tf.reshape(x, [-1, 32, 32, 3]) # バッチ数、縦、横、チャンネル数 60y_ = tf.placeholder(tf.half, shape=[None, 10]) 61# 1段目の畳み込み層フィルター 62num_filters1 = 32 63W_conv1 = tf.Variable(tf.truncated_normal([3, 3, 3, num_filters1], stddev=0.1, dtype=tf.half)) 64h_conv1 = tf.nn.conv2d(x_image, W_conv1, strides=[1,1,1,1], padding='SAME') 65 66b_conv1 = tf.Variable(tf.constant(0.1, shape=[num_filters1], dtype=tf.half)) 67h_conv1_cutoff = tf.nn.relu(h_conv1 + b_conv1) 68 69h_pool1 = tf.nn.max_pool(h_conv1_cutoff, ksize=[1, 2,2,1], strides=[1, 2, 2, 1], padding='SAME') 70# 2段目の畳み込み層フィルター 71num_filters2 = 64 72W_conv2 = tf.Variable(tf.truncated_normal([3, 3, num_filters1, num_filters2], dtype=tf.half)) 73h_conv2 = tf.nn.conv2d(h_pool1, W_conv2, strides=[1, 1, 1, 1], padding='SAME') 74 75b_conv2 = tf.Variable(tf.constant(0.1, shape=[num_filters2], dtype=tf.half)) 76h_conv2_cutoff = tf.nn.relu(h_conv2 + b_conv2) 77 78h_pool2 = tf.nn.max_pool(h_conv2_cutoff, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') 79# 3段目の畳み込み層フィルター 80num_filters3 = 128 81W_conv3 = tf.Variable(tf.truncated_normal([5, 5, num_filters2, num_filters3], dtype=tf.half)) 82h_conv3 = tf.nn.conv2d(h_pool2, W_conv3, strides= [1, 1, 1, 1], padding='SAME') 83 84b_conv3 = tf.Variable(tf.constant(0.1, shape=[num_filters3], dtype=tf.half)) 85h_conv3_cutoff = tf.nn.relu(h_conv3 + b_conv3) 86 87h_pool3 = tf.nn.max_pool(h_conv2_cutoff, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding = 'SAME') 88# 全結合層、ドロップアウト層、ソフトマックス関数 89h_pool3_flat = tf.reshape(h_pool3, [-1, 8*8*num_filters3]) 90 91num_units1 = 8*8*num_filters3 92num_units2 = 1024 93 94w2 = tf.Variable(tf.truncated_normal([num_units1, num_units2], dtype=tf.half)) 95b2 = tf.Variable(tf.constant(0.1, shape=[num_units2], dtype=tf.half)) 96hidden2 = tf.nn.relu(tf.matmul(h_pool3_flat, w2) + b2) 97 98keep_prob = tf.placeholder(tf.half) 99hidden2_drop = tf.nn.dropout(hidden2, keep_prob) 100 101w0 = tf.Variable(tf.zeros([num_units2, 10], dtype=tf.half)) 102b0 = tf.Variable(tf.zeros([10], dtype=tf.half)) 103p = tf.nn.softmax(tf.matmul(hidden2_drop, w0) + b0) 104# 誤差関数 105t = tf.placeholder(tf.half, [None, 10]) 106loss = -tf.reduce_sum(t * tf.log(p)) 107train_step = tf.train.AdamOptimizer(0.0001).minimize(loss) 108correct_prediction = tf.equal(tf.argmax(p, 1), tf.argmax(t, 1)) 109accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.half)) 110 111sess = tf.Session() 112sess.run(tf.global_variables_initializer()) 113# トレーニングの実行 114i = 0 115for _ in range(4000): 116 i += 1 117 ra = np.random.randint(50000, size=(50)) 118 batch_xs, batch_ts = X_train[ra], Y_train[ra] 119 sess.run(train_step, 120 feed_dict = {x: batch_xs, t:batch_ts, keep_prob:0.5}) 121 if i % 500 == 0: 122 loss_vals, acc_vals = [], [] 123 for c in range(4): 124 start = len(Y_test)/4*c 125 end = len(Y_test)/4*(c+1) 126 loss_val, acc_val = sess.run([loss, accuracy], 127 feed_dict={x: X_test[start:end], 128 t: Y_test[start:end], 129 keep_prob:1.0}) 130 loss_vals.append(loss_val) 131 acc_vals.append(acc_val) 132 loss_val = np.sum(loss_vals) 133 acc_val = np.mean(acc_vals) 134 print('Step: %d, Loss: %f, Accuracy: %f' 135 % (i, loss_val, acc_val)) 136
この最後のトレーニングの実行をすると、以下のエラーが返されました。
python
1InvalidArgumentError: Incompatible shapes: [50,10] vs. [25,10] 2 [[Node: mul_1 = Mul[T=DT_HALF, _device="/job:localhost/replica:0/task:0/cpu:0"](_arg_Placeholder_8_0_2, Log_1)]] 3 4InvalidArgumentError: Incompatible shapes: [50,10] vs. [25,10] 5 [[Node: mul_1 = Mul[T=DT_HALF, _device="/job:localhost/replica:0/task:0/cpu:0"](_arg_Placeholder_8_0_2, Log_1)]]

行列の形(テンソル)が違うということだと思いますが、具体的に何行目のどこでエラー、というような通知はありませんか?
指摘ありがとうございます。確認して見たところ、エラーが出たのはこの部分のようです。これ以上遡った部分はよくわからない感じになってしまいました。

私の勉強のためにもこのコードを手元で試したいのですが、このほかにコードはありますか?もし元になったURLがあったら教えてほしいです。
元になっているコードは [TensorFlowで学ぶディープラーニング入門〜畳み込みニューラルネットワーク徹底解説〜」という本です!ここのMNISTをCNNで分析しているコードがあるのですがそれを元にいじってあります。ソースコード、全部記載しておきますね。

ありがとうございます。まだ確認中ですが、エラーは複数あるようです。片方はこのコードのどこで起きているのかの行数表示すらなく止まっているのでよく分かりません。その下にDuring handling of the above exception, another exception occurred:と表示され、loss = -tf.reduce_sum(t * tf.log(p))がエラーの根源だと表示されています。いずれにせよ行列の形が合っていないせいで計算が進めないために止まっているようです。
回答2件
あなたの回答
tips
プレビュー