python - keras - 使用 lambda 层时如何避免尺寸错误
问题描述
我在 tensorflow 上使用带有 keras 的 python 并尝试使用 lambda 层,并且一直出现相同的错误,我检查了模型的摘要,一切似乎都很好。该错误仅在训练时发生。
from keras.datasets import mnist
from keras.layers import Dense, Input, concatenate,subtract, Lambda
from keras.losses import binary_crossentropy
from keras.optimizers import SGD
(train_x, train_y), (test_x, test_y) = mnist.load_data()
train_x = (train_x / 255.0).reshape(-1, 28*28)
test_x = (test_x / 255.0).reshape(-1, 28*28)
inp1 = Input(shape=(28*28,))
inp2 = Input(shape=(28*28,))
l1 = Dense(100, activation="relu")
a1 = l1(inp1)
a2 = l1(inp2)
l2 = Dense(100, activation="relu")
b1 = l2(a1)
b2 = l2(a2)
output = Lambda(lambda inputs: inputs[0]-inputs[1], output_shape=(100,))([b1, b2])
model = Model([inp1, inp2], [output])
model.compile(loss=binary_crossentropy, optimizer=SGD())
y = train_y[:1]
model.fit([train_x[:1], train_x[:1]], y)
我收到这个错误
检查目标时出错:预期 lambda_13 的形状为 (100,) 但得到的数组的形状为 (1,)
在相同的数据上使用model.predict
时,它预测没有任何错误。这里有什么问题?谢谢
解决方案
问题是您期望模型以 (100,) 的形状进行预测,并且您正在尝试拟合具有 (1,) 形状的数据。在这里,如果您想使用当前的 y,则 output_shape=(100,) 应该为 1。
如果您想对输出形状为 的数字进行分类,还有一件事(1,)
。您还需要更改model.compile(loss=binary_crossentropy, optimizer=SGD())
为model.compile(loss=sparse_categorical_crossentropy, optimizer=SGD())
. 有关更多信息sparse_categorical_crossentropy
,您可以查看keras 文档。您可以在这里categorical_crossentropy
找到和之间的区别sparse_categorical_crossentropy
。
推荐阅读
- flutter - 如何在不使用插件的情况下使用联系人、相机、gps
- angular - 检查url angular中是否有#标签
- angular - 在订阅解决之前,是否有一个管道操作员会运行代码?例如:http 调用
- c - 带有子文件夹的多目标 makefile
- c++ - 使用 main 中的新作品创建动态数组的 C++ 代码,但不能作为单独的函数使用
- python - 获取'str'对象不支持python中的项目分配错误
- javascript - 使用 React Context 更新 reducer 中的子数组
- c# - iText7 阅读 CreateDate
- php - 如何根据范围进行选择?
- wai-aria - 可以在标题元素上使用 aria-label