我有一个训练数据,有1000行。我正在使用Tensorflow来训练这些数据。还试图将其分成32个大小的小批次。在训练数据时,我得到了下面提到的错误
InvalidArgumentError:不兼容的形状:1000vs 32{{node logistic_loss_1/mul}}]
相反,如果我不将我的训练数据分成小批量,或者使用大小为1000的单个小批量,代码就可以正常工作。
我已经将权重定义为tf.Variables并运行tensorflow会话。请参阅下面的代码
def sigmoid_cost(z,Y):
print("Entered Cost")
z = tf.squeeze(z)
Y = tf.cast(Y_train,tf.float64)
logits = tf.transpose(z)
labels = (Y)
print(logits.shape)
print(labels.shape)
return tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=labels,logits=logits))
def model(X_train, Y_train, X_test, Y_test, learning_rate = 0.0001,
num_epochs = 1500, minibatch_size = 32, print_cost = True):
hidden_layer = 4
m,n = X_train.shape
n_y = Y_train.shape[0]
X = tf.placeholder(tf.float64,shape=(None,n), name="X")
Y = tf.placeholder(tf.float64,shape=(None),name="Y")
parameters = init_params(n)
z4, parameters = fwd_model(X,parameters)
cost = sigmoid_cost(z4,Y)
num_minibatch = m/minibatch_size
print("Getting Minibatches")
num_minibatch = tf.cast(num_minibatch,tf.int32)
optimizer = tf.train.GradientDescentOptimizer(learning_rate = learning_rate).minimize(cost)
print("Gradient Defination Done")
init = tf.global_variables_initializer()
init_op = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
sess.run(init_op)
for epoch in range(0,num_epochs):
minibatches = []
minibatches = minibatch(X_train,Y_train,minibatch_size)
minibatch_cost = 0
for i in range (0,len(minibatches)):
(X_m,Y_m) = minibatches[i]
Y_m = np.squeeze(Y_m)
print("Minibatch %d X shape Y Shape ",i, X_m.shape,Y_m.shape)
_ , minibatch_cost = sess.run([optimizer, cost], feed_dict={X: X_m, Y: Y_m})
print("Mini Batch Cost is ",minibatch_cost)
epoch_cost = minibatch_cost/num_minibatch
if print_cost == True and epoch % 100 == 0:
print ("Cost after epoch %i: %f" % (epoch, epoch_cost))
print(epoch_cost)由于某些原因,在运行成本函数时,X或Y批的大小被认为是32、100,反之亦然。任何帮助都将不胜感激。
发布于 2019-07-31 21:32:50
我认为你得到上面的错误是因为sigmoid_cost函数中的Y = tf.cast(Y_train, tf.float64)行。这里,Y_train有1000行,但是损失函数期望的是32(这是您的批处理大小)。
应该是Y = tf.cast(Y, tf.float64)。实际上,这里不需要强制转换数据类型,因为Y已经是tf.float64类型。检查下面的行:
Y = tf.placeholder(tf.float64,shape=(None),name="Y")这就是为什么,当您使用大小为1000(完整Y_train数据)的单个小批处理时,您的代码工作得很好。
https://stackoverflow.com/questions/57289860
复制相似问题