TensorFlow:将类添加到预先训练的初始模型&输出完整图像层次结构

时间:2016-07-07 13:25:57

标签: machine-learning tensorflow imagenet

两个问题:

1)有没有人知道我是否可以将新图像类添加到预先训练的Inception-v3模型中?例如,我想在许多国旗上训练TensorFlow,但我需要确保我仍能识别ImageNet层次结构中的图像。我意识到有一种方法可以擦除顶层的Inception并在我的类上完全重新训练模型,但这非常有限且耗时。

2)另外,有没有办法输出包含图像接收的标签的整个层次结构?我希望能够不仅具体了解Inception如何标记图像,但我希望从ImageNet中看到所有更广泛的“同义词”。例如,我不是只看输出“玩具贵宾犬”,而是对“动物/驯养动物/狗/贵宾犬/玩具贵宾犬”感兴趣。

非常感谢任何回复。

3 个答案:

答案 0 :(得分:4)

1)输出层是softmax,这意味着它具有预定义数量的神经元,每个神经元都为一个特定的类定义。从技术上讲,你可以执行Network Surgery,以便它在输出层中还有一个神经元代表你的新类。但是,您必须对网络进行额外培训,以便更新其所有权重,以便考虑新课程。坏消息 - 可能需要一段时间,因为更新将影响整个网络,网络是GIANT。好消息 - 预训练现有网络的这种变化将比从头学习一切更快。

2)是什么让你认为这种等级存在?您肯定无法了解有关数据内部表示的任何信息。当然,你可以检查每个功能中神经元的激活,甚至可以看到它们......但你必须尝试理解这些激活对你自己的意义。也许你找不到任何你期望看到的等级。总而言之 - 理解ANN如何在内部表示数据并非易事。实际上 - 非常困难。

建议进一步阅读: https://github.com/tensorflow/models/tree/master/inception

请注意文档的this part - 它与您的#1

密切相关

答案 1 :(得分:4)

  1. 以下是相关问题: How to get existing model to recognize additional classes?
  2. 以下是一些解释: https://github.com/tensorflow/models/issues/2510

    因此,如果有模型检查点,有可能以某种方式微调模型。 这里是repo链接与finetuning的例子: https://github.com/tensorflow/models/tree/master/research/slim/

    1. 可以为类获取节点名称和人类可读的slug, 所以你可以按类别手动链接节点。但这很费时间。

答案 2 :(得分:3)

是的,你可以,我最近做了一些非常相似的事情,在我的情况下,它是致病植物叶片与健康的植物叶子。 v3开始已经训练,你将要做的是转学习。转移学习是一种通过对像ImageNet这样的一组类别采用完全训练的模型来快速完成大部分工作的技术,并从新类的现有权重中重新训练。

链接:Image Retraining at tensorflow.org

视频来源:YouTube video tutorial,Hvass Laboratories提供了一些很好的视频资源来纠正您的问题。