如何将值和图像一起用作训练Keras图像分类器的输入?

时间:2019-06-16 21:15:31

标签: python tensorflow keras neural-network deep-learning

我相信这是我的第一个问题。

我对神经网络非常陌生。我刚刚开始使用Python进行一项研究,该研究旨在查看患有糖尿病的患者的血糖水平,并将其患病的风险从1降到3。其中1个为高风险,3个为低风险。

现在,我以前有约110张由医生排名的图表(42个风险1、51个风险2、10个风险3)。我随机将每组的25%作为测试集,其余的作为训练,然后将其交给Keras进行学习。

效果很好。这是我的代码:

        print("Convoluting")

        classifier.add(Convolution2D(32, 3, 3, input_shape = (64, 64, 3), activation = 'relu'))

        print("Pooling")

        classifier.add(MaxPooling2D(pool_size = (2,2)))

        print("Flattening")

        classifier.add(Flatten())

        print("Connecting")

        classifier.add(Dense(activation = 'relu', units=128))

        classifier.add(Dense(activation = 'softmax', units=3))

        print("Compiling CNN")

        classifier.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])

        print("Generating images")

        from keras.preprocessing.image import ImageDataGenerator

        train_datagen = ImageDataGenerator()

        test_datagen = ImageDataGenerator()

        print("Setting sets")

        training_set = train_datagen.flow_from_directory(
                        'dataset/train_set',
                        target_size=(64,64),
                        batch_size=Batches,
                        class_mode='categorical')

        test_set = test_datagen.flow_from_directory(
                        'dataset/test_set',
                        target_size=(64,64),
                        batch_size=Batches,
                        class_mode='categorical')

        print("training nn...")

        from IPython.display import display
        from PIL import Image

        classifier.fit_generator(
                    training_set,
                    steps_per_epoch=StepsPerEpoch,
                    epochs=Epochs,
                    validation_data=test_set,
                    validation_steps=ValidationSteps)

但是,训练后的准确性不会超过0.4。现在,我知道我有一个训练神经网络的样本相对较小,但是我目前无法获得更多患者的信息。但是,我确实可以访问这些患者的人口统计数据,例如体重,身高和年龄。

基本上,我想以某种方式包括每位患者的体重,身高和年龄以及显示他们的葡萄糖水平的图表。因此,我的程序知道做出判断时会考虑这些信息。

在网上搜索时,我找不到类似的东西,尽管这可能是由于我对此事的了解不足。我该怎么办?

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

如果我必须做类似的事情,我将图像特征和数字特征以相同的形式(特征向量)连接起来。为此,您可以将网络的卷积部分视为特征提取器,该提取器将在最后一个池化层之后变成一系列特征,即它将具有类似[batch_size,1,1,N]的形状。此时,您可以轻松地将常规数字特征附加/连接起来,然后再将其输入到密集层中。

耦合我正在寻找的东西:

  • 请确保数值和卷积特征来自同一分布,即BatchNorm应用于这两者
  • 请确保它们的大小大致相同,即,如果您具有2048个转换功能,而只有5个数字功能,则可能无法按原样工作。

您可以从Wide & Deep Learning for Recommender Systems获得更多启发。

答案 1 :(得分:0)

首先,您使用小型深度网络,因此您的数据必须超过100个实例。因此,我建议搜索“数据增强”以了解如何增加数据。其次,尽管您缺乏用于训练网络的数据,但我认为测试数据的10%或更少就足够了。最后,为了使用其他特征进行训练,您可以通过卷积网络提取图像的特征,然后将其与其他特征连接起来,并训练一个更简单的网络进行最终分类。