如何在Keras中定义用于混合数据分类的输入和类?

时间:2019-03-10 00:34:58

标签: python tensorflow keras

对于Keras库,我是一个相对较新的人,我终于从顺序API转换为功能更复杂的模型的功能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的图像输入到input1的CNN分支中,其余数据需要在input2处使用,input2是从数字数据中学习的ANN分支。然后,将CNN和ANN串联到32个节点的解释层,然后最终使用num_classs对输出进行分类,而该num_classs以前已经由最后一列中的唯一值的数量进行了解释

该模型可以如下所示: model graph

我的问题是,如何在创建x_test等方面正确处理我的csv,以便在70/30分割训练中以正确的形式将其馈送到两个分支中?

我做错了吗,还是这种方法行得通?我想这是一个关于熊猫操作的问题,但是我很难理解执行此操作的正确过程。

为便于说明和示例,图像将是对象的图片,而attrs将定义同一对象的某些测量的统计RGBD深度数据值(两者均同时捕获),因此我想同时使用它们对他们的共享类进行分类,以查看是其中一种还是最好的方法是同时使用两种类型的数据。我想对于分支2输入,该示例中的属性将比示例5中的属性多得多,但我不太确定还会有多少个

谢谢! :)

0 个答案:

没有答案