将函数传递给另一个函数时的Tensorflow AttributeError

问题描述 投票:0回答:1

我是tensorflow的新手。以下部分代码抛出AttributeError:'NoneType'对象没有属性'dtype'。有人可以指出我做错了什么以及如何正确编码?

我意识到问题是当我试图最小化train_function中的“损失”时。我假设在交互式会话期间,s,batch_x_train和batch_y_train将被传递给'optimizer'的函数调用,它调用函数'binary_logloss',传入batch_y_train值。我知道如何在没有张量流的情况下完成这项工作,但是当涉及图表时我有点困惑。

input_X = tf.placeholder('float32', [None,64])
input_y = tf.placeholder('float32', [None,num_classes])

predicted_y = tf.sigmoid(tf.matmul(input_X, weights) + b)

def binary_logloss(true_y):

    if true_y ==1.:
        return tf.reduce_mean(tf.reduce_sum(-tf.log(predicted_y) , axis=1))
    elif true_y == 0.:
        return tf.reduce_mean(tf.reduce_sum(-tf.log(1-predicted_y) , axis=1))

def train_function(X, y):
    loss = binary_logloss(input_y)
    optimizer = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
    _, c = s.run([optimizer, loss], {input_X:X, input_y:y})
    return _, c

s.run(tf.global_variables_initializer())
for epoch in epochs:     
    _, c = train_function(batch_x_train, batch_y_train) 
python-3.x tensorflow
1个回答
0
投票

你必须像这样重构代码并实现一个批处理机制,我认为它应该执行。

input_X = tf.placeholder('float32', [None,64])
input_y = tf.placeholder('float32', [None,num_classes])

predicted_y = tf.sigmoid(tf.matmul(input_X, weights) + b)    

loss = tf.reduce_mean(-(input_y * tf.log(predicted_y) + (1 - input_y) * tf.log(1 - predicted_y)))

optimizer = tf.train.GradientDescentOptimizer(0.001).minimize(loss)

init = (tf.global_variables_initializer(), tf.local_variables_initializer())

with tf.Session() as s:
    s.run(init)
    s.run(tf.global_variables_initializer())
    for epoch in epochs:     
       # batch_x_train, batch_y_train = Batching code
       _, c = train_function(batch_x_train, batch_y_train) 
© www.soinside.com 2019 - 2024. All rights reserved.