我有一个训练有素的Keras模特,我想:
1)用相同但无偏置的Con2D层替换Con2D层。
2)在第一次激活之前添加BatchNormalization图层
我该怎么做呢?
def keras_simple_model():
from keras.models import Model
from keras.layers import Input, Dense, GlobalAveragePooling2D
from keras.layers import Conv2D, MaxPooling2D, Activation
inputs1 = Input((28, 28, 1))
x = Conv2D(4, (3, 3), activation=None, padding='same', name='conv1')(inputs1)
x = Activation('relu')(x)
x = Conv2D(4, (3, 3), activation=None, padding='same', name='conv2')(x)
x = Activation('relu')(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='pool1')(x)
x = Conv2D(8, (3, 3), activation=None, padding='same', name='conv3')(x)
x = Activation('relu')(x)
x = Conv2D(8, (3, 3), activation=None, padding='same', name='conv4')(x)
x = Activation('relu')(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='pool2')(x)
x = GlobalAveragePooling2D()(x)
x = Dense(10, activation=None)(x)
x = Activation('softmax')(x)
model = Model(inputs=inputs1, outputs=x)
return model
if __name__ == '__main__':
model = keras_simple_model()
print(model.summary())
4条答案
按热度按时间dnph8jn41#
以下函数允许您在名称与正则表达式匹配的原始模型(包括非顺序模型,如DenseNet或ResNet)中的 * 之前 、 之后a插入新层或 * 替换 * 每个层。
与简单的纯顺序模型的不同之处在于,在迭代层以找到关键层之前,首先解析图并将每层的输入层存储在辅助字典中,然后,在迭代层时,还存储每层的新输出Tensor,用于在构建新模型时确定每层的输入层。
用例如下所示,其中在ResNet50的每个激活层之后插入Dropout层:
huwehgph2#
您可以使用以下功能:
由于层形状等原因,对替换存在一些限制。
6pp0gazn3#
我是这样做的:
我有一个名为BatchNormalizationFreeze的自定义层(取自在线用户),因此下面是一个用法示例:
如果你要做多个层,只需用一个伪模型替换替换函数,这样就可以一次完成所有的层
sshcrbum4#
不幸的是,对于不遵循顺序模式的模型来说,替换一个层不是一件容易的事。对于顺序模式来说,只需要x = layer就可以了(x)并在您认为合适时替换为new_layer,如前所述。对于不具有经典序列模式的模型(假设您有两列的简单“连接”)您必须实际“解析”图形并使用您的“new_layer”(或层)在正确的地方。希望这不是太令人沮丧和快乐的图解析和重构:)