在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)