我正在尝试更改ResNet50网络的输入形状。我需要3个以上通道的输入。当您指定输入形状而不加载imagenet权重时,ResNet应用程序可以工作,但是我想使用imagenet的权重来避免漫长的训练阶段。
我知道imagenet的权重适用于具有三个通道的输入形状,但是从理论上讲,它是通过剪裁网络的头部并添加新的输入层来实现的。
我尝试去掉了头层,但是我说过滤器的数量不同于3时遇到了一些问题
ValueError:输入通道数与相应的不匹配 过滤器尺寸6!= 3
model=keras.applications.resnet50.ResNet50(include_top=False,
input_shape(200,200,3),weights='imagenet')
model.layers.pop(0)
model.layers.pop(0)
model.layers.pop()
X_input = Input((200,200,6), name='input_1')
X = ZeroPadding2D((3, 3), name='conv1_pad')(X_input)
model = Model(inputs=X, outputs=model(X))
model.summary()
我认为可以更改输入形状的通道数,并且仍然使用imagenet的权重,但是我尝试的方法似乎是错误的。
答案 0 :(得分:1)
我不确定keras模型是否支持其图层上的列表操作,似乎弹出图层不会使它忘记其预期的输入大小。
您可以使用输入形状初始化一个新的resnet,然后将Imagenet权重手动加载到所有图层,除了前3个需要在输入张量中包含3个通道的图层。
从keras.applications.resnet50
借用几行将导致如下结果:
import h5py
import keras
from keras_applications.resnet50 import WEIGHTS_PATH_NO_TOP
input_tensor = keras.Input((200, 200, 6))
resnet = keras.applications.ResNet50(
input_tensor=input_tensor, weights=None, include_top=False
)
weights_path = keras.utils.get_file(
'resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5',
WEIGHTS_PATH_NO_TOP,
cache_subdir='models',
md5_hash='a268eb855778b3df3c7506639542a6af')
with h5py.File(weights_path, 'r') as f:
for layer in resnet.layers[3:]:
if layer.name in f:
layer.set_weights(f[layer.name].values())
话虽如此,您尝试做的那种转移学习不是很常见,如果可行,我真的很好奇。如果收敛速度更快,您可以更新吗?