我在tensorflow上将python和keras一起使用,并尝试使用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
时,它会预测没有任何错误。这是什么问题?谢谢
答案 0 :(得分:2)
问题是您希望模型以(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 documentation。并且您可以找到here categorical_crossentropy
和sparse_categorical_crossentropy
之间的区别。