Как правильно разработать генератор данных для модели Keras с несколькими входами?
Я пытаюсь разработать модель керас с несколькими входами. Мы работаем с изображениями (128x128x3) математических узлов. Я создал модель, которая принимает три входа. Три входа будут
1). Неповоротное изображение узла
2). Тот же узел, что и 1, но повернутый вокруг своей оси у на 90 градусов
3). Тот же узел, что и 1, но повернутый вокруг своей оси х на 90 градусов
Модель хороша и будет правильно скомпилирована. У меня проблема в том, что я использую fit_generator для обучения своей модели, и я не могу заставить свой генератор данных работать должным образом. Вот мой код для моего генератора данных:
def DataGen(in1,in2,in3,in1_label,in2_label,in3_label, batch_size):
in1 = np.array(in1)
in1 = np.reshape(in1, (in1.shape[0],128,128,3))
in2 = np.array(in2)
in2 = np.reshape(in2, (in2.shape[0],128,128,3))
in3 = np.array(in3)
in3 = np.reshape(in3, (in3.shape[0],128,128,3))
L = len(in1)
batch_start = 0
batch_end = batch_size
gen = ImageDataGenerator(rescale=1.0/255)
genX1 = gen.flow(in1, in1_label, batch_size=batch_size, seed=1)
genX2 = gen.flow(in2, in2_label, batch_size=batch_size, seed=1)
genX3 = gen.flow(in3, in3_label, batch_size=batch_size, seed=1)
#this line is just to make the generator infinite, keras needs that
while True:
limit = min(batch_end, L)
#in1
X1i = genX1.next()
print(X1i[0].shape)
#in2
X2i = genX2.next()
#in3
X3i = genX3.next()
#print(Y.shape)
#print(Y1.shape)
#print(Y2.shape)
label = np.concatenate([X1i[1],X2i[1],X3i[1]])
#print(label.shape)
#print(X1i[1].shape)
yield [X1i[0],X2i[0],X3i[0]],np.array(label) #a tuple with two numpy arrays with batch_size samples
batch_start += batch_size
batch_end += batch_size
if batch_start > L - batch_size:
batch_start = 0
batch_end = batch_size
Если я запускаю нейронную сеть с этим кодом, он генерирует следующее сообщение об ошибке:
Input arrays should have the same number of samples as target arrays. Found 30 input samples and 90 target samples.
Что заставляет меня думать, что я не должен объединять метку и просто возвращать список меток вместе со списком пакетов... Если я получу следующее
yield [X1i[0],X2i[0],X3i[0]],[X1i[1],X2i[1],X3i[1]]
Я получаю следующее сообщение об ошибке:
Error when checking model target: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 1 array(s), but instead got the following list of 3 arrays: [array([[0., 1., 0.],
[0., 0., 1.],
[1., 0., 0.],
[0., 1., 0.],
[1., 0., 0.],
[1., 0., 0.],
[0., 0., 1.],
[1., 0., 0.],
[0., 1., 0.],
[0....
Поэтому я не знаю, что делать, чтобы это исправить. Модель имеет 45 000 входных изображений, по 15 000 идут на каждый из трех входов. Модель также будет иметь 45 000 проверочных изображений, опять же, по 15 000 для каждого входа.
Каждый вход (набор из 15 000 изображений) имеет соответствующую метку со следующей структурой: первые 5000 элементов списка = метка 0, вторые 5000 элементов списка = метка 1, третьи 5000 элементов списка = метка 2. метки все одно горячее закодировано.
Любые предложения с благодарностью.
Мой генератор данных основан на: /questions/10488705/keras-kak-ispolzovat-fitgenerator-s-neskolkimi-vhodami/10488719#10488719
Код моего блокнота Jupyter можно посмотреть здесь: https://uofstthomasmn-my.sharepoint.com/:u:/g/personal/ward0001_stthomas_edu/EcHhuXpXl1VJu8yKZaWRdKkBdwVrD6AEs3hd4Kuwk2Cl3g?e=tlQTGx
Для ссылки на блокнот Jupyer вам нужно будет щелкнуть ссылку, а затем нажать кнопку загрузки..., поскольку HTML-файл не будет отображаться в onedrive.
Подводя итог, мой вопрос: что не так с моим генератором данных для моделей с несколькими входами?
Заранее спасибо.