簡體   English   中英

尺寸必須相等,但對於輸入形狀為[?,28,28,64],[3,3,1,64]的'Conv2D_13'(op:'Conv2D'),尺寸應為64和1

[英]Dimensions must be equal, but are 64 and 1 for 'Conv2D_13' (op: 'Conv2D') with input shapes: [?,28,28,64], [3,3,1,64]

我正在使用cnn在kaggle中進行數據識別。 我收到此錯誤:

尺寸必須相等,但對於具有輸入形狀的“Conv2D_13”(op:'Conv2D'),尺寸必須為64和1:[?,28,28,64],[3,3,1,64]。

我不知道為什么和輸出形狀不同於我的#符號。 例如,我認為它應該是(26,26,24),但結果實際上是(?,28,28,64)。 如果你知道的話。 請告訴我。 謝謝!

我的代碼是:

X=tf.placeholder(tf.float32,(None,28,28,1),"X")
y=tf.placeholder(tf.int32,(None,10),"y")

#conv1
filter1=tf.Variable(tf.truncated_normal((3,3,1,64)))
x=tf.nn.relu(tf.nn.conv2d(X,filter1,strides[1,1,1,1],padding="SAME"),name='relu_1') 
#(26,26,24)
print(x.shape) #(?, 28, 28, 64) 
filter2=tf.Variable(tf.truncated_normal((3,3,1,64)))
x=tf.nn.relu(tf.nn.conv2d(x,filter2,strides[1,1,1,1],padding="SAME"),name='relu_2') 
#(24,24,64)
x = tf.nn.max_pool(x, ksize=[1,2,2,1], strides=[1,2,2,1],padding="VALID") 
#(12,12,64)
filter3=tf.Variable(tf.truncated_normal((3,3,1,128)))
x=tf.nn.relu(tf.nn.conv2d(x,filter3,strides=[1,1,1,1],padding="SAME"),name='relu_3') 
#(10,10,128)
filter4=tf.Variable(tf.truncated_normal((3,3,1,128)))
x=tf.nn.relu(tf.nn.conv2d(x,filter4,strides=[1,1,1,1],padding="SAME"),name='relu_4')
#(8,8,128)
x = tf.nn.max_pool(x, ksize=[1,2,2,1], strides=[1,2,2,1],padding="VALID")                 
#(4,4,128)
fc_weight=tf.Variable(tf.truncated_normal((16*128,10)))
logits= tf.add(tf.matmul(x, fc_weight), name = 'logits')
y_proba=tf.nn.softmax(logits)

#cost
xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y,logits=logits)
loss = tf.reduce_mean(xentropy, name="loss")

#optimizer
lr = tf.placeholder(dtype=tf.float32, name="lr")
optimizer = tf.train.AdamOptimizer(lr)
training_op = optimizer.minimize(loss)

#evaluation
correct = tf.nn.in_top_k(logits, y, 1)
accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))

def shuffle_batch(X, y, batch_size):
    rnd_idx = np.random.permutation(len(X))
    n_batches = len(X) // batch_size
    for batch_idx in np.array_split(rnd_idx, n_batches):
        X_batch, y_batch = X[batch_idx], y[batch_idx]
        yield X_batch, y_batch

n_epochs = 5
batch_size = 68

init = tf.global_variables_initializer()
with tf.Session() as sess:
    init.run()
    for epoch in range(n_epochs):
        for X_batch, y_batch in shuffle_batch(X_train, y_train, batch_size):
            sess.run(training_op, feed_dict={X: X_batch, y: y_batch})
        accuracy_val = accuracy.eval(feed_dict={X: X_valid, y: y_valid})
        print(epoch, "Validation accuracy:", accuracy_val)

我知道原因。 因為padding =“ SAME”所以形狀不變。 我設置的過濾器形狀丟失了。 例如:filter1 s shape is (3,3,1,64). filter2 s shape is (3,3,1,64). filter2的形狀是(3,3,64,64)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 尺寸必須相等,但對於輸入形狀為[?,24,24,1],[5,5,64,64]的'Conv2D_1'(op:'Conv2D'),尺寸應為1和64 尺寸必須相等,但對於輸入形狀為[?,7,7,64],[5,5,32,64]的'Conv2D_2'(op:'Conv2D'),尺寸必須為64和32 尺寸必須相等,但對於輸入形狀為[2,2,2,1],[1、2、1]的“ Conv2D”(操作:“ Conv2D”),尺寸應為1和2 ValueError:尺寸必須相等,但對於具有輸入形狀的'Conv2D'(op:'Conv2D'),尺寸必須為1和3:[1,400,400,1],[1,3,3,1] Keras-輸入尺寸為[?,4,80,64],[5,5,64,64]的'conv2d_5 / convolution'(op:'Conv2D')的4中減去5引起的負尺寸大小 負維度大小由 2 減去 5 導致的 'conv2d_4/convolution' (op: 'Conv2D') 輸入形狀:[?,5,2,64], [5,5,64,64] RuntimeError:預期 3D(未批處理)或 4D(批處理)輸入到 conv2d,但輸入的大小為:[64, 2] ValueError:尺寸必須相等,但輸入形狀為[?,64],[4 ,?]的'MatMul'(op:'MatMul')的尺寸必須為64和4 conv2d 層的輸入 0 與層不兼容:輸入形狀的預期軸 -1 具有值 1,但接收到形狀為 [None, 64, 64, 3] 的輸入 ValueError:層“conv2d”的輸入 0 與層不兼容:預期 min_ndim=4,發現 ndim=3。 收到的完整形狀:(28、28、1)
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM