Модель с несколькими входами keras: ожидается 2 массива, но вместо этого получен следующий список из 1 массива - PullRequest
0 голосов
/ 19 мая 2019

Я тренирую функциональную модель keras в наборе данных mnist. Существует слой, который требует 2 входных данных - традиционный входной тензор и текущую партию горячих закодированных меток. Я думаю, что я настроил свою модель для приема 2 входов, но я получаю:

ValueError: Ошибка при проверке модели: список массивов Numpy, передаваемых в вашу модель, не соответствует размеру, ожидаемому моделью. Ожидается увидеть 2 массива (ов), но вместо этого получен следующий список из 1 массива. [массив ([[[[0.], ...

В большинстве ответов предлагалось преобразовать входные данные в числовые массивы, но изображения и метки mnist по умолчанию являются числовыми массивами.

batch_size = 128
num_classes = 10
epochs = 1

# Mnist part

img_rows, img_cols = 28, 28

(x_train, y_train), (x_test, y_test) = mnist.load_data()

if K.image_data_format() == 'channels_first':
    x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
    x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
    input_shape = (1, img_rows, img_cols)
else:
    x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
    x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
    input_shape = (img_rows, img_cols, 1)

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255

y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

# Model part

images = Input(shape=input_shape, name='images_input')
labels = Input(shape=(num_classes,), name='labels_input')

x = Conv2D(32, kernel_size=(3, 3), activation='relu')(images)
x = Conv2D(64, (3, 3), activation='relu')(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Dropout(0.25)(x)
x = Flatten()(x)
x = Dense(128, activation='relu', name='features')(x)
x = Dropout(0.5)(x)
x = SomeLayerWith2Inputs()([x, labels])
output = Dense(num_classes, activation='softmax')(x)

model = Model(inputs=[images, labels], outputs=output)

model.compile(
    loss=keras.losses.categorical_crossentropy,
    optimizer=keras.optimizers.Adadelta(),
    metrics=['accuracy']
)

# x_train = <type 'numpy.ndarray'> (60000, 28, 28, 1)
# y_train = <type 'numpy.ndarray'> (60000, 10)
# x_test = <type 'numpy.ndarray'> (10000, 28, 28, 1)
# y_test = <type 'numpy.ndarray'> (10000, 10)

model.fit(
    [x_train, y_train],
    y_train,
    batch_size=batch_size,
    callbacks=[tensorboard],
    epochs=epochs,
    verbose=1,
    validation_data=([x_test, y_test], y_test)
)

Я тоже пытался сделать model.fit(x={'images_input': x_train, 'labels_input': y_train}, y=y_train), но это тоже не сработало.

Я использую Keras v2.2.4

1 Ответ

0 голосов
/ 26 мая 2019

Нашел проблему.Был также обратный вызов тензорной доски (не показан в исходном вопросе):

tensorboard = TensorBoard(
    batch_size=128,
    embeddings_freq=1,
    embeddings_layer_names=['features'],
    embeddings_metadata='metadata.tsv',
    embeddings_data=x_test
)

Аргумент embeddings_data должен быть [x_test, y_test].

...