在 ResNet 网络顶部添加层时图形断开连接
Graph disconnected when layers added on top of ResNet network
我正在尝试更改 ResNet50 网络的输入形状。我需要 3 个以上通道的输入。当您指定输入形状而不加载 imagenet 权重时,ResNet 应用程序可以工作,但我想使用 imagenet 的权重以避免长时间的训练阶段。
我知道 imagenet 的权重适用于具有三个通道的输入形状,但理论上通过切断网络的头部并添加一个新的输入层这应该可行。
我试图删除头层,但我遇到了一些问题,说过滤器的数量与 3 不同
ValueError: number of input channels does not match corresponding
dimension of filter, 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 的权重,但我尝试的方法似乎是错误的。
我不确定 keras 模型是否支持在其层上进行列表操作,似乎弹出层不会使其忘记其预期的输入大小。
您可以使用您的输入形状初始化一个新的 resnet,并手动将 Imagenet 权重加载到除前 3 层之外的所有层,前 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())
话虽如此,您尝试进行的迁移学习并不是很常见,我真的很想知道它是否有效。如果它实际上收敛得更快,你能更新一下吗?
我正在尝试更改 ResNet50 网络的输入形状。我需要 3 个以上通道的输入。当您指定输入形状而不加载 imagenet 权重时,ResNet 应用程序可以工作,但我想使用 imagenet 的权重以避免长时间的训练阶段。
我知道 imagenet 的权重适用于具有三个通道的输入形状,但理论上通过切断网络的头部并添加一个新的输入层这应该可行。
我试图删除头层,但我遇到了一些问题,说过滤器的数量与 3 不同
ValueError: number of input channels does not match corresponding dimension of filter, 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 的权重,但我尝试的方法似乎是错误的。
我不确定 keras 模型是否支持在其层上进行列表操作,似乎弹出层不会使其忘记其预期的输入大小。
您可以使用您的输入形状初始化一个新的 resnet,并手动将 Imagenet 权重加载到除前 3 层之外的所有层,前 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())
话虽如此,您尝试进行的迁移学习并不是很常见,我真的很想知道它是否有效。如果它实际上收敛得更快,你能更新一下吗?