Как определить входные данные и классы для смешанной классификации данных в Keras? - PullRequest
0 голосов
/ 10 марта 2019

Я относительно новичок в библиотеке 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, которые ранее были бы интерпретированы по количеству уникальных значений в последнем столбце

Модель можно визуализировать следующим образом: model graph

Мой вопрос заключается в том, как бы я правильно обработал свой csv с точки зрения создания x_test и т. Д. И т. Д., Чтобы он был в правильной форме для подачи в две ветви во время тренировки на разделении 70/30?

Я все делаю неправильно или этот подход работает? Я полагаю, что это вопрос, касающийся операций в пандах, но мне трудно найти способ правильно выполнить эту операцию.

Для пояснения и примера, изображение будет изображением объекта, тогда как атрибуты attr определят определенные измеренные значения статистической глубины RGBD для одного и того же объекта (оба снимаются одновременно), поэтому я хотел бы использовать их оба классифицировать их общий класс, чтобы увидеть, является ли один из них лучшим или лучший подход состоит в использовании обоих типов данных. Я предполагаю, что для ввода ветви 2 будет гораздо больше атрибутов, чем 5 в примере, но я не слишком уверен, сколько их будет еще

Спасибо! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...