Ошибка передачи нескольких входов в модель Keras - PullRequest
0 голосов
/ 17 октября 2018

Я хочу обучить двоичный классификатор с использованием Keras, и мои данные обучения имеют форму (2000,2,128) и метки формы (2000,) как массивы Numpy.

Идея состоит в том, чтобы обучать так, чтобы вложения водин массив означает, что они либо одинаковые, либо разные, помечены соответственно 0 или 1.

Данные обучения выглядят следующим образом: [[[0 1 2 ....128][129.....256]][[1 2 3 ...128][9 9 3 5...]].....], а метки выглядят как [1 1 0 0 1 1 0 0..].

Воткод:

import keras
from keras.layers import Input, Dense

from keras.models import Model

frst_input = Input(shape=(128,), name='frst_input')
scnd_input = Input(shape=(128,),name='scnd_input')
x = keras.layers.concatenate([frst_input, scnd_input])
x = Dense(128, activation='relu')(x)
x=(Dense(1, activation='softmax'))(x)
model=Model(inputs=[frst_input, scnd_input], outputs=[x])
model.compile(optimizer='rmsprop', loss='binary_crossentropy',
              loss_weights=[ 0.2],metrics=['accuracy'])

Я получаю следующую ошибку при выполнении этого кода:

ValueError: Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 2 array(s), but instead got the following list of 1 arrays: [array([[[ 0.07124118, -0.02316936, -0.12737238, ...,  0.15822273,
      0.00129827, -0.02457245],
    [ 0.15869428, -0.0570458 , -0.10459555, ...,  0.0968155 ,
      0.0183982 , -0.077924...

Как я могу решить эту проблему?Правильный ли мой код для обучения классификатора с использованием двух входов для классификации?

1 Ответ

0 голосов
/ 17 октября 2018

Ну, у вас есть два варианта:

1) Измените данные тренировки на (2000, 128*2) и определите только один входной слой:

X_train = X_train.reshape(-1, 128*2)

inp = Input(shape=(128*2,))
x = Dense(128, activation='relu')(inp)
x = Dense(1, activation='sigmoid'))(x)
model=Model(inputs=[inp], outputs=[x])

2) Определите два входных слоя,как вы уже сделали, и передайте список из двух входных массивов при вызове метода fit:

# assuming X_train have a shape of `(2000, 2, 128)` as you suggested
model.fit([X_train[:,0], X_train[:,1]], y_train, ...)

Далее, так как вы выполняете здесь двоичную классификацию, вам нужно использоватьsigmoid в качестве активации последнего слоя (т. Е. Использование softmax в этом случае всегда будет выводить 1, поскольку softmax нормализует выходные данные так, что их сумма равна единице).

...