我们试图在预先训练好的imagenet模型中添加一个自定义层。对于顺序或非顺序模型,我们可以很容易地做到这一点。但这里有一些要求
首先,我们不想公开整个imagenet模型,也不想处理所需的内层。假设对于DenseNet
,我们需要以下层,并进一步获得它们的输出形状,以便与一些自定义层连接
vision_model = tf.keras.applications.DenseNet121(
input_shape=(224,224,3),
include_top = False,
weights='imagenet')
for i, layer in enumerate(vision_model.layers):
if layer.name in ['conv3_block12_concat', 'conv4_block24_concat']:
print(i,'\t',layer.trainable,'\t :',layer.name)
if layer.name == 'conv3_block12_concat':
print(layer.get_output_shape_at(0)[1:]) # (28, 28, 512)
if layer.name == 'conv4_block24_concat':
print(layer.get_output_shape_at(0)[1:]) # (14, 14, 1024)
整个需求可以如下所示
The green indicator is basically the transition layer of the dense net.
在上面的图中,密集网络模型有(比如说)5 blocks
,我们想在其中选择block 3
和block 4
并添加一些自定义层,然后合并它们以获得最终输出
此外,应尽可能公开DenseNet
(块1至5)的块及其预先训练的图像净重。我们喜欢在需要时控制冻结和解冻预先训练的图层
我们如何有效地利用tf.keras
实现目标?或者,如果你认为有更好的方法做同样的事情,请建议
比方说,自定义块是这样的
class MLPBlock(tf.keras.layers.Layer):
def __init__(self, kernel_num=32, kernel_size=(3,3), strides=(1,1), padding='same'):
super(ConvModule, self).__init__()
# conv layer
self.conv = tf.keras.layers.Conv2D(kernel_num,
kernel_size=kernel_size,
strides=strides, padding=padding)
# batch norm layer
self.bn = tf.keras.layers.BatchNormalization()
def call(self, input_tensor, training=False):
x = self.conv(input_tensor)
x = self.bn(x, training=training)
return tf.nn.relu(x)
我正试图在他们这样做的地方实施this书面工作。起初,报纸是免费的,但现在不是了。但下面是他们方法的主要框图
我没有访问该文件的权限,因此我只创建了一个类似于您所画的示例:
运行代码,您将看到
block1
和block2
被冻结因为完整模型的绘图很长,所以我只发布了几个片段:
相关问题 更多 >
编程相关推荐