【问题标题】:How do i access data after model.add(Flatten()) layer?我如何在 model.add(Flatten()) 层之后访问数据?
【发布时间】:2020-12-20 20:55:55
【问题描述】:

我正在尝试使用 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, kernel_size=(3,3), padding='same', strides=(1,1), activation="relu") )
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) #max pool window 2x2

model.add(Conv2D(128, kernel_size=(3,3), padding='same', strides=(1,1), activation="relu"))
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) #max pool window 2x2

model.add(Conv2D(256, kernel_size=(3,3), padding='same', strides=(1,1), activation="relu"))
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) #max pool window 2x2

model.add(Flatten()) 

model.add(Dense(128, activation="relu", 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)

由于我是新手,我有几个困惑。

  1. 数据的流动方式。通过卷积层提取图片的特征后,我如何真正从那里访问数据?
  2. 这行代码在做什么?它在提取什么数据?
intermediate_output = intermediate_layer_model.predict(data) 
  1. 当我省略(保持注释掉)以下行时,
model.fit(data, label, batch_size=16, epochs=10, validation_data=(val_data, val_label))

从第一个 sn-p 开始并直接运行 XGboost 模型,XGboost 给出的准确度较低,而当我不这样做时,它给出的准确度更高。为什么会这样?

请帮帮我。我坚持了很长一段时间。我只是想从最后一个卷积层访问提取的特征数据,并使用该数据使用 XGboost 进行分类。当我尝试遵循从网上找到的方法时,我不确定这是否是唯一的方法。如果有其他方法请告诉我。

【问题讨论】:

    标签: python tensorflow machine-learning deep-learning xgboost


    【解决方案1】:

    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, kernel_size=(3,3), padding='same', strides=(1,1), activation="relu")
    model.add(last_conv_layer)
    

    那么对于你输入的intermediate_layer_model

    intermediate_layer_model = Model(inputs=model.input, outputs=last_conv_layer.output)
    

    【讨论】:

    • 非常感谢。这清楚了很多。您能否解释一下通过此代码提取的数据是什么? intermediate_output = intermediate_layer_model.predict(data)
    • 在定义intermediate_layer_model 时,有一个inputsoutputs 参数。 inputs 参数为model.inputoutputs 参数为some_layer.output。这意味着在predict 调用中,您可以输入与model 相同类型的数据,并取回some_layer 在相同数据上使用model.predict 时产生的任何数据
    猜你喜欢
    • 2019-02-27
    • 2014-07-31
    • 2010-10-30
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多