如何将密集层转换为 Keras 中的等效卷积层?

     2023-02-23     30

关键词:

【中文标题】如何将密集层转换为 Keras 中的等效卷积层?【英文标题】:How to convert a dense layer to an equivalent convolutional layer in Keras? 【发布时间】:2017-04-30 20:53:35 【问题描述】:

我想使用 Keras 做一些类似于完全卷积网络论文 (https://people.eecs.berkeley.edu/~jonlong/long_shelhamer_fcn.pdf) 的事情。我有一个网络,它最终将特征图展平并通过几个密集层运行它们。我想将这样的网络中的权重加载到其中密集层被等效卷积替换的网络中。

可以以 Keras 自带的 VGG16 网络为例,其中最后一个 MaxPooling2D() 的 7x7x512 输出被展平,然后进入 Dense(4096) 层。在这种情况下,密集(4096)将被替换为 7x7x4096 卷积。

我的真实网络略有不同,有一个 GlobalAveragePooling2D() 层而不是 MaxPooling2D() 和 Flatten()。 GlobalAveragePooling2D() 的输出是一个 2D 张量,不需要额外展平它,因此包括第一个的所有密集层都将替换为 1x1 卷积。

我已经看到了这个问题:Python keras how to transform a dense layer into a convolutional layer,如果不完全相同,它似乎非常相似。问题是我无法得到建议的解决方案,因为(a)我使用 TensorFlow 作为后端,所以权重重新排列/过滤器“旋转”不正确,并且(b)我想不通了解如何加载砝码。使用model.load_weights(by_name=True) 将旧权重文件加载到新网络中不起作用,因为名称不匹配(即使它们的尺寸不同)。

使用 TensorFlow 时应该如何重新排列?

如何加载砝码?我是否要为每个模型创建一个,在两个模型上调用 model.load_weights() 以加载相同的权重,然后复制一些需要重新排列的额外权重?

【问题讨论】:

【参考方案1】:

根据 hars 的回答,我创建了这个函数来将任意 cnn 转换为 fcn:

from keras.models import Sequential
from keras.layers.convolutional import Convolution2D
from keras.engine import InputLayer
import keras

def to_fully_conv(model):

    new_model = Sequential()

    input_layer = InputLayer(input_shape=(None, None, 3), name="input_new")

    new_model.add(input_layer)

    for layer in model.layers:

        if "Flatten" in str(layer):
            flattened_ipt = True
            f_dim = layer.input_shape

        elif "Dense" in str(layer):

            input_shape = layer.input_shape
            output_dim =  layer.get_weights()[1].shape[0]
            W,b = layer.get_weights()

            if flattened_ipt:
                shape = (f_dim[1],f_dim[2],f_dim[3],output_dim)
                new_W = W.reshape(shape)
                new_layer = Convolution2D(output_dim,
                                          (f_dim[1],f_dim[2]),
                                          strides=(1,1),
                                          activation=layer.activation,
                                          padding='valid',
                                          weights=[new_W,b])
                flattened_ipt = False

            else:
                shape = (1,1,input_shape[1],output_dim)
                new_W = W.reshape(shape)
                new_layer = Convolution2D(output_dim,
                                          (1,1),
                                          strides=(1,1),
                                          activation=layer.activation,
                                          padding='valid',
                                          weights=[new_W,b])


        else:
            new_layer = layer

        new_model.add(new_layer)

    return new_model

你可以这样测试函数:

model = keras.applications.vgg16.VGG16()
new_model = to_fully_conv(model)

【讨论】:

谢谢你。正是我所需要的,它可以推广到任何具有 Conv 和 Dense 层的模型。 + 1.【参考方案2】:

一个。无需进行复杂的旋转。只是重塑工作

b.使用 get_weights() 并初始化新层

遍历 model.layers,使用 set_weights 或如下所示的配置和加载权重创建相同的层。

以下一段伪代码对我有用。 (Keras 2.0)

伪代码:

# find input dimensions of Flatten layer
f_dim =  flatten_layer.input_shape

# Creating new Conv layer and putting dense layers weights 
m_layer = model.get_layer(layer.name)
input_shape = m_layer.input_shape
output_dim =  m_layer.get_weights()[1].shape[0]
W,b = layer.get_weights()
if first dense layer :
    shape = (f_dim[1],f_dim[2],f_dim[3],output_dim)
    new_W = W.reshape(shape)
    new_layer = Convolution2D(output_dim,(f_dim[1],f_dim[2]),strides=(1,1),activation='relu',padding='valid',weights=[new_W,b])

else: (not first dense layer)
    shape = (1,1,input_shape[1],output_dim)
    new_W = W.reshape(shape)
    new_layer = Convolution2D(output_dim,(1,1),strides=(1,1),activation='relu',padding='valid',weights=[new_W,b])

【讨论】:

如何在 keras 中拥有并行卷积层?

】如何在keras中拥有并行卷积层?【英文标题】:Howtohaveparallelconvolutionallayersinkeras?【发布时间】:2017-08-2609:07:40【问题描述】:我对神经网络和keras有点陌生。我有一些大小为6*7的图像,过滤器的大小为15。我想有几个过滤器并... 查看详情

如何在 Keras 中为每个时间步应用不同的密集层

】如何在Keras中为每个时间步应用不同的密集层【英文标题】:HowtoapplyadifferentdenselayerforeachtimestepinKeras【发布时间】:2019-11-1423:31:01【问题描述】:我知道应用TimeDistributed(Dense)在所有时间步上应用相同的密集层,但我想知道如... 查看详情

如何在keras中对矩阵的每一行应用不同的密集层

】如何在keras中对矩阵的每一行应用不同的密集层【英文标题】:Howtoapplyadifferentdenselayertoeachrowofamatrixinkeras【发布时间】:2018-07-0400:36:18【问题描述】:我上一层的输出具有形状(None,30,600)。我想将此矩阵的每一行乘以不同的(600,... 查看详情

keras 密集层的意外输出形状

】keras密集层的意外输出形状【英文标题】:Unexpectedoutputshapefromakerasdenselayer【发布时间】:2022-01-1502:11:16【问题描述】:我尝试创建一个只有一个隐藏层的最小非卷积NN图像二元分类器(作为更复杂模型之前的实践):defmake_mode... 查看详情

在密集网络中将 fc 层转换为 conv 层

】在密集网络中将fc层转换为conv层【英文标题】:convertfclayertoconvlayerindensenet【发布时间】:2020-05-1304:56:19【问题描述】:我必须将密集网络中的fc层转换为conv层。下面是密集网络的架构。#DenseBlockdefdenseblock(input,num_filter=12,dropout... 查看详情

将张量的各个通道传递给 Keras 中的层

】将张量的各个通道传递给Keras中的层【英文标题】:PassingIndividualChannelsofTensorstoLayersinKeras【发布时间】:2016-08-2320:36:40【问题描述】:我正在尝试为theano后端模拟与SeparableConvolution2D层等效的东西(它已经存在于TensorFlow后端)... 查看详情

没有对不同通道求和的卷积层 - Keras

...通道都有不同的过滤器-例如3x3x3。首先在Cov2D中,过滤器中的每个内核分别应用于输入层中的三个通道(给出3x3x3-没有填充和步幅1),然后将这三个通道相加(逐 查看详情

Keras 中的 Flatten 层是如何工作的?

】Keras中的Flatten层是如何工作的?【英文标题】:HowdoestheFlattenlayerworkinKeras?【发布时间】:2017-10-2521:30:16【问题描述】:我正在使用TensorFlow后端。我正在依次应用卷积、最大池化、展平和密集层。卷积需要3D输入(高度、宽度... 查看详情

keras中不兼容的密集层错误

】keras中不兼容的密集层错误【英文标题】:Incompatibledenselayererrorinkeras【发布时间】:2016-09-2910:02:47【问题描述】:我的输入是一系列视频,数量为8500。每个视频作为一系列50帧输入LSTM,每帧有960个像素。所以输入dim是8500,50,960... 查看详情

在密集的 Keras 层中绑定自动编码器权重

】在密集的Keras层中绑定自动编码器权重【英文标题】:TyingAutoencoderWeightsinaDenseKerasLayer【发布时间】:2019-05-1400:43:50【问题描述】:我正在尝试在Keras中创建一个自定义的Dense层,以在自动编码器中绑定权重。我已经尝试在卷积... 查看详情

卷积层(CNN)如何在 keras 中工作?

】卷积层(CNN)如何在keras中工作?【英文标题】:HowdoConvolutionalLayers(CNNs)workinkeras?【发布时间】:2019-07-1016:13:18【问题描述】:我注意到在keras文档中有许多不同类型的Conv层,即Conv1D、Conv2D、Conv3D。它们都具有filters、kernel_size... 查看详情

Keras:密集层和激活层之间的形状不匹配

】Keras:密集层和激活层之间的形状不匹配【英文标题】:Keras:ShapeMismatchbetweenDenseandActivationlayers【发布时间】:2017-12-1922:46:27【问题描述】:一直在尝试在Keras中创建神经网络,但遇到了一个问题,即我的一个密集层和激活层之... 查看详情

Keras嵌入层:将零填充值保持为零

...:42:59【问题描述】:我一直在考虑单词序列的0-padding以及如何将0-padding转换为Embedding层。乍一看,人们会认为您也想保持嵌入=0.0。但是,keras中的Embedding层为任何输入令牌生成随机值,并且没有办法强制它生成0 查看详情

Keras 密集层输出形状

】Keras密集层输出形状【英文标题】:KerasDenselayerOutputShape【发布时间】:2020-08-1700:42:17【问题描述】:我无法理解获取第一个隐藏层的输出形状背后的逻辑。我举了一些随意的例子如下;示例1:model.add(Dense(units=4,activation=\'linear... 查看详情

Keras CNN模型参数计算

...cnn模型是使用Keras1.1.1创建的,它有两个卷积池层和两个密集层,并且在第二个卷积池层和第一个密集层之后添加了dropout。代码如下:model=Sequential()#convolution-poolinglayersmodel.add(Conv 查看详情

如何将稀疏张量传递给 TF 2.0 中的密集层?

】如何将稀疏张量传递给TF2.0中的密集层?【英文标题】:HowtopassasparsetensortotheDenseLayerinTF2.0?【发布时间】:2020-04-0406:47:00【问题描述】:我正在使用TF2.0。工作:fromtensorflow.kerasimportlayersinputs=layers.Input(shape=(256,),sparse=False,name=\'n... 查看详情

keras模型中卷积层的可视化

】keras模型中卷积层的可视化【英文标题】:visualizationofconvolutionallayerinkerasmodel【发布时间】:2017-01-0921:15:54【问题描述】:我在Keras中创建了一个模型(我是新手),并且设法很好地训练了它。它需要300x300图像并尝试将它们分... 查看详情

keras网络层之卷积层

卷积层Cov1D层keras.layers.convolutional.Conv1D(filters,kernel_size,strides=1,padding=‘valid‘,dilation_rate=1,activation=None,use_bias=True,kernel_initializer=‘glorot_uniform‘,bias_initializer=‘zeros‘,kern 查看详情