更改训练有素的网络以仅保留其输出的子集

时间:2017-07-04 07:40:54

标签: tensorflow classification

假设我有一个训练有素的TensorFlow分类网络,可用于PASCAL VOC 2007中的20个班级:飞机,自行车,......,汽车,猫,...,人,......,电视监视器。

现在,我希望只有一个子类的子网络,例如3个类:汽车,猫,人。

然后,我可以使用此网络对新数据集进行测试或重新训练/微调,仅适用于3个类别。

应该可以从原始网络中提取这个子网络,因为它只是最后一层会发生变化。我们需要丢弃丢弃类的神经元/权重。

我的问题:在TensorFlow中有一种简单的方法吗? 如果你能指出一些示例代码或类似的解决方案,那就太好了。 我用谷歌搜索过,但没有提到这一点。

对称问题,在不丢弃原始权重的情况下扩展类的数量,可能对某些人有用,但我目前的重点是上面的那个。

2 个答案:

答案 0 :(得分:1)

如果您只想保留一些切片的输出,您可以简单地从最后一层提取相应的切片。

例如,假设最后一层已完全连接。它的权重是一个大小num_previous x num_output的张量。

您只想保留其中的一些输出,输出1,22和42.您可以将新的完全连接图层的权重设为:

outputs_to_keep = [1, 22, 42]
new_W = tf.transpose(tf.gather(tf.transpose(old_W), outputs_to_keep))

答案 1 :(得分:0)

如您所述,可以提取预训练的子网。它被称为转移学习。有不同的方法,你有一个:

  1. 找到您要开始的图层。你可以使用Tensorboard找到它,然后使用graph.get_tensor_by_name()通常你保留卷积层并丢弃完全连接的层。
  2. 将新图层(通常是完全连接的图层)连接到上一图层。
  3. 使用trainable=false冻结预训练图层的变量(权重)。或者,您可以指示优化程序仅更新新图层的权重。
  4. 使用新课程培训您的模型。