2017-05-16 57 views
0

我有一個以張量寫入的損失函數,其中得到y_in中的3個值和y_pred中的3個值。在Tensorflow中寫入Keras的移植損失函數導致AttributeError

僞代碼tensorflow損失:

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是結果來自網絡之前。然後在密集層的幫助下,它會減少到3個輸出。發生

以下錯誤:.compile功能之後發生

File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 910, in compile sample_weight, mask)

File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 447, in weighted ndim = K.ndim(score_array)

File "/usr/local/lib/python2.7/dist-packages/keras/backend/tensorflow_backend.py", line 479, in ndim dims = x.get_shape()._dims

AttributeError: 'tuple' object has no attribute 'get_shape'

所示出的回溯。

我有crossentropy損失試了一下,並沒有拋出任何錯誤

+0

my_loss()應該返回一個張量。不是元組。 – gidim

+0

謝謝,但是損失是由tf.reduce_mean計算的(參見編輯) - 所以它們應該是張量 - 或者我必須將它們全部放入一張張? – Kev1n91

+0

將losse與tf.stack結合在一起的確有竅門。你想把這個作爲一個答案,因爲你引導我進入正確的方向? – Kev1n91

回答

1

你的功能,my_loss()應該返回一個張量。不是元組。

您可以使用 tf.stack()將三張張量(loss1,loss2,loss3)堆疊成單張量。