假设我有一个训练有素的TensorFlow分类网络,可用于PASCAL VOC 2007中的20个班级:飞机,自行车,......,汽车,猫,...,人,......,电视监视器。
现在,我希望只有一个子类的子网络,例如3个类:汽车,猫,人。
然后,我可以使用此网络对新数据集进行测试或重新训练/微调,仅适用于3个类别。
应该可以从原始网络中提取这个子网络,因为它只是最后一层会发生变化。我们需要丢弃丢弃类的神经元/权重。
我的问题:在TensorFlow中有一种简单的方法吗? 如果你能指出一些示例代码或类似的解决方案,那就太好了。 我用谷歌搜索过,但没有提到这一点。
对称问题,在不丢弃原始权重的情况下扩展类的数量,可能对某些人有用,但我目前的重点是上面的那个。
答案 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)
如您所述,可以提取预训练的子网。它被称为转移学习。有不同的方法,你有一个:
graph.get_tensor_by_name()
通常你保留卷积层并丢弃完全连接的层。trainable=false
冻结预训练图层的变量(权重)。或者,您可以指示优化程序仅更新新图层的权重。