向机器学习分类器(深度森林)提供深层功能

时间:2019-01-30 11:00:06

标签: python machine-learning keras deep-learning classification

我想将我的CNN深度特征提供给传统分类器,即随机森林,我不想使用MLP(多层感知器)对我的问题进行分类,但需要其他分类器为我解决此问题。我有图像数据。我们无法将非结构化数据提供给机器学习分类器。我想首先从CNN中提取深层特征(Conv2d,激活层,最大池化层),而不是想要将图像数据提取为结构化和下采样的形式,而不是将其提供给常规分类器。我的情况下,我想使用随机森林。 这是我的代码。

我尝试了我的代码,但是该模型给出了一些错误。我想将输出放到平坦层之后,这就是为什么我不添加密集层的原因,因为我只想获得深层特征而不希望对其进行分类。我在Google上找到了问题的解决方案,但没有得到任何有用的答案

model_1=Sequential()

model_1.add(Conv2D(96,(3,3),padding="valid"))
model_1.add(Activation("relu"))
model_1.add(MaxPooling2D(pool_size=(2,2),strides=(2,2),padding="valid"))

model_1.add(Conv2D(180 ,(3,3),padding="valid"))
model_1.add(Activation("relu"))

model_1.add(MaxPooling2D(pool_size=(2,2),strides=(2,2),padding="valid"))

model_1.add(Conv2D(200 ,(3,3),padding="valid"))
model_1.add(Activation("relu"))
model_1.add(MaxPooling2D(pool_size=(3,3),strides=(2,2),padding="valid"))


model_1.add(Flatten())

model_1.compile(loss=keras.losses.binary_crossentropy, optimizer="adam", metrics=["accuracy"])
model_1.fit(X_128,y_categorical,epochs=100)
x=model_1.predict(X_128)

通过model.fit可以学习conv2d和model.predict的权重。我认为我有很深的功能,我知道我是不是真的,因为我出错了。 错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-30-3c769c68fc69> in <module>()
     18 
     19 model_1.compile(loss=keras.losses.binary_crossentropy, optimizer="adam", metrics=["accuracy"])
---> 20 model_1.fit(X_128,y_categorical,epochs=100)
     21 x=model_1.predict(X_128)

/opt/conda/lib/python3.6/site-packages/Keras-2.2.4-py3.6.egg/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs)
    958             sample_weight=sample_weight,
    959             class_weight=class_weight,
--> 960             batch_size=batch_size)
    961         # Prepare validation data.
    962         do_validation = False

/opt/conda/lib/python3.6/site-packages/Keras-2.2.4-py3.6.egg/keras/engine/training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size)
    787                 feed_output_shapes,
    788                 check_batch_axis=False,  # Don't enforce the batch size.
--> 789                 exception_prefix='target')
    790 
    791             # Generate sample-wise weight values given the `sample_weight` and

/opt/conda/lib/python3.6/site-packages/Keras-2.2.4-py3.6.egg/keras/engine/training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
    137                             ': expected ' + names[i] + ' to have shape ' +
    138                             str(shape) + ' but got array with shape ' +
--> 139                             str(data_shape))
    140     return data
    141 

ValueError: Error when checking target: expected flatten_17 to have shape (33800,) but got array with shape (2,)

感谢您考虑我的问题。谢谢

1 个答案:

答案 0 :(得分:0)

您的问题不是模型,而是基本概念。模型需要学习生成良好的功能。您当前正在通过Flatten传递它们。

您实际需要做的是将“随机森林”分类器添加为模型的最后一层。在keras中,可以通过创建自己的custom layer来实现。 因此,流量将变得平坦,然后将其传递到您的自定义“随机森林”层以进行预测,然后计算损耗以通过网络反向传播。