将Tensorflow中写入的移植丢失函数转换为Keras会导致AttributeError

时间:2017-05-16 13:46:18

标签: python tensorflow keras attributeerror

我有一个用tensorflow编写的损失函数,它在y_in中获得3个值,在y_pred中获得3个值。

张量流失的伪代码:

def my_loss(y_in,y_pred):
 with tf.name_scope('loss_scope'): 
    loss1 = tf.reduce_mean(...)
    loss2 = tf.reduce_mean(...)
    loss3 = tf.reduce_mean(...)
 return loss1,loss2,loss3

现在我想在我的keras模型中使用这种损失,我只想这样试试:

...
out = Dense(3,activation='linear')(con_res)
model = Model(inputs=[In1,In2],output = out)
model.compile(optimizer='rmsprop',loss=my_loss)

其中con_res是之前网络的结果。然后在Dense - Layer的帮助下,它将减少到3个输出。

发生以下错误:

  

文件   “/usr/local/lib/python2.7/dist-packages/keras/engine/training.py”   第910行,编译中       sample_weight,mask)

     

文件   “/usr/local/lib/python2.7/dist-packages/keras/engine/training.py”   第447行,加权       ndim = K.ndim(score_array)

     

文件   “/usr/local/lib/python2.7/dist-packages/keras/backend/tensorflow_backend.py”   第479行,在ndim       dims = x.get_shape()._ dims

     

AttributeError:'tuple'对象没有属性'get_shape'

显示的回溯发生在.compile函数之后。

我尝试了一个交叉熵丢失并没有抛出任何错误

1 个答案:

答案 0 :(得分:2)

你的函数my_loss()应该返回一个张量。不是一个元组。

您可以使用将三个张量(loss1,loss2,loss3)叠加到单个张量中 tf.stack()