簡體   English   中英

tensorflow GradientDescentOptimizer:運算輸入和計算的輸入梯度之間的形狀不兼容

[英]tensorflow GradientDescentOptimizer: Incompatible shapes between op input and calculated input gradient

在優化步驟之前,該模型運行良好。 但是,當我要優化模型時,出現錯誤消息:

運算輸入和計算的輸入梯度之間的形狀不兼容。 轉發操作:softmax_cross_entropy_with_logits_sg_12。 輸入索引:0。原始輸入形狀:(16,1)。 計算的輸入漸變形狀:(16,16)

以下是我的代碼。

import tensorflow as tf;  
batch_size = 16
size = 400
labels  = tf.placeholder(tf.int32, batch_size)
doc_encode  = tf.placeholder(tf.float32, [batch_size, size])

W1 = tf.Variable(np.random.rand(size, 100), dtype=tf.float32, name='W1')
b1 = tf.Variable(np.zeros((100)), dtype=tf.float32, name='b1')

W2 = tf.Variable(np.random.rand(100, 1),dtype=tf.float32, name='W2')
b2 = tf.Variable(np.zeros((1)), dtype=tf.float32, name='b2')

D1 = tf.nn.relu(tf.matmul(doc_encode, W1) + b1)
D2 = tf.nn.selu(tf.matmul(D1, W2) + b2)

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=D2))
optim = tf.train.GradientDescentOptimizer(0.01).minimize(cost, aggregation_method=tf.AggregationMethod.EXPERIMENTAL_TREE)
with tf.Session() as sess:  
    sess.run(tf.global_variables_initializer())
    _cost, _optim = sess.run([cost, optim], {labels:np.array([1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1]), doc_encode: np.random.rand(batch_size, size)})

更正以下內容。

第一,

將占位符輸入形狀更改為此

X = tf.placeholder(tf.int32, shape=[None,400]
Y = tf.placeholder(tf.float32, shape=[None,1]

為什么選擇“ 無”,因為這使您可以自由喂食任何尺寸的食物。 這是首選方法,因為在訓練時要使用微型批處理,而在預測或推斷時間時,通常將只喂一些東西。 將其標記為None(無),即可解決。

第二,

校正體重初始化,您輸入的是隨機值,它們也可能是負數。 始終建議使用較小的正值進行初始化。 (我看到您正在使用relu作為激活,對於負權重值,其Gradient為零,因此這些權重永遠不會在Gradient下降中更新,換句話說,這些都是無用的權重)

第三,

Logits是從W2*x + b2獲得的結果。 且該tf.nn.softmax_cross.....(..)自動應用了softmax激活。 因此,最后一層不需要SeLu。

暫無
暫無

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM