如何解决我如何在 model.add(Flatten()) 层之后访问数据?
我正在尝试使用 CNN 进行特征提取,使用 XGboost 对图像数据进行分类。我研究发现可以通过在卷积层之后提取数据来完成。我找到了一些类似问题的源代码并自行尝试。
model = Sequential()
model.add(Conv2D(32,kernel_size=(3,3),strides=(1,1),padding='same',activation="relu",input_shape = data.shape[1:]))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(64,activation="relu") )
model.add(MaxPool2D(pool_size=(2,2))) #max pool window 2x2
model.add(Conv2D(128,activation="relu"))
model.add(MaxPool2D(pool_size=(2,2))) #max pool window 2x2
model.add(Conv2D(256,2))) #max pool window 2x2
model.add(Flatten())
model.add(Dense(128,name='firstDenseLayer'))
model.add(Dense(1,activation="sigmoid"))
# model.summary()
# print(model)
model.compile(loss="binary_crossentropy",optimizer="adam",metrics=["accuracy"])
model.fit(data,label,batch_size=16,epochs=10,validation_data=(val_data,val_label))
在下面我访问了名为“firstDenseLayer”的密集层。
import xgboost as xgb
from keras.models import Model
layerName = 'firstDenseLayer'
intermediate_layer_model = Model(inputs=model.input,outputs=model.get_layer(layerName).output)
intermediate_output = intermediate_layer_model.predict(data)
from xgboost import XGBClassifier
xgbmodel = XGBClassifier(objective='multi:softmax',num_class= 2)
xgbmodel.fit(intermediate_output,label)
xgbmodel.score(intermediate_output,label)
因为我是新手,所以有几个困惑。
- 数据是如何流动的。在我通过卷积层提取图片的特征后,我实际上如何从那里访问数据?
- 这行代码是做什么的?它提取什么数据?
intermediate_output = intermediate_layer_model.predict(data)
- 当我省略(保持注释掉)下面的行时,
model.fit(data,val_label))
从第一个片段并直接运行 XGboost 模型,XGboost 的准确度较低,而当我不这样做时,它的准确度更高。为什么会这样?
请帮帮我。我坚持了很长一段时间。我只是想访问从最后一个卷积层提取的特征数据,并使用该数据使用 XGboost 进行分类。当我试图遵循我从网上找到的方法时,我不确定这是否是唯一的方法。如果有其他方法请告诉我。
解决方法
model.fit(...)
行执行您所期望的操作,它在某些数据和标签上训练由 model
定义的卷积网络。当您使用随机初始化的权重(即不运行 fit
)时,您的分类器产生较低的准确度并不奇怪。
intermediate_layer_model
被构造为 keras 模型,其输出是 model
输出之前的密集层。注意 name
构造中给密集层的 model
参数。
您可以轻松地为 Conv2D
层之一命名并以相同的方式访问它。或者,您可以将图层存储在 python 变量中,即代替
model.add(Conv2D(256,kernel_size=(3,3),padding='same',strides=(1,1),activation="relu"))
在模型构建中可以说
last_conv_layer = Conv2D(256,activation="relu")
model.add(last_conv_layer)
然后对于您输入的 intermediate_layer_model
intermediate_layer_model = Model(inputs=model.input,outputs=last_conv_layer.output)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。