(pycharm+ssh)TF-Slim实现图像分类和迁移学习(亲测可
⽤)
⽼规矩,先向排坑路上学习到的博主致谢
本⽂主要就环境下,利⽤TF-Slim 轻量级api进⾏图像分类和迁移学习时⼀些细节进⾏盘点。实验难度不⼤,⼀些原理性的东西就不写了,我致谢中的第⼀篇博⽂写的很好了,⼤家可以看看。
实验环境:Win10+Python3.5+PyCharm++ssh+TensorFlow1.12,ssh连接的GPU服务器系统为Centos
实验环境搭建教程建议参考,灰常给⼒。搭建完成后,建议在PyCharm中使⽤⼀个remote host,可以在右边很⽅便地看到ssh 远程gpu 服务器上的⽂件
@夏花ln
为了使⽤TF-Slim api,我们要下载两个⽂件。⼀个是github上的tensorflow slim api,只需要slim部分即可。
另⼀个是pre-train预训练模型,需要哪个就下载哪个,在slim⽂件夹下新建个pre_train⽂件夹,放下载好的ckpt预训练模型
那么就以flowers数据集5分类为例⼦,开始吧:
1.PyCharm中新建⼯程,将下载好的slim⽂件夹拖进去
并在PyCharm中将slim⽂件夹与⼯程设置关联,如下图所⽰,右边蓝⾊部分flowertrain\slim即为已关联部分
2.制作TFRecord⽂件
该部分参考第⼀篇博⽂,blog.csdn/chaipp0607/article/details/78406880
TensorFlow-models内提供了⼀个download_and_convert_data.py⽂件,我们可以利⽤这个代码完成数据准备⼯作,但是在此之前,建议把download_and_convert_flowers.py⽂件中的210⾏代码注释掉,这样⼀来解压缩之后的原始数据就可以留下来了,这样⽅便我们查看。 注意⼀下我们要运⾏的是download_and_convert_data.py⽂件,要修改的是download_and_convert_flowers.py⽂件。这⾥我们下载并解压flowers数据集,Windows下可以直接在cmd中使⽤命令⾏,
python download_and_convert_data.py --dataset_name=flowers --dataset_dir=F:/PyWS/flowertrain/slim/flowers_5
使⽤Linux的同学可以直接运⾏.sh⽂件。
下载并解压成功后路径下应为这样,代码会随机的抽取350张图⽚组成验证集,剩下的3320张组成训练集,并分别打成5个TFRecord⽂件。
再回到floewers_5⽂件夹中,我们就可以看到下⾯这些东西,⼀个压缩⽂件,⼀个解压缩之后的⽂件夹,10个TFRecord⽂件和⼀个labels⽂件。
3.利⽤预训练模型Inception-V3训练新任务
pre_trian⽂件夹中存放着ckpt预训练模型,
pycharm安装教程win10
接下来可以来训练模型了。
说下利⽤shell脚本的⽅式,在slim⽂件夹下新建my_train⽂件夹⽤来存放等会训练的模型。继续,在slim⽂件夹下新建train.sh⽂件,COMMENT内为参数说明
<<COMMENT
shell脚本训练模型参数说明:
--train_dir:训练完成后⽣成的模型所在路径
--dataset_name:参与训练的数据集的名字
--dataset_split_name:数据集中的validation或train
--dataset_dir : 数据集路径
--model_name : 模型名字
--checkpoint_path : 下载的已经训练好的模型路径
--checkpoint_exclude_scopes : 指定载⼊预训练模型时哪⼀层的权重不被载⼊
--trainable_scope : 指定对哪⼀层参数进⾏训练;
--max_number_of_steps : 最⼤运⾏步数
--save_interval_secs=300 : 每300s保存⼀次模型到指定路径
--save_summaries_secs=2  : 每2s将⽇志写⼊
--log_every_n_steps=10 : 每10s打印⼀次
COMMENT
python3 train_image_classifier.py \
--train_dir=my_train \
--dataset_name=flowers \
--dataset_split_name=train \
--dataset_dir=flowers_5 \
-
-model_name=inception_v3 \
--checkpoint_path=pretrain/inception_v3.ckpt \
--checkpoint_exclude_scopes=InceptionV3/Logits,InceptionV3/AuxLogits \
--trainable_scope=InceptionV3/Logits,InceptionV3/AuxLogits \
--max_number_of_steps=1000 \
--batch_size=32 \
--learning_rate=0.001 \
--learning_rate_decay_type=fixed \
--save_interval_secs=300 \
--save_summaries_secs=2 \
--log_every_n_steps=10 \
-
-optimizer=rmsprop \
--weight_decay=0.00004
接下来需要排个坑,当你将本地的⽂件利⽤ssh同步到GPU服务器上,然后利⽤xshell在gpu上运⾏trian.sh⽂件时,就提⽰
ValueError: You must supply the dataset directory with --dataset_dir
还有⼀堆not found,路径不到之类的。
这个就是Linux在执⾏shell脚本,shell脚本在编写时的系统跟你的执⾏脚本的系统不⼀致造成的。如果你是直接在Linux中编写⽂件⾃然不会出现这个,但在Windows+Pycharm中,在windows下编辑的.sh⽂件的格式为dos格式,⽽linux只能执⾏格式为unix格式的脚本。因为在dos/window下按⼀次回车键实际上输⼊的是“回车(CR)”和“换⾏(LF)”,⽽Linux/unix下按⼀次回车键只输⼊“换⾏(LF)”,所以修改的sh⽂件在每⾏都会多了⼀个CR,所以Linux下运⾏时就会报错不到命令。另外就是当你在github上使⽤windows 系统下载源⽂件中包含shell脚本⽂件 时,当你解压并拷贝到Linux系统执⾏时,也可能发⽣此问题。
解决办法是:通过vi编辑器来查看⽂件的format格式。步骤如下:
1.⾸先在sh⽂件下⽤vi命令打开
vi train.sh
2.在vi命令模式中使⽤ :set ff 命令
可以看到⽂件的格式为
fileformat=dos
3.修改⽂件format为unix
使⽤vi/vim修改⽂件format
命令::set ff=unix
或者::set fileformat=unix
然后:wq保存退出,重新执⾏脚本就正常了
下图为修改后查询到的format格式,如图改为了unix格式