利用TF重训练Google Inception模型(转)

原文地址:http://hp.stuhome.net/index.php/2017/02/16/retrain-google-inception-model/

本篇文章中软件的下载需要科学上网支持。
主要参考资料为这篇文章,主要步骤相同,对参数,细节做了说明。
一般来讲,深度学习的模型训练需要消耗大量的计算资源,例如Google的Inception模型,使用了8张K40显卡训练了两周,普通开发者一般没有这样强大的计算资源支撑。但是迁移学习提供了捷径,通过重训练已训练模型的最后几层,就可以将模型用于自定义图像的分类。TF提供了用于重训练的工具集。
因此,在尝试自己搭建模型并训练模型之前,应首先尝试使用重训练模型方法,这样的好处是可以先快速评估至少可以达到的准确率,对以后的模型建立,优化提供基线(baseline)。
并且,重训练生成的权重值文件可以用于TF移动端app,移动端app直接加载训练好的权重值,通过摄像头实时识别,这将在下篇博客中讲解。
这次项目中使用的是基金会提供的视网膜病变图像,数据集比较小,只有不到400张,依然达到了不错的准确率(测试集80%左右),本教程中,以开源数据集为例做示范。
开源数据集下载地址:
http://download.tensorflow.org/example_images/flower_photos.tgz
首先,下载数据集

$ curl -O http://download.tensorflow.org/example_images/flower_photos.tgz

解压到某一目录下,比如~/Downloads/flower,可以看到,flower_photos文件夹中有5个分类,在重训练过程中,TF提供的工具集会将这五个分类文件夹的名称作为类别标签,因此,若需要修改分类标签,应在这里修改文件夹的名称。
上篇博客讲解了如何从源码安装TF(是本篇博客的基础)。
首先,浏览至源码目录顶层,例如:

$ cd ~/tensorflow

然后执行重训练Python程序(这里的参数仅仅是示例,可直接打开源码文件,底部有所有参数以及参数说明,可用于进一步调参使用),注意路径替换为自己的路径:

python3 tensorflow/examples/image_retraining/retrain.py \
--bottleneck_dir=/home/hp/Downloads/flower/bottlenecks \
--model_dir=/home/hp/Downloads/flower/inception \
--output_graph=/home/hp/Downloads/flower/retrained_graph.pb \
--output_labels=/home/hp/Downloads/flower/retrained_labels.txt \
--image_dir /home/hp/Downloads/flower/flower_photos

参数解析:
bottleneck_dir:生成bottleneck文件,加快训练过程,详细解释参见这里
model_dir:下载的Inception存放目录。
output_graph:重训练生成的权重值的存放目录。
output_labels:重训练生成的标签的存放目录。
image_dir:数据集目录。
执行Python程序后,会自动下载Inception模型,随后会生成bottleneck文件并开始重训练,此过程需要些时间。
或者:
TF提供了二进制重训练工具,执行以下命令编译:

bazel build --config opt tensorflow/examples/image_retraining:retrain

其中–config opt参数利用了configure步骤设置的指令集,可以最大化性能。
参数与上面的Python程序类似,可以-h查看参数列表与用法:

bazel-bin/tensorflow/examples/image_retraining/retrain -h

训练完成在output_graph文件夹将会得到重训练好的权重值文件,接下来,编译分类器,让此分类器利用训练好的权重值执行分类任务:

$ bazel build tensorflow/examples/label_image:label_image

执行分类测试:

$ bazel-bin/tensorflow/examples/label_image/label_image \
--graph=/home/hp/Downloads/flower/retrained_graph.pb \
--labels=/home/hp/Downloads/flower/retrained_labels.txt \
--output_layer=final_result \
--image=/home/hp/Downloads/flower/flower_photos/8181477_8cb77d2e0f_n.jpg #测试训练集中的图片

程序所用参数应该很容易理解。
这种方法可以用来测试,如果批量对图片分类的话会很慢,因为每次执行命令都会重新加载整个权重值文件,因此,批量分类应使用另写Python程序利用TF加载重训练的权重值建立图,然后批量分类。具体实现过程我放到了github上,必要的注释在源文件中。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TensorFlow是一个开源的深度学习框架,提供了丰富的神经网络模型的实现示例,在其中我们可以找到GoogLeNet模型的实现例子。 GoogLeNet是谷歌公司提出的一种深度神经网络模型,它在2014年的ImageNet图像识别竞赛中获得了佳绩。这个模型引入了一个称为“Inception”的块,通过多层的卷积核并行组合的方式来提取特征。在TensorFlow中,我们可以使用tf.keras来实现这个模型。 首先,我们需要导入相关的库: ```python import tensorflow as tf from tensorflow.keras import layers ``` 然后,定义Inception块的构建函数,如下: ```python def inception_block(x, filters): # 1x1 Convolution path1 = layers.Conv2D(filters[0], kernel_size=(1, 1), padding='same', activation='relu')(x) # 3x3 Convolution path2 = layers.Conv2D(filters[1], kernel_size=(1, 1), padding='same', activation='relu')(x) path2 = layers.Conv2D(filters[2], kernel_size=(3, 3), padding='same', activation='relu')(path2) # 5x5 Convolution path3 = layers.Conv2D(filters[3], kernel_size=(1, 1), padding='same', activation='relu')(x) path3 = layers.Conv2D(filters[4], kernel_size=(5, 5), padding='same', activation='relu')(path3) # MaxPooling path4 = layers.MaxPooling2D((3, 3), strides=(1, 1), padding='same')(x) path4 = layers.Conv2D(filters[5], kernel_size=(1, 1), padding='same', activation='relu')(path4) # Concatenation output = layers.concatenate([path1, path2, path3, path4], axis=3) return output ``` 接下来,我们构建一个完整的GoogLeNet模型: ```python def GoogLeNet(input_shape, num_classes): input = layers.Input(shape=input_shape) x = layers.Conv2D(64, kernel_size=(7, 7), strides=(2, 2), padding='same', activation='relu')(input) x = layers.MaxPooling2D((3, 3), strides=(2, 2), padding='same')(x) x = layers.Conv2D(64, kernel_size=(1, 1), strides=(1, 1), padding='same', activation='relu')(x) x = layers.Conv2D(192, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu')(x) x = layers.MaxPooling2D((3, 3), strides=(2, 2), padding='same')(x) x = inception_block(x, [64, 96, 128, 16, 32, 32]) x = inception_block(x, [128, 128, 192, 32, 96, 64]) x = layers.MaxPooling2D((3, 3), strides=(2, 2), padding='same')(x) x = inception_block(x, [192, 96, 208, 16, 48, 64]) x = inception_block(x, [160, 112, 224, 24, 64, 64]) x = inception_block(x, [128, 128, 256, 24, 64, 64]) x = inception_block(x, [112, 144, 288, 32, 64, 64]) x = inception_block(x, [256, 160, 320, 32, 128, 128]) x = layers.MaxPooling2D((3, 3), strides=(2, 2), padding='same')(x) x = inception_block(x, [256, 160, 320, 32, 128, 128]) x = inception_block(x, [384, 192, 384, 48, 128, 128]) x = layers.GlobalAveragePooling2D()(x) x = layers.Dropout(0.4)(x) x = layers.Dense(num_classes, activation='softmax')(x) model = tf.keras.Model(input, x) return model ``` 最后,我们可以按照以下方式来使用该模型: ```python model = GoogLeNet(input_shape=(224, 224, 3), num_classes=1000) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) ``` 通过以上步骤,我们成功地使用TensorFlow实现了GoogLeNet模型。当然,这只是一个简化的示例,实际应用中可能需要进行一些调整和改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值