python - 为机器学习分类器提供深度特征(随机森林)
问题描述
我想将我的 CNN 深度特征提供给传统分类器,即随机森林,我不想使用 MLP(多层感知器)对我的问题进行分类,但需要其他分类器来为我解决这个问题。我有图像数据。我们不能将非结构化数据提供给机器学习分类器。我想首先从 CNN(Conv2d、激活、Maxpooling 层)中提取深层特征,而不是将图像数据提取为结构化和下采样形式,然后将其提供给普通分类器。我的情况是我想使用随机森林。这是我的代码..
我尝试了我的代码,但这个模型给出了一些错误。我想在展平层之后获取我的输出,这就是为什么我没有添加密集层的原因,因为我只想获得不想对它们进行分类的深层特征。我在谷歌上找到了我的问题的解决方案,但没有得到任何有用的答案
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,)
感谢您考虑我的问题。谢谢
解决方案
您的问题不在于模型,而在于基本概念。模型需要学习生成好的特征。您目前只是将它们传递给Flatten
.
您实际需要做的是将随机森林分类器添加为模型的最后一层。在 keras 中,可以通过创建自己的自定义层来实现。因此,流程将变平,然后通过您的自定义随机森林层进行预测,然后计算损失以通过网络反向传播。
推荐阅读
- amazon-ec2 - 无法从 ec2 prod 机器远程登录 SMTP 服务器
- java - 如何仅减去两个 Java.util.date 对象的日期部分?
- amazon-web-services - 在 S3 存储中通过山鸭上传文件很慢
- php - PHP 或 (||) 运算符问题
- chart.js - 使用 chart.js 的条形图的不同颜色
- java - 如何在 Java 中重构多个 if-else 语句?
- node.js - 在 Jest 中运行测试时如何解决 TCPSERVERWRAP?
- c - 从串行读取所需数据量的最佳实践?
- windows - 如何解决 Windows 中 VSCode 中的 CMake 错误?
- python - 熊猫,在新的df中将匹配的行组合在一起