keras - как избежать ошибки измерения при использовании лямбда-слоев - PullRequest
0 голосов
/ 13 мая 2019

Я использую python с кератами по тензорному потоку и пытаюсь использовать лямбда-слои, и продолжаю иметь ту же ошибку, я проверил сводку модели, и все это выглядит нормально. Ошибка возникает только при обучении.

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 для одних и тех же данных он предсказывает без ошибок. В чем здесь проблема? Спасибо

1 Ответ

2 голосов
/ 13 мая 2019

Проблема в том, что вы ожидаете, что модель будет предсказывать в форме (100,), и вы пытаетесь соответствовать данным, имеющим форму (1,). Здесь output_shape = (100,) должно быть 1, если вы хотите использовать текущий y.

И еще одна вещь, если вы хотите сделать классификацию чисел с выводом с формой (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.

...