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

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

ただいまの
回答率

90.62%

  • Python

    7436questions

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

  • TensorFlow

    633questions

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,210

Sunshine96

score 3

今、cifar-10のデータをCNNを用いて学習させようとしているのですが、
この畳み込み層を構成して学習を実行sルトTensorFlowの中でエラーが発生しました。
意味のわかる方、回答お願いします。

# 前データ処理関連
import pickle
import numpy as np
# データセットのダウンロード
dtype = 'float16'
def unpickle(file):
    import pickle 
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='bytes')
    return dict 
batch_name = { 1: "data_batch_1", 2:"data_batch_2", 3: "data_batch_3", 4: "data_batch_4", 5: "data_batch_5"}
A = []
for (a,b) in batch_name.items():
    tmp = unpickle("cifar-10-batches-py/{}".format(b))
    A.append(tmp)
tmp = unpickle("cifar-10-batches-py/test_batch")
X_test, Y_test = np.array(tmp[b'data'], dtype=dtype), np.array(tmp[b'labels'], dtype=dtype)
Y = np.array([])
X = np.array([[]])
for i in range(5):
    if i == 0:
        X = np.array(A[i][b'data'], dtype=dtype)
        Y = np.array(A[i][b'labels'], dtype=dtype)
    else:
        X = np.append(X, np.array(A[i][b'data'], dtype=dtype), axis=0)
        Y = np.append(Y, np.array(A[i][b'labels'], dtype=dtype))
# データセットの整理
X_image = X.reshape(-1, 3, 1024).copy()
X_max = np.amax(X_image, axis=2, keepdims=True)
X_min = np.amin(X_image, axis=2, keepdims=True)
X_mean = X_image.mean(axis=2, dtype=dtype, keepdims=True)
X_image_st = (X_image - X_mean)/(X_max-X_min)
# testデータの方も同様の操作を行う
X_test_image = X_test.reshape(-1, 3, 1024).copy()
X_test_max = np.amax(X_test_image, axis=2, keepdims=True)
X_test_min = np.amin(X_test_image, axis=2, keepdims=True)
X_test_mean = X_test_image.mean(axis=2, dtype=dtype, keepdims=True)
X_test_image_st = (X_test_image - X_test_mean)/(X_test_max-X_test_min)
# RGBの順番にデータが並ぶように結合を直す(ここは勘違い
# の可能性があります)
X_image_st2 = X_image_st.reshape(-1, 3, 1024,1)
X_train = np.concatenate((X_image_st2[:,0], X_image_st2[:,1], X_image_st2[:, 2]), axis=2)
X_test_image_st2 = X_test_image_st.reshape(-1,3, 1024,1)
X_test = np.concatenate((X_test_image_st2[:,0], X_test_image_st2[:,1], X_test_image_st2[:, 2]), axis=2)

X_train = X_train.reshape(-1, 1024, 3)
X_test = X_test.reshape(-1, 1024, 3)
# ラベルデータの前準備(0~9の値からそのインデックスが1になる
# ような2次元配列を生成する
Y_test2 = np.zeros((10000, 10))
Y_train = np.zeros((50000, 10))
for i in range(10000):
    Y_test2[i, int(Y_test[i])] = 1
for i in range(50000):
    Y_train[i, int(Y[i])] = 1

import tensorflow as tf
x = tf.placeholder(tf.half, shape=[None, 1024, 3])
x_image = tf.reshape(x, [-1, 32, 32, 3]) # バッチ数、縦、横、チャンネル数
y_ = tf.placeholder(tf.half, shape=[None, 10])
# 1段目の畳み込み層フィルター
num_filters1 = 32
W_conv1 = tf.Variable(tf.truncated_normal([3, 3, 3, num_filters1], stddev=0.1, dtype=tf.half))
h_conv1 = tf.nn.conv2d(x_image, W_conv1, strides=[1,1,1,1], padding='SAME')

b_conv1 = tf.Variable(tf.constant(0.1, shape=[num_filters1], dtype=tf.half))
h_conv1_cutoff = tf.nn.relu(h_conv1 + b_conv1)

h_pool1 = tf.nn.max_pool(h_conv1_cutoff, ksize=[1, 2,2,1], strides=[1, 2, 2, 1], padding='SAME')
# 2段目の畳み込み層フィルター
num_filters2 = 64
W_conv2 = tf.Variable(tf.truncated_normal([3, 3, num_filters1, num_filters2], dtype=tf.half))
h_conv2 = tf.nn.conv2d(h_pool1, W_conv2, strides=[1, 1, 1, 1], padding='SAME')

b_conv2 = tf.Variable(tf.constant(0.1, shape=[num_filters2], dtype=tf.half))
h_conv2_cutoff = tf.nn.relu(h_conv2 + b_conv2)

h_pool2 = tf.nn.max_pool(h_conv2_cutoff, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
# 3段目の畳み込み層フィルター
num_filters3 = 128
W_conv3 = tf.Variable(tf.truncated_normal([5, 5, num_filters2, num_filters3], dtype=tf.half))
h_conv3 = tf.nn.conv2d(h_pool2, W_conv3, strides= [1, 1, 1, 1], padding='SAME')

b_conv3 = tf.Variable(tf.constant(0.1, shape=[num_filters3], dtype=tf.half))
h_conv3_cutoff = tf.nn.relu(h_conv3 + b_conv3)

h_pool3 = tf.nn.max_pool(h_conv2_cutoff, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding = 'SAME')
# 全結合層、ドロップアウト層、ソフトマックス関数
h_pool3_flat = tf.reshape(h_pool3, [-1, 8*8*num_filters3])

num_units1 = 8*8*num_filters3
num_units2 = 1024

w2 = tf.Variable(tf.truncated_normal([num_units1, num_units2], dtype=tf.half))
b2 = tf.Variable(tf.constant(0.1, shape=[num_units2], dtype=tf.half))
hidden2 = tf.nn.relu(tf.matmul(h_pool3_flat, w2) + b2)

keep_prob = tf.placeholder(tf.half)
hidden2_drop = tf.nn.dropout(hidden2, keep_prob)

w0 = tf.Variable(tf.zeros([num_units2, 10], dtype=tf.half))
b0 = tf.Variable(tf.zeros([10], dtype=tf.half))
p = tf.nn.softmax(tf.matmul(hidden2_drop, w0) + b0)
# 誤差関数
t = tf.placeholder(tf.half, [None, 10])
loss = -tf.reduce_sum(t * tf.log(p))
train_step = tf.train.AdamOptimizer(0.0001).minimize(loss)
correct_prediction = tf.equal(tf.argmax(p, 1), tf.argmax(t, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.half))

sess = tf.Session()
sess.run(tf.global_variables_initializer())
# トレーニングの実行
i = 0
for _ in range(4000):
    i += 1 
    ra = np.random.randint(50000, size=(50))
    batch_xs, batch_ts = X_train[ra], Y_train[ra]
    sess.run(train_step, 
            feed_dict = {x: batch_xs, t:batch_ts, keep_prob:0.5})
    if i % 500 == 0:
        loss_vals, acc_vals = [], [] 
        for c in range(4):
            start = len(Y_test)/4*c
            end = len(Y_test)/4*(c+1)
            loss_val, acc_val = sess.run([loss, accuracy],
                                        feed_dict={x: X_test[start:end],
                                                  t: Y_test[start:end],
                                                  keep_prob:1.0})
            loss_vals.append(loss_val)
            acc_vals.append(acc_val)
        loss_val = np.sum(loss_vals)
        acc_val = np.mean(acc_vals)
        print('Step: %d, Loss: %f, Accuracy: %f'
             % (i, loss_val, acc_val))


この最後のトレーニングの実行をすると、以下のエラーが返されました。

InvalidArgumentError: Incompatible shapes: [50,10] vs. [25,10]
     [[Node: mul_1 = Mul[T=DT_HALF, _device="/job:localhost/replica:0/task:0/cpu:0"](_arg_Placeholder_8_0_2, Log_1)]]

InvalidArgumentError: Incompatible shapes: [50,10] vs. [25,10]
     [[Node: mul_1 = Mul[T=DT_HALF, _device="/job:localhost/replica:0/task:0/cpu:0"](_arg_Placeholder_8_0_2, Log_1)]]
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2017/09/21 19:08

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

    キャンセル

  • Sunshine96

    2017/09/21 20:39

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

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/09/22 19:13

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

    キャンセル

回答 2

checkベストアンサー

+2

とりあえず動くように

修正前 修正後
num_filters3 = 128  num_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/23 20:35

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    7436questions

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

  • TensorFlow

    633questions