Я пытаюсь разработать модель keras с несколькими входами. Мы работаем с изображениями математических узлов (128х128х3). Я создал модель, которая требует трех входных данных. Три входа будут
1). Невернутое изображение узла
2). Тот же узел, что и 1, но повернут вокруг оси Y на 90 градусов
3). Тот же узел, что и узел 1, но повернутый вокруг оси x на 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 изображений) имеет соответствующую метку со следующей структурой: первые 5 000 элементов списка = метка 0, вторые 5 000 элементов списка = метка 1, третьи 5 000 элементов списка = метка 2. Метки все One также горячо закодированы.
Любые предложения приветствуются.
Мой генератор данных основан на: https://stackoverflow.com/a/49405175/5432071
Мой код записной книжки Jupyter можно посмотреть здесь: https://uofstthomasmn-my.sharepoint.com/:u:/g/personal/ward0001_stthomas_edu/EcHhuXpXl1VJu8yKZaWRdKkBdwVrD6AEs3hd4Kuwk2Cl3g?e=tlQTGx
Для ссылки на записную книжку Jupyer вам нужно будет щелкнуть ссылку, а затем - загрузить ..., так как html-файл не будет отображаться на onedrive.
Подводя итог моему вопросу: что не так с моим генератором данных для моделей с несколькими входами?
Заранее спасибо.
@sdcbr Последний слой основной нейронной сети - это просто выход relu, поэтому я хочу, чтобы каждый из трех входов передавал изображение через нейронную сеть, три выхода relu были объединены в один тензор, а затем этот тензор передается в softmax слой классификации. Слой классификации softmax классифицирует только три класса. Каждый ввод - это 15 000 изображений: по 5 000 каждого из трех классов. Вот изображение модели: uofstthomasmn-my.sharepoint.com/:i:/g/personal/… Подскажите, поможет ли это вам понять?
Я понимаю вашу архитектуру, но не понимаю, почему вы объединяете и получаете несколько меток. Кажется, у вас есть только одна метка на кортеж из трех изображений, верно? Итак, ваш генератор должен выдавать что-то вроде [X1, X2, X3], Y, где Y имеет форму (batch_size, 1). Нет?
@sdcbr Это может быть потому, что я не понимаю, как работает ImageDataGenerator. Итак, в моем случае in1, in2, in3 имеют одинаковую метку. Поэтому, если я вызываю genX1 = gen.flow (in1, in1_label, 32) и genX2 = gen.flow (in2, in2_label, 32), а затем вызываю genX1.next () и genX2.next () ... будет genX1 .next () и genX2.next () имеют одинаковую метку? Или партии перемешиваются? Вы понимаете вопрос? Спасибо, кстати !!
Каков именно результат вашей модели? У вас один выход? Мое первое предположение будет заключаться в том, что вы объединяетесь по неправильной оси. См. docs.scipy.org/doc/numpy-1.14.0/reference/generated/…