gpt4 book ai didi

tensorflow - 如何在Keras模型中替换(或插入)中间层?

转载 作者:行者123 更新时间:2023-12-02 22:02:59 25 4
gpt4 key购买 nike

我有一个训练有素的 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())

最佳答案

以下函数允许您在之前之后插入新层,或者替换原始模型中名称与正则表达式,包括非序列模型,例如 DenseNet 或 ResNet。

import re
from keras.models import Model

def insert_layer_nonseq(model, layer_regex, insert_layer_factory,
insert_layer_name=None, position='after'):

# Auxiliary dictionary to describe the network graph
network_dict = {'input_layers_of': {}, 'new_output_tensor_of': {}}

# Set the input layers of each layer
for layer in model.layers:
for node in layer._outbound_nodes:
layer_name = node.outbound_layer.name
if layer_name not in network_dict['input_layers_of']:
network_dict['input_layers_of'].update(
{layer_name: [layer.name]})
else:
network_dict['input_layers_of'][layer_name].append(layer.name)

# Set the output tensor of the input layer
network_dict['new_output_tensor_of'].update(
{model.layers[0].name: model.input})

# Iterate over all layers after the input
model_outputs = []
for layer in model.layers[1:]:

# Determine input tensors
layer_input = [network_dict['new_output_tensor_of'][layer_aux]
for layer_aux in network_dict['input_layers_of'][layer.name]]
if len(layer_input) == 1:
layer_input = layer_input[0]

# Insert layer if name matches the regular expression
if re.match(layer_regex, layer.name):
if position == 'replace':
x = layer_input
elif position == 'after':
x = layer(layer_input)
elif position == 'before':
pass
else:
raise ValueError('position must be: before, after or replace')

new_layer = insert_layer_factory()
if insert_layer_name:
new_layer.name = insert_layer_name
else:
new_layer.name = '{}_{}'.format(layer.name,
new_layer.name)
x = new_layer(x)
print('New layer: {} Old layer: {} Type: {}'.format(new_layer.name,
layer.name, position))
if position == 'before':
x = layer(x)
else:
x = layer(layer_input)

# Set new output tensor (the original one, or the one of the inserted
# layer)
network_dict['new_output_tensor_of'].update({layer.name: x})

# Save tensor in output list if it is output in initial model
if layer_name in model.output_names:
model_outputs.append(x)

return Model(inputs=model.inputs, outputs=model_outputs)

与纯顺序模型的简单情况的区别在于,在迭代各层以查找关键层之前,您首先解析图形并将每个层的输入层存储在辅助字典中。然后,当您迭代各层时,您还存储每层的新输出张量,该张量用于在构建新模型时确定每层的输入层。

一个用例如下,其中在 ResNet50 的每个激活层之后插入 Dropout 层:

from keras.applications.resnet50 import ResNet50
from keras.models import load_model

model = ResNet50()
def dropout_layer_factory():
return Dropout(rate=0.2, name='dropout')
model = insert_layer_nonseq(model, '.*activation.*', dropout_layer_factory)

# Fix possible problems with new model
model.save('temp.h5')
model = load_model('temp.h5')

model.summary()

关于tensorflow - 如何在Keras模型中替换(或插入)中间层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49492255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com