我有一个训练有素的图像去马赛克模型,我想通过删除指定图层上的滤镜来使其更小。
例如,我想采用以下模型(练习):
conv1 = Conv2D(32, self.kernel_size, activation='relu', padding='same')(chnl4_input)
conv2 = Conv2D(32, self.kernel_size, strides=(2, 2), activation='relu', padding='same')(conv1)
conv5 = Conv2D(64, self.kernel_size, activation='relu', padding='same')(conv2)
conv6 = Conv2D(64, self.kernel_size, activation='relu', padding='same')(conv5)
up1 = concatenate([UpSampling2D(size=(2, 2))(conv6), conv1], axis=-1)
conv7 = Conv2D(64, self.kernel_size, activation='relu', padding='same')(up1)
我想将conv5和conv6层更改为此:
conv1 = Conv2D(32, self.kernel_size, activation='relu', padding='same')(chnl4_input)
conv2 = Conv2D(32, self.kernel_size, strides=(2, 2), activation='relu', padding='same')(conv1)
conv5 = Conv2D(32, self.kernel_size, activation='relu', padding='same')(conv2)
conv6 = Conv2D(32, self.kernel_size, activation='relu', padding='same')(conv5)
up1 = concatenate([UpSampling2D(size=(2, 2))(conv6), conv1], axis=-1)
conv7 = Conv2D(64, self.kernel_size, activation='relu', padding='same')(up1)
我环顾四周,但是没有看到任何明显的方法可以做到这一点。 I found this类似问题的示例,但是该解决方案专门提到新层必须具有与旧层相同数量的过滤器,这对我不利。
如果有人知道我该怎么做,我将非常感激。
[编辑]:为明确起见,我有一个现有模型,例如“模型A”。 我想创建一个新模型“ B型”。除了我上面提到的层之外,这两个模型将是相同的。 我正在寻找一种使用旧模型权重初始化所有层(除了已更改的层之外)的新模型的方法。然后,新模型将按照常规训练为收敛。
答案 0 :(得分:1)
建立一个新模型(结构完全相同,只更改过滤器数量)并正确传递权重:
transferLayers = [0,1,2,3,4,8,9] #indices must be chosen by you properly
for layer in transferLayers:
newModel.layers[layer].set_weights(oldModel.layers[layer].get_weights())
conv7
会出现问题,该问题将接收不同的输入蚂蚁,因此其权重矩阵的大小也不同。
然后,您可能应该创建两个索引列表,一个用于旧模型,一个用于新模型。
或者您可以重新创建旧模型,在其图层中添加名称:
namedTrainingModel.set_weights(unnamedTraininModel.get_weights())
按名称传输权重:
namedTrainingModel.save_weights('filename')
changedModel.load_weights('filename', by_name=True)