Разве два разных метода add_loss в Keras / Tensorflow нельзя использовать вместе? - PullRequest
1 голос
/ 09 октября 2019

Я написал следующий код, чтобы провести простой эксперимент с помощью автоматического кодера, и я просто хочу использовать две потери, первая потеря - это традиционная потеря MSE на входе и выходе, которая восстанавливается из скрытого вектора AE,и вторая потеря - это потеря MSE между двумя выходами симметричных уровней в кодере и декодере, то есть, если AE имеет 5 уровней, я хочу добавить потери MSE между вторым уровнем и четвертым уровнем,поскольку они симметричны. Код здесь:

from time import time
import numpy as np
import random
from keras.models import Model
import keras.backend as K
from keras.engine.topology import Layer, InputSpec
from keras.layers import Dense, Input, GaussianNoise, Layer, Activation
from keras.models import Model
from keras.optimizers import SGD, Adam
from keras.utils.vis_utils import plot_model
from keras.callbacks import EarlyStopping

#build vae model

input_place = Input(shape=(128,))

e_layer1 = Dense(64,activation='relu')(input_place)
e_layer2 = Dense(32,activation='relu')(e_layer1)
hidden = Dense(16,activation='relu')(e_layer2)

d_layer1 = Dense(32,activation='relu')(hidden)
d_layer2 = Dense(64,activation='relu')(d_layer1)

output_place = Dense(128,activation='sigmoid')(d_layer2)

model = Model(inputs=input_place,outputs=output_place)

loss = K.mean(K.square(d_layer1 - e_layer2),axis = -1)

model.add_loss(loss)

model.compile(optimizer = 'adam',
              loss=['mse'],
              metrics=['accuracy'])

input_data = np.random.randn(400,128)

model.fit(input_data,
          input_data,
          batch_size = 32,
          epochs=5)

, но когда я запускаю этот код, возникает ошибка о

Epoch 1/5
 32/400 [=>............................] - ETA: 12s - loss: 1.6429 - acc: 0.0000e+00Traceback (most recent call last):

  File "<ipython-input-49-eac3a65824ec>", line 1, in <module>
    runfile('/Users/jishilun/Desktop/keras_loss_test.py', wdir='/Users/jishilun/Desktop')

  File "/anaconda3/lib/python3.7/site-packages/spyder_kernels/customize/spydercustomize.py", line 704, in runfile
    execfile(filename, namespace)

  File "/anaconda3/lib/python3.7/site-packages/spyder_kernels/customize/spydercustomize.py", line 108, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "/Users/jishilun/Desktop/keras_loss_test.py", line 49, in <module>
    epochs=5)

  File "/anaconda3/lib/python3.7/site-packages/keras/engine/training.py", line 1039, in fit
    validation_steps=validation_steps)

  File "/anaconda3/lib/python3.7/site-packages/keras/engine/training_arrays.py", line 204, in fit_loop
    callbacks.on_batch_end(batch_index, batch_logs)

  File "/anaconda3/lib/python3.7/site-packages/keras/callbacks.py", line 115, in on_batch_end
    callback.on_batch_end(batch, logs)

  File "/anaconda3/lib/python3.7/site-packages/keras/callbacks.py", line 236, in on_batch_end
    self.totals[k] += v * batch_size

ValueError: operands could not be broadcast together with shapes (32,) (16,) (32,) 

, и если я удаляю add_loss, код можетзапустить, так что я думаю, что два метода add_loss в Keras / Tensorflow нельзя просто использовать вместе или они могут иметь некоторые изменения (возможно, вопрос возникает из мини-пакета?) Пожалуйста, помогите мне! Любые советы или предложения будут приветствоваться! Большое спасибо!

1 Ответ

1 голос
/ 09 октября 2019

Проблема не от add_loss(), а от вашего batch_size. Ваши входные данные (400,128), но batch_size равно 32. Попробуйте изменить его на множитель 400, например 40 или 20, и он будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...