【发布时间】:2020-10-21 10:41:08
【问题描述】:
我的意思是: 假设 Conv 内核有 64 个通道输出,我只想训练 64 个通道中的通道 1。
问题来自阅读本文https://arxiv.org/abs/1911.09659。
在本文中,它建议我们可以冻结一些过滤器并在迁移学习中训练其余的过滤器。
但是,我想知道如何在 Tensorflow 中实现它。
如果我们能够冻结一些层,那是很明显的,只需迭代网络中的层并将它们的可训练布尔值设为 False。
但是,当涉及到内核时,我比我想象的要麻烦。
我找到了Get the value of some weights in a model trained by TensorFlow这个anwser。
我试着得到所有的重量,然后把它们像这样:
def get_weights_bias(model, layer_name):
"""
This function aims to extract kernel and its bias from the original weight
:param model: the model we want to extract weight from
:param layer_name: the name of the layer we want to extract the weight from
:return: kernel_list and bias_list of particular layer
"""
for layer in model.layers:
if layer_name == layer.name:
weights = layer.get_weights()
print(type(weights))
print(weights[0].shape, type(weights[0])) # weights
print(weights[1].shape, type(weights[1])) # biases
kernel_list = []
bias_list = weights[1]
print(type(bias_list))
for j in range(weights[0].shape[-1]):
name_weight = layer_name + "_weight_" + str(j)
kernel = tf.Variable(initial_value=weights[0][:, :, :, j], name=name_weight, trainable=True)
kernel = tf.expand_dims(kernel, -1)
kernel_list.append(kernel)
return kernel_list, bias_list
根据这个答案的建议,我遇到了一些问题。我发现很难将它们恢复到 conv 层,因为 layer.set_weights() 只接受 numpy 数组而不是 tf.Variable。
有什么建议吗??
【问题讨论】:
标签: python tensorflow keras deep-learning