Как исправить ValueError (x и y должны иметь одинаковую длину) при наличии нескольких выходов? - PullRequest
1 голос
/ 23 июня 2019

Я настраиваю модель, у которой есть вход изображения (130,130,1) и 3 выхода, каждый из которых содержит вектор (10,1), где softmax применяется индивидуально.

(Вдохновленный Дж. Гудфеллоу, Ярославом Булатовым, Джулианом Ибарзом, Сашей Арноуд и Виная Д. Шет. Распознавание многозначных чисел по снимкам с улицы с использованием глубоких сверточных нейронных сетей. CoRR, abs /1312.6082, 2013. URL http://arxiv.org/abs/1312.6082, к сожалению, они не опубликовали свою сеть).

input = keras.layers.Input(shape=(130,130, 1)
l0 = keras.layers.Conv2D(32, (5, 5), padding="same")(input)
[conv-blocks etc]
l12 = keras.layers.Flatten()(l11)
l13 = keras.layers.Dense(4096, activation="relu")(l12)
l14 = keras.layers.Dense(4096, activation="relu")(l13)
output1 = keras.layers.Dense(10, activation="softmax")(l14)
output2 = keras.layers.Dense(10, activation="softmax")(l14)
output3 = keras.layers.Dense(10, activation="softmax")(l14)

model = keras.models.Model(inputs=input, outputs=[output1, output2, output3])
model.compile(loss=['categorical_crossentropy', 'categorical_crossentropy', 
              'categorical_crossentropy'],
              loss_weights=[1., 1., 1.],
              optimizer=optimizer,
              metrics=['accuracy'])

train_generator = train_datagen.flow(x_train,
              [[y_train[:, 0, :], y_train[:, 1, :], y_train[:, 2, :]], 
              batch_size=batch_size)

Но тогда я получаю: ValueError: x (тензор изображений) и y (метки) должны иметь одинаковую длину.Найдено: x.shape = (1000, 130, 130, 1), y.shape = (3, 1000, 10)

Но если я изменю его на:

 [same as before]
 train_generator = train_datagen.flow(x_train,
              y_train, 
              batch_size=batch_size)

Тогда я получаю: ValueError: Ошибка при проверке цели модели: список массивов Numpy, которые вы передаете вашей модели, не соответствует размеру, ожидаемому моделью.Ожидается увидеть 3 массива (ов)

  • размерность (x_train) = (1000, 130, 130, 1)
    • , где каждое отдельное изображение (130, 130, 1) и имеется 1000 изображений
  • размерность (y_train) = (1000, 3, 10)

В документации указано, что так должно быть;

model = Model(inputs=[main_input, auxiliary_input], outputs= 
[main_output, auxiliary_output])

Однако я не знаю, как вы должны иметь одинаковую длину для выходов и входов?

1 Ответ

0 голосов
/ 24 июня 2019

Благодаря @ Djib2011.Когда я посмотрел примеры в документации для передачи их в словарь, я заметил, что во всех примерах используется model.fit(), а не model.fit_generator().

Поэтому я провел исследование и обнаружил, что все еще существует ошибка (открыто с 2016 года!) для ImageDataGenerator с одним входом и несколькими выходами .Грустная история.

Таким образом, решение состоит в том, чтобы использовать model.fit() вместо model.fit_generator().

...