質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

18288閲覧

TensorFlowのエラーメッセージの意味

Sunshine96

総合スコア11

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

2クリップ

投稿2017/09/20 10:04

編集2017/09/21 11:44

今、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)]]
退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/20 11:44 編集

行列の形(テンソル)が違うということだと思いますが、具体的に何行目のどこでエラー、というような通知はありませんか?
Sunshine96

2017/09/20 13:24

指摘ありがとうございます。確認して見たところ、エラーが出たのはこの部分のようです。これ以上遡った部分はよくわからない感じになってしまいました。
退会済みユーザー

退会済みユーザー

2017/09/21 10:08

私の勉強のためにもこのコードを手元で試したいのですが、このほかにコードはありますか?もし元になったURLがあったら教えてほしいです。
Sunshine96

2017/09/21 11:39

元になっているコードは [TensorFlowで学ぶディープラーニング入門〜畳み込みニューラルネットワーク徹底解説〜」という本です!ここのMNISTをCNNで分析しているコードがあるのですがそれを元にいじってあります。ソースコード、全部記載しておきますね。
退会済みユーザー

退会済みユーザー

2017/09/22 10:13

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

回答2

0

ベストアンサー

とりあえず動くように

修正前修正後
num_filters3 = 128num_filters3 = 64

※for _ in range(4000):の中で何週か動いたのを確認したのみですが…
(重いので3回しか回していませんが、多分回ったので回りきると思います)

上手く動かなかった理由

Tensorflowやニューラルネットワークという言葉を聞くとギョッとしますが、実際にやっていることは「行列の計算と微分・積分の延長先にあるもの(の化け物)で、臭いものにふたをしてくれているのがGoogle様のTensorflowだと、私は理解しています。正直、呈示されたエラーを見てもパッとしませんし、何か理解しきれていません。
この辺りの話は、別の投稿のもっと詳しい方のコメントを参考にしてください。

大事なことは、Incompatible shapes: [50,10] vs. [25,10]であって、これは、**「50x10の型枠に方眼紙を収めたいのに、25x10じゃ収まらないじゃないか!ぷんぷん」**とpython様がお怒りあそばされているということです。

50x10と25x10ですと、後半のx10は揃っているので、あとは50xと25xの部分を同じ大きさに揃えれば動きそうですね。あとは(本当は理解した上で書き換えるべきですが、みんな大好きブルートフォース)苦労と試行で怪しい部分を2倍にしたり1/2にしたりしてつついていくのみです。

後ろにある理論は私にはとても理解しきれませんが、層を追加する部分のコードはこんな感じで追加したり減らしたり修正していけそうですね。

こんな感じでいかがでしょうか?

投稿2017/09/22 11:58

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Sunshine96

2017/09/23 11:35

ありがとうございました!! 指摘していただいた場所を直したところ、とりあえず動くようにはなりました!! よくよく確認してみたら、元の画像サイズが32×32で、3回プーリング層で1/2ずつサイズダウンしていたので4×4にならなきゃいけなかったんですよね・・ これに気づいたら、num_units1 = 4*4*num_filters3 に直すことでも解決できることがわかりました!!
guest

0

引数を確認の事。(引数の型、また値)

投稿2017/09/20 10:36

MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問