【问题标题】:Can't the two different methods to add_loss in Keras/Tensorflow be used together?Keras/Tensorflow中add_loss这两种不同的方法不能一起使用吗?
【发布时间】:2020-02-07 02:16:47
【问题描述】:

我写了下面的代码通过自动编码器做一个简单的实验,我只想使用两个损失,第一个损失是输入的传统MSE损失和从AE的潜在向量重建的输出,而第二个损失是encoder和decoder中对称层的两个输出之间的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,代码可以运行,所以我认为Keras/Tensorflow中add_loss的两种方法不能简单地一起使用或者它可能有一些变化(也许问题来自小批量?) 请帮我!欢迎任何意见或建议! 非常感谢!

【问题讨论】:

  • 您的代码在这里完美运行。你确定这是“你的”代码还是你为了问而简化了它?问题似乎只是形状不匹配。
  • ??这真的是我的代码>_

标签: tensorflow keras autoencoder loss


【解决方案1】:

问题不是来自add_loss(),而是来自您的batch_size。您的输入数据是(400,128),但batch_size 是32。尝试将其更改为400 的因数,例如40 或20,它会起作用。

【讨论】:

  • 我根据您的建议更改了我的代码,代码可以工作,谢谢!但是我仍然有一个问题:如果样本数是质数并且很大(可能超过 5000),我应该如何运行代码?我认为如果batch_size太大(等于样本数)GPU的内存会溢出。
  • 这可能是特定于版本的错误。我向您保证,您发布的代码在这里可以完美运行,无需任何更改。
  • @FlightPanda24 把最后一批的样本去掉应该没问题。
  • @DanielMöller 你的 keras 版本是什么?我很好奇为什么 fit 方法没有像“keep_reminder”这样的参数或其他东西来标记我们是否应该保持提醒。
  • 什么是“keep_reminder”?余?通常它最后只运行一个较小的批次。这是 Keras 2.3.0
猜你喜欢
  • 2014-10-14
  • 2023-02-06
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 2011-11-11
  • 2018-01-26
  • 1970-01-01
  • 2020-05-02
相关资源
最近更新 更多