Tensorflow Hub图像模块:预处理和输出值的清晰度

时间:2018-04-20 14:40:46

标签: tensorflow tensorflow-slim tensorflow-hub

非常感谢您的支持! 我目前使用TF Slim - 而TF Hub似乎是转学习的一个非常有用的补充。但是,文件中不清楚以下事项:

1。是否隐式完成预处理?这是基于模块构造函数中的“trainable = True / False”参数吗?

module = hub.Module("https://tfhub.dev/google/imagenet/inception_v3/feature_vector/1", trainable=True)

当我使用Tf-slim时,我使用预处理方法:

inception_preprocessing.preprocess_image(image, img_height, img_width, is_training)

2.如何获取初始模型的AuxLogits?似乎缺失:

import tensorflow_hub as hub
import tensorflow as tf

img = tf.random_uniform([10,299,299,3])
module = hub.Module("https://tfhub.dev/google/imagenet/inception_v3/feature_vector/1", trainable=True)
outputs = module(dict(images=img), signature="image_feature_vector", as_dict=True)

输出

dict_keys(['InceptionV3/Mixed_6b', 'InceptionV3/MaxPool_5a_3x3', 'InceptionV3/Mixed_6c', 'InceptionV3/Mixed_6d', 'InceptionV3/Mixed_6e', 'InceptionV3/Mixed_7a', 'InceptionV3/Mixed_7b', 'InceptionV3/Conv2d_2a_3x3', 'InceptionV3/Mixed_7c', 'InceptionV3/Conv2d_4a_3x3', 'InceptionV3/Conv2d_1a_3x3', 'InceptionV3/global_pool', 'InceptionV3/MaxPool_3a_3x3', 'InceptionV3/Conv2d_2b_3x3', 'InceptionV3/Conv2d_3b_1x1', 'default', 'InceptionV3/Mixed_5b', 'InceptionV3/Mixed_5c', 'InceptionV3/Mixed_5d', 'InceptionV3/Mixed_6a'])

1 个答案:

答案 0 :(得分:2)

这些都是很好的问题;让我尝试为不太熟悉TF-Slim的读者提供好的答案。

<强> 1。预处理不是由模块完成的,因为它是关于您的数据的,而不是模块中的CNN架构。该模块仅处理将规范[0,1]范围内的输入值转换为模块中预先训练的CNN所需的值。

冗长的理论基础:CNN训练图像的预处理通常包括解码输入的JPEG(或其他),从中选择(相当大的)随机裁剪,随机光度和几何变换(扭曲颜色,左/右翻转等) 。),并调整为一批训练输入的通用图像大小。实现https://tensorflow.org/hub/common_signatures/images的TensorFlow Hub模块将所有这些模块留在模块周围的代码中。

主要原因是合适的随机转换很大程度上取决于您的训练任务,而不取决于架构或训练模块的状态权重。例如,如果您将汽车与狗分类,颜色扭曲将有所帮助,但可能不适用于成熟与未成熟的香蕉,等等。

此外,已经解码但尚未裁剪/调整大小的一批图像难以表示为单个张量(除非您将其设为编码字符串的1-D张量,但这会带来其他问题,例如破坏backprop转换为高级用途的模块输入。)

底线:使用模块的Python代码需要进行图像预处理(缩放值除外),例如https://github.com/tensorflow/hub/blob/master/examples/image_retraining/retrain.py

细长的预处理方法将数据集特定的随机转换(针对Imagenet调整!)与重新扩展到体系结构的值范围(Hub模块为您执行的操作)进行了混合。这意味着它们不能直接适用于此。

<强> 2。实际上,在tfhub.dev/google / ...下发布的初始模块中缺少辅助头,但我希望它们能够在重新训练时正常工作。

更多细节:并非所有架构都有辅助头,甚至原始的Inception论文都说它们的效果“相对较小”[Szegedy&amp; al。 2015年; §5。使用图像特征向量模块进行自定义分类任务会给模块消费者代码带来负担,检查辅助功能,如果找到,则将辅助记录和丢失术语放在最上面。

这种并发症似乎没有发挥作用,但更多的实验可能会反驳这种评估。 (如果您知道任何问题,请在GitHub问题中分享。)

目前,将辅助头部放到https://tfhub.dev/google/imagenet/inception_v3/feature_vector/1上的唯一方法是复制并粘贴https://github.com/tensorflow/models/blob/master/research/slim/nets/inception_v3.py中的一些行(搜索“辅助头部日志”)并将其应用于“Inception_V3 / Mixed_6e” “你看到的输出。

第3。您没有问,但是:对于培训,模块的文档建议传递hub.Module(...,tags = {“train”}),否则批量规范在推理模式下运行(和丢失,如果模块有任何)。

希望这能解释事情的方式和原因。

Arno(来自TensorFlow Hub开发人员)