我正在尝试使用来自bvlc_alexnet.npy的预训练权重来实现AlexNet:
# 加载权重数据
weights_dic = numpy.load('bvlc_alexnet.npy', encoding='bytes').item()
conv1W = weights_dic["conv1"][0] # <class 'numpy.ndarray'> (11, 11, 3, 96)
conv1b = weights_dic["conv1"][1] # <class 'numpy.ndarray'> (96,)
model = Sequential()
model.add(Conv2D(96, kernel_size=[11, 11], kernel_initializer = <???>,
bias_initializer = <???>, dtype=np.ndarray), activation='relu', strides=4, padding="same")
在这里,我不知道如何将这些权重(conv1W
和 conv1b
)分配给kernel_initializer
和bias_initializer
属性。
回答:
首先构建模型,不需要设置任何初始化器。然后将所有权重按模型中层出现的顺序放入一个列表中(例如conv1_weights, conv1_biases, conv2_weights, conv2_biases等),然后调用模型的set_weights
方法:
model.set_weights(weights)
或者,您可以单独设置每一层的权重:
model.layers[layer_index].set_weights([layer_weights, layer_biases])
# 或者如果您为层指定了名称,可以使用层的名称
model.get_layer(layer_name).set_weights([layer_weights, layer_biases])