首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行成本sigmoid成本函数时出错

运行成本sigmoid成本函数时出错
EN

Stack Overflow用户
提问于 2019-07-31 19:36:44
回答 1查看 34关注 0票数 0

我有一个训练数据,有1000行。我正在使用Tensorflow来训练这些数据。还试图将其分成32个大小的小批次。在训练数据时,我得到了下面提到的错误

InvalidArgumentError:不兼容的形状:1000vs 32{{node logistic_loss_1/mul}}]

相反,如果我不将我的训练数据分成小批量,或者使用大小为1000的单个小批量,代码就可以正常工作。

我已经将权重定义为tf.Variables并运行tensorflow会话。请参阅下面的代码

代码语言:javascript
复制
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,反之亦然。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2019-07-31 21:32:50

我认为你得到上面的错误是因为sigmoid_cost函数中的Y = tf.cast(Y_train, tf.float64)行。这里,Y_train1000行,但是损失函数期望的是32(这是您的批处理大小)。

应该是Y = tf.cast(Y, tf.float64)。实际上,这里不需要强制转换数据类型,因为Y已经是tf.float64类型。检查下面的行:

代码语言:javascript
复制
Y = tf.placeholder(tf.float64,shape=(None),name="Y")

这就是为什么,当您使用大小为1000(完整Y_train数据)的单个小批处理时,您的代码工作得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57289860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档