在Keras中使用CNN时如何提取图像的特征向量

在Keras中使用CNN时如何提取图像的特征向量,keras,feature-extraction,Keras,Feature Extraction,我正在做一个二进制分类问题,我的模型架构如下 def CNN_模型(高度、宽度、深度): 输入_形状=(高度、宽度、深度) 模型=顺序() #第一区 add(Conv2D(64,内核大小=(3,3),步幅=1,激活='relu',输入形状=输入形状,填充='VALID')) add(Conv2D(64,内核大小=(3,3),步幅=1,activation='relu',padding='VALID')) add(MaxPooling2D(池大小=(2,2))) #第2区 add(Conv2D(

我正在做一个二进制分类问题,我的模型架构如下

def CNN_模型(高度、宽度、深度):
输入_形状=(高度、宽度、深度)
模型=顺序()
#第一区
add(Conv2D(64,内核大小=(3,3),步幅=1,激活='relu',输入形状=输入形状,填充='VALID'))
add(Conv2D(64,内核大小=(3,3),步幅=1,activation='relu',padding='VALID'))
add(MaxPooling2D(池大小=(2,2)))
#第2区
add(Conv2D(128,内核大小=(3,3),步幅=1,激活='relu',填充='VALID'))
add(Conv2D(128,内核大小=(3,3),步幅=1,激活='relu',填充='VALID'))
添加(平均池2D(池大小=(19,19)))
#FC=>RELU层集
model.add(展平())
模型.添加(密度(128))
添加(激活('relu'))
添加(BatchNormalization())
添加(密集(num_类,activation='softmax'))
model.compile(loss=keras.loss.binary_交叉熵,
optimizer=keras.optimizers.Adadelta(),
指标=[‘准确度’])

返回模型
这里最简单的方法是删除密集层

我将用一个反例来回答这个问题,该反例具有相似的图层,但输入形状不同:

以下是所有层的输出模型体系结构:

这里还列出了特征向量:

示例中使用的图像:

第二种方法用于在使用函数Api而不是Sequencial()时使用

一个更有用的步骤是功能的可视化,我打赌很多人都想看到计算机上看到的东西,并且只演示“展平”层输出(最好说网络):

和魔法:

visualize_stock(img_data)
注:从输入形状=(530700,3)更改为输入形状=(84,84,3),以便更好地为公众可视化


附言:决定发布这样的帖子,任何有这类问题的人都会从中受益(最近也遇到了同样的问题)。

这里最简单的方法是删除稠密层

我将用一个反例来回答这个问题,该反例具有相似的图层,但输入形状不同:

以下是所有层的输出模型体系结构:

这里还列出了特征向量:

示例中使用的图像:

第二种方法用于在使用函数Api而不是Sequencial()时使用

一个更有用的步骤是功能的可视化,我打赌很多人都想看到计算机上看到的东西,并且只演示“展平”层输出(最好说网络):

和魔法:

visualize_stock(img_data)
注:从输入形状=(530700,3)更改为输入形状=(84,84,3),以便更好地为公众可视化


附言:决定发布这样的帖子,任何有此类问题的人都可以从中受益(最近也遇到了同样类型的问题)。

我不确定我是否理解你的问题。一个选择是:创建模型,然后编译模型,然后在模型之前输出图层(我认为最好是在展平层之前获得,因为展平只会得到一个包含所有内容的向量)。您也可以尝试查看FC池输出,这将根据您的数据为您提供许多向量。第二个选项:构建一个模型以展平层,对每个图像进行编译并使用predict来获取该图像的功能(您可能需要迭代所有图像以获取所有功能)。model.add(AveragePoolig2D(池大小=(19,19))#FC=>RELU层模型集。添加(展平().#这部分是所有fratures向量所在的位置。如果您进行测试和工作,请让我知道,并将其作为答案写入。我不确定我是否理解您的问题。一个选项:创建模型,然后编译模型,然后只输出模型之前的层(我认为最好是在展平层之前获得,因为展平只会得到一个包含所有内容的向量)。您也可以尝试查看FC池输出,这将根据您的数据为您提供许多向量。第二个选项:构建一个模型以展平层,对每个图像进行编译并使用predict来获取该图像的功能(您可能需要迭代所有图像以获取所有功能)。model.add(AveragePoolig2D(池大小=(19,19))#FC=>RELU layers model.add(flatte())。#这部分是所有碎片向量所在的位置。如果您进行测试和工作,请告诉我,并将作为答案书写。
def visualize_stock(img_data):
    plt.figure(1, figsize=(25, 25))
    stock = np.squeeze(img_data, axis=0)
    print(stock.shape)
    plt.imshow(stock)
visualize_stock(img_data)