Я относительно новичок в библиотеке Keras и наконец-то переключаюсь с последовательного на функциональный API для более сложных моделей.
Мои смешанные данные хранятся в следующем CSV:
image_url,attr1,attr2,attr3,attr4,attr5,class
images/image_1.png,1,2,3,4,5,class1
images/image_2.png,4,3,3,4,1,class1
images/image_3.png,1,5,4,4,5,class4
images/image_4.png,5,1,3,3,3,class2
images/image_5.png,1,3,3,4,3,class3
...
images/image_n.png,4,5,3,1,5,class1
Затем модель должна отправить image_url в качестве данных в ветвь CNN модели, остальные данные (минус класс) в ветвь ANN модели, а затем, наконец, когда они объединены, дать вывод softmax, где потеря / точность рассчитывается через класс истинности основания в последнем столбце.
Я начал строить модель на основе превосходных примеров Джейсона Браунли:
from keras.utils import plot_model
from keras.models import Model
from keras.layers import Input
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.pooling import MaxPooling2D
from keras.layers.merge import concatenate
# branch 1, CNN
input1 = Input(shape=(64,64,1)) #image from column 1
# first branch
conv1 = Conv2D(32, kernel_size=4, activation='relu')(input1)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
flat1 = Flatten()(pool1)
# second branch
input2 = Input(shape=(5,)) #attributes from other columns
ann1 = Dense(128, activation='relu')(input2)
ann2 = Dense(64, activation='relu')(ann1)
# merge feature extractors
merge = concatenate([flat1, ann2])
# interpretation layer
mergedhidden1 = Dense(32, activation='relu')(merge)
# prediction output
output = Dense(4, activation='softmax')(mergedhidden1) #the 4 classes in the final column
model = Model(inputs=[input1, input2], outputs=output)
print(model.summary())
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model2.fit(x_train, y_train,
batch_size=100,
epochs=100,
validation_split=70,
shuffle=True, verbose=2)
print("Evaluating")
score = model.evaluate(x_test, y_test, verbose=0)
print("Evaluated: ")
print("%s: %.2f%%" % (model.metrics_names[1], score[1]*100))
# plot graph
plot_model(model, to_file='multiple_inputs.png',show_shapes='true')
Как вы можете видеть, изображение в формате 64x64 вводится на вход1, ветвь CNN, а остальные данные требуются на вход2, который является ветвью ANN для изучения числовых данных. Затем CNN и ANN объединяются в направлении уровня интерпретации из 32 узлов, прежде чем окончательно классифицируется вывод с использованием num_classes, которые ранее были бы интерпретированы по количеству уникальных значений в последнем столбце
Модель можно визуализировать следующим образом:

Мой вопрос заключается в том, как бы я правильно обработал свой csv с точки зрения создания x_test и т. Д. И т. Д., Чтобы он был в правильной форме для подачи в две ветви во время тренировки на разделении 70/30?
Я все делаю неправильно или этот подход работает? Я полагаю, что это вопрос, касающийся операций в пандах, но мне трудно найти способ правильно выполнить эту операцию.
Для пояснения и примера, изображение будет изображением объекта, тогда как атрибуты attr определят определенные измеренные значения статистической глубины RGBD для одного и того же объекта (оба снимаются одновременно), поэтому я хотел бы использовать их оба классифицировать их общий класс, чтобы увидеть, является ли один из них лучшим или лучший подход состоит в использовании обоих типов данных. Я предполагаю, что для ввода ветви 2 будет гораздо больше атрибутов, чем 5 в примере, но я не слишком уверен, сколько их будет еще
Спасибо! :)