为了caffe(四)学习人家的文章
配置 联想笔记本G480 双显卡(intel集成显卡和N卡独立显卡GeForce610M)
ubuntu14.0464位 cuda7.5 cudnn5.1 opencv3.0 +caffe
现在是2016年8月这个方法早晚失效 我因为看别人教程 安装过程中各个版本问题兼职要吐了 记录一下
接着上文的 配置完成 python 再往下写
1 学习这一篇
http://www.cnblogs.com/denny402/p/5082341.html
(0)
sudo vi examples/images/create_filelist.sh
这个地方的目录应该错了 不能对应后面的 注意作者一点都没错 是运行的时候应该,用/ 进入文件夹执行, 不是cd进入文件夹执行。
(1)
# /usr/bin/env sh
表示用sh解释执行下面的代码???
(2)
# /usr/bin/env sh
DATA=examples/images
echo "Create train.txt..."
rm -rf $DATA/train.txt
find $DATA -name *cat.jpg | cut -d '/' -f3 | sed "s/$/ 1/">>$DATA/train.txt
find $DATA -name *bike.jpg | cut -d '/' -f3 | sed "s/$/ 2/">>$DATA/tmp.txt
cat $DATA/tmp.txt>>$DATA/train.txt
rm -rf $DATA/tmp.txt
echo "Done.."
问题:: rm是删除啊 不是要创建这个 train.txt文件吗??? 不懂啊??
执行::
dong@dong-Lenovo-G480:~/caffe/examples/images$ sudo sh create_filelist.sh
Create train.txt...
create_filelist.sh: 5: create_filelist.sh: cannot create examples/images/train.txt: Directory nonexistent
find: `examples/images': No such file or directory
create_filelist.sh: 6: create_filelist.sh: cannot create examples/images/tmp.txt: Directory nonexistent
find: `examples/images': No such file or directory
create_filelist.sh: 7: create_filelist.sh: cannot create examples/images/train.txt: Directory nonexistent
Done..
注意:::
dong@dong-Lenovo-G480:~/caffe$ sudo ./create_lmdb.sh 不能以./运行,可是例程上的可以这样啊
sudo: ./: command not found
dong@dong-Lenovo-G480:~/caffe$ ./create_lmdb.sh 不加sudo又说没权限
bash: ./create_lmdb.sh: Permission denied
不知道为什么?
猜测解决办法: 应该是切换到root用户在吧,我猜的 ,虽然我现在还没设置root用户,不过没关系,可以sudo sh create_filelist.sh 。。。。。
问题::目录 照抄人家的 目录写的不对
应该
# /usr/bin/env sh
DATA=/home/dong/caffe/examples/images 这里第二行要该一下,,正确的绝对目录注意作者一点都没错 是运行的时候应该,用/ 进入文件夹执行, 不是cd进入文件夹执行。
echo "Create train.txt..."
rm -rf $DATA/train.txt
find $DATA -name *cat.jpg | cut -d '/' -f3 | sed "s/$/ 1/">>$DATA/train.txt
find $DATA -name *bike.jpg | cut -d '/' -f3 | sed "s/$/ 2/">>$DATA/tmp.txt
cat $DATA/tmp.txt>>$DATA/train.txt
rm -rf $DATA/tmp.txt
echo "Done.."
这样就行了
dong@dong-Lenovo-G480:~/caffe/examples/images$ sudo sh create_filelist.sh
Create train.txt...
Done..
失败了 得到了train.txt
dong 1
dong 2
解决:::
# /usr/bin/env sh
DATA=/home/dong/caffe/examples/images 这里第二行要该一下,,正确的绝对目录注意作者一点都没错 是运行的时候应该,用/ 进入文件夹执行, 不是cd进入文件夹执行。
echo "Create train.txt..."
rm -rf $DATA/train.txt
find $DATA -name *cat.jpg | cut -d '/' -f7 | sed "s/$/ 1/">>$DATA/train.txt 改成7就ok了注意作者一点都没错 是运行的时候应该,用/ 进入文件夹执行, 不是cd进入文件夹执行。
find $DATA -name *bike.jpg | cut -d '/' -f7 | sed "s/$/ 2/">>$DATA/tmp.txt
cat $DATA/tmp.txt>>$DATA/train.txt
rm -rf $DATA/tmp.txt
echo "Done.."
cut -d '/' -f3 表示用分割当前目录, -d‘/’表示用‘/’分割 -f3取分割后的第3个字符
搞明白了cut,但是还是不知道sed的具体格式,虽然明白的sed在这里大概起什么作用。。
然而以上这些调整都可以避免的注意作者一点都没错 是运行的时候应该,用/ 进入文件夹执行, 不是cd进入文件夹执行。
只要create_filelist.sh文件保存在home/dong/cafffe文件夹下面,,,注意作者一点都没错
这就对上作者
再一个字不动的复制
# /usr/bin/env sh
DATA=examples/images
echo "Create train.txt..."
rm -rf $DATA/train.txt
find $DATA -name *cat.jpg | cut -d '/' -f3 | sed "s/$/ 1/">>$DATA/train.txt
find $DATA -name *bike.jpg | cut -d '/' -f3 | sed "s/$/ 2/">>$DATA/tmp.txt
cat $DATA/tmp.txt>>$DATA/train.txt
rm -rf $DATA/tmp.txt
echo "Done.."
因为
dong@dong-Lenovo-G480:~/caffe$ find examples/images/ -name *cat.jpg
examples/images/cat.jpg
就得到正确的train文件 了
(3)
还是create_lmdb.sh 文件要放在caffe目录下面,原作者有点对应不上!!!!注意作者一点都没错
这次又报错了
dong@dong-Lenovo-G480:~/caffe$ sudo sh create_lmdb.sh
I0829 08:54:23.647409 4489 convert_imageset.cpp:86] Shuffling data
modprobe: FATAL: Module nvidia-uvm not found.
E0829 08:54:24.333425 4489 common.cpp:113] Cannot create Cublas handle. Cublas won't be available.
modprobe: FATAL: Module nvidia-uvm not found.
E0829 08:54:24.455603 4489 common.cpp:120] Cannot create Curand generator. Curand won't be available.
I0829 08:54:24.471488 4489 convert_imageset.cpp:89] A total of 2 images.
I0829 08:54:24.476830 4489 db_lmdb.cpp:35] Opened lmdb examples/images/img_train_lmdb
E0829 08:54:24.493015 4489 io.cpp:80] Could not open or find file /home/xxx/caffe/examples/images/cat.jpg
E0829 08:54:24.493057 4489 io.cpp:80] Could not open or find file /home/xxx/caffe/examples/images/fish-bike.jpg
解决问题: 挂载UVM模块,,,前面说过了
注意::要修改成自己的目录 那个xxx那里
#!/usr/bin/en sh
DATA=examples/images
rm -rf $DATA/img_train_lmdb
build/tools/convert_imageset --shuffle \
--resize_height=256 --resize_width=256 \
/home/xxx/caffe/examples/images/ $DATA/train.txt $DATA/img_train_lmdb
成功
dong@dong-Lenovo-G480:~/caffe$ sudo sh create_lmdb.sh
I0829 09:01:00.050668 4629 convert_imageset.cpp:86] Shuffling data
I0829 09:01:00.309527 4629 convert_imageset.cpp:89] A total of 2 images.
I0829 09:01:00.309783 4629 db_lmdb.cpp:35] Opened lmdb examples/images/img_train_lmdb
I0829 09:01:00.922224 4629 convert_imageset.cpp:153] Processed 2 files.
(4)
注意作者一点都没错,是我蠢,不了解linux,,,我的错
注意作者一点都没错 是运行的时候应该,用/ 进入文件夹执行, 不是cd进入文件夹执行。
dong@dong-Lenovo-G480:~/caffe$ sudo sh examples/images/create_filelist.sh
如果这样就ok,,这是原作者运行程序的命令,这样的话sh文件里面的DATA=examples/images这句话就对应到了正确的目录。。因为这时候就再caffe目录下面,DATA就是往后加路径
。就是说现在是再caffe目录下,找到examples/images里面的create_filelist.sh文件,再运行它
dong@dong-Lenovo-G480:~/caffe/examples/images$ sudo sh create_filelist.sh
这样就不行,,,,这样路径就不对了,
这种事只要自己做一遍,才能弄懂啊,我也是看后后一篇博客才弄动的
2 学习这一章http://www.cnblogs.com/denny402/p/5083300.html
从自己的原始图片,,,,生成txt清单,文件,,,生成到lmdb数据,,,,,再计算均值并保存,,图片减去均值再训练,会提高训练速度和精度。因此,一般都会有这个操作。
,,,,,,使用caffe中自带的一个网络模型,,,再到训练和测试模型的整个流程。
(1)solver.prototxt参数解释::
net: "examples/myfile/train_val.prototxt" 网络模型的路径。注意的是:文件的路径要从caffe的根目录开始,其它的所有配置都是这样。
test_iter: 2 这个要结合layer理解,,,,在layer文件train_val.prototxt里面,的数据层里面,有这样一行batch_size: 50,,意思是每一次处理50张图片,(这里测试图片一共100张,),,那就是迭代2次,每次50张图片,????大概是这样吧
test_interval: 50 测试间隔。也就是每训练50次,才进行一次测试。
base_lr: 0.01 base_lr用于设置基础学习率,在迭代的过程中,可以对基础学习率进行调整。怎么样进行调整,就是调整的策略,由lr_policy来设置。
lr_policy: "step" - step: 如果设置为step,则还需要设置一个stepsize, 返回 base_lr * gamma ^ (floor(iter / stepsize)),其中iter表示当前的迭代次数
gamma: 0.1 上一次梯度更新的权重,具体可参看下一篇文章。
stepsize: 100
display: 20 每训练20次,在屏幕上显示一次。如果设置为0,则不显示。
max_iter: 500 最大迭代次数。这个数设置太小,会导致没有收敛,精确度很低。设置太大,会导致震荡,浪费时间。
momentum: 0.9 上一次梯度更新的权重,具体可参看下一篇文章。
weight_decay: 0.0005 权重衰减项,防止过拟合的一个参数。
solver_mode: GPU 设置运行模式。默认为GPU,如果你没有GPU,则需要改成CPU,否则会出错。
反正参数就是这些参数,更具体更深入理解起来,还要再学习。。。。
另外有个默认的参数:::
type: SGD
优化算法选择。这一行可以省掉,因为默认值就是SGD。总共有六种方法可选择,在本文的开头已介绍。
snapshot: 5000
snapshot_prefix: "/mnist/lenet"
快照。将训练出来的model和solver状态进行保存,snapshot用于设置训练多少次后进行保存,默认为0,不保存。
snapshot_prefix设置保存路径(lenet_iter_9380.caffemodel),就保存成这样了??!?!小问题下次自己改改试试就知道了。
还可以设置snapshot_diff,是否保存梯度值,默认为false,不保存。
也可以设置snapshot_format,保存的类型。有两种选择:HDF5 和BINARYPROTO ,默认为BINARYPROTO
(2)
# sudo build/tools/caffe train -solver examples/myfile/solver.prototxt
的时候
I0829 10:13:13.301354 5514 solver.cpp:337] Iteration 0, Testing net (#0)
F0829 10:13:13.675858 5514 syncedmem.cpp:64] Check failed: error == cudaSuccess (2 vs. 0) out of memory
*** Check failure stack trace: ***
@ 0x7f1c3490bdaa (unknown)
,遇到过这个错误,, (有说显存不够的,有说没开cuda的)
解决: 运行一下例程就好了,,
~/NVIDIA_CUDA-7.5_Samples/bin/x86_64/linux/release$ ./deviceQuery
不行啊,,,运行例程成功,,可是这个命令还是不行
,
1
网上有说调小batch_size的,,可是再mnist中batch_size: 100都可以啊(后面知道了,这是因为mnist图片小啊,,,28*28的),这才50就不行了???
还是要试试。。。。
试了试
本来batch_size =50 test_iter =2 failed test_iter是测试时候的参数,对应的batch_size也应该是修改test layer层里面的那个,这两个相乘要等于测试集数量,算是完成一次测试
更新 25 4 F
更新 10 10 好像失败了 没有显示准确率,也没有显示loss,
网上人家也没说要改 test_iter 啊 ,试试不改test_iter
这些都是不对的,都算是瞎比改了。。。。我想到一个可能行的办法,我猜,在train layer 和 test layer 里面 batch_size 都改成1 就是每次给GPU一张图片,我猜这就能跑得动了,就是会很慢,,然后对应的参数都要改,test_interval乘 train layer 里面 的batch_size要等于训练集数量 ,,test_iter乘 testlayer 里面 的batch_size要等于测试集数量 ,,,当然其他关联参数都要改,后面也会讲。
(test_interval是用于训练的时候,test_iter是用于测试的时候)
本来batch_size =50 test_iter =2 failed
本来batch_size =25 test_iter =2 failed
本来batch_size =10 test_iter =2 failed
本来batch_size =1 test_iter =2 failed 但是错误信息不同了
I0829 11:46:34.274477 2978 solver.cpp:337] Iteration 0, Testing net (#0)
I0829 11:46:37.660838 2978 solver.cpp:404] Test net output #0: accuracy = 0
I0829 11:46:37.775960 2978 solver.cpp:404] Test net output #1: loss = 6.93415 (* 1 = 6.93415 loss)
I0829 11:46:37.776021 2978 blocking_queue.cpp:50] Data layer prefetch queue empty
F0829 11:46:41.401602 2978 syncedmem.cpp:56] Check failed: error == cudaSuccess (2 vs. 0) out of memory
*** Check failure stack trace: ***
@ 0x7fb064d4bdaa (unknown)
@ 0x7fb064d4bce4 (unknown)
@ 0x7fb064d4b6e6 (unknown)
@ 0x7fb064d4e687 (unknown)
所以这条路走不通,,电脑显卡太烂了,不行啊
2
网上有说调小图片大小的,,这个就是要用很多显存的。。。我的显卡就是不够 我的G610M是1G显存
试试 这个还要重新弄啊
也试试
试过了上面的 电脑明显变卡了,,,重启了
图片从256*256 改成 128*128
修改create_lmdb.sh文件 一定要训练和测试都改成128 后来写:这里也是瞎改,caffenet要求最小277*277的图片,met模型确定后图片大小也是确定的啊
#!/usr/bin/env sh
MY=examples/myfile
echo "Create train lmdb.."
rm -rf $MY/img_train_lmdb
build/tools/convert_imageset \
--shuffle \
--resize_height=128 \
--resize_width=128 \
/home/dong/caffe/data/re/ \
$MY/train.txt \
$MY/img_train_lmdb
echo "Create test lmdb.."
rm -rf $MY/img_test_lmdb
build/tools/convert_imageset \
--shuffle \
--resize_width=128 \
--resize_height=128 \
/home/dong/caffe/data/re/ \
$MY/test.txt \
$MY/img_test_lmdb
echo "dear dong All Done.."
batch_size =50 test_iter =2 failed
I0829 12:00:23.859074 2618 data_transformer.cpp:25] Loading mean file from: examples/myfile/mean.binaryproto
I0829 12:00:23.860093 2625 db_lmdb.cpp:35] Opened lmdb examples/myfile/img_test_lmdb
F0829 12:00:23.861520 2618 data_transformer.cpp:466] Check failed: datum_height >= crop_size (128 vs. 227)
*** Check failure stack trace: ***
@ 0x7f23d1932daa (unknown)
@ 0x7f23d1932ce4 (unknown)
原因:
train_val.prototxt 文件里面 定义了网络 只列出一部分 #号应该表示注释吧
参数解释:::
name: "CaffeNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label" data 与 label: 在数据层中,至少有一个命名为data的top。如果有第二个top,一般命名为label。 这种(data,label)配对是分类模型所必需的。
include {
phase: TRAIN include: 一般训练的时候和测试的时候,模型的层是不一样的。该层(layer)是属于训练阶段的层,还是属于测试阶段的层,需要用include来指定。如果没有include参数,则表示该层既在训练模型中,又在测试模型中。
}
transform_param {
mirror: true # 1表示开启镜像,0表示关闭,也可用ture和false来表示
crop_size: 227 # 剪裁一个 227*227的图块,在训练阶段随机剪裁,在测试阶段从中间裁剪
mean_file: "examples/myfile/mean.binaryproto" # 用一个配置文件来进行均值操作
}
data_param {
source: "examples/myfile/img_train_lmdb"
batch_size: 256
backend: LMDB
}
}
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
mirror: false
crop_size: 227
mean_file: "examples/myfile/mean.binaryproto"
}
data_param {
source: "examples/myfile/img_test_lmdb"
batch_size: 50
backend: LMDB
}
}
那个227出错了,现在就128*128大小, 就不能剪裁227了。。。。
crop_size 改成56(傻了吧 应该是64吧,,不过怎么确定这个数啊,我都是猜的) 试试
I0829 12:12:41.591951 2802 net.cpp:434] conv3 <- norm2
I0829 12:12:41.591966 2802 net.cpp:408] conv3 -> conv3
@ 0x7fe13cfbeb5a caffe::DataLayer<>::load_batch()
@ 0x7fe13cf6a3d9 caffe::BasePrefetchingDataLayer<>::InternalThreadEntry()
@ 0x7fe13d090440 caffe::InternalThread::entry()
@ 0x7fe133b1da4a (unknown)
@ 0x7fe1333d5184 start_thread
@ 0x7fe13ba2b37d (unknown)
@ (nil) (unknown)
错误 不知道为什么
去掉 crop_size 试试: 后来写:瞎试
错误信息中有一行
data_transformer.cpp:63] Check failed: datum_height == data_mean_.height() (128 vs. 256)
意思是:这个高是128 那个高是256 不对了
原因:
create_lmdb.sh文件里面 我只把测试改成了128 忘了改训练图片大小了!!!!!
解决::
重新生成lmdb文件,mean文件,
这一次 就执行到这个,,,没有精度,没有loss,,,,什么鬼啊
I0829 12:54:18.403734 3299 net.cpp:157] Top shape: 50 4096 (204800)
I0829 12:54:18.403760 3299 net.cpp:165] Memory required for data: 24000600
I0829 12:54:18.403786 3299 layer_factory.hpp:77] Creating layer fc7
I0829 12:54:18.403821 3299 net.cpp:100] Creating Layer fc7
I0829 12:54:18.403848 3299 net.cpp:434] fc7 <- fc6
I0829 12:54:18.403880 3299 net.cpp:408] fc7 -> fc7
问题原因:
train_val.prototxt 最后的fc8层 num_output: 从本来的1000,,改成5 就对了 最后分为几类,就要num_output改成几 ,很重要
解决:
最后的参数是:
batch_size =50 test_iter =2 crop_size: 64 图片大小128*128 后来写:瞎试,一看参数就不行
num_output: 5
再来:
I0829 13:54:36.177572 2493 solver.cpp:317] Iteration 500, loss = 1.68928
I0829 13:54:36.177625 2493 solver.cpp:337] Iteration 500, Testing net (#0)
I0829 13:54:36.731336 2493 solver.cpp:404] Test net output #0: accuracy = 0
I0829 13:54:36.731397 2493 solver.cpp:404] Test net output #1: loss = 2.46704 (* 1 = 2.46704 loss)
I0829 13:54:36.731422 2493 solver.cpp:322] Optimization Done.
I0829 13:54:36.731442 2493 caffe.cpp:254] Optimization Done.
显然,准确率为 0
原因:
附录:
注意几个点::
1
,,在train和test过程中用了同一个均值文件,这个均值文件是来自训练数据的,,,,原作者说:验证或测试数据,减去的是训练集的均值,就是这样的,没有问题,,,,,,有人说:(谢谢,博主。我明白了,测试数据的均值和训练集的均值是一样,所以减去的是训练集的均值 就行。 是这样理解吗?)这样说法不对啊,一样吗??????
2
深度学习中的训练数据必须是标注好的,如果没有标注就没办法进行训练。将数据进行聚类用不着深度学习,用k-means就可以了。
3
深度学习主要的目的是用来自动提取特征(那么提取特征用来干什么啊??不还是分类什么的啊??是不是啊???),所以也叫无监督特征学习,以代替传统的手工提取特征。如果只是用来分类,就不叫深度学习,只能叫人工神经网络ANN(浅层网络).分类最好的还是传统的机器学习方法,如svm,随机森林等。
4
请问训练后的model怎么保存?谢谢!
修改solver.prototxt,设置snapshot和snapshot_prefix,snapshot用于设置训练多少次后进行保存,默认为0,不保存。snapshot_prefix设置保存路径。(具体怎么弄前面有讲)
5
显存不够时:
你可以试着从以下几个方面解决:
(1、将所有的batch_size设置为1
(2、逐渐减少训练图片数量。800张不行,就400张,还不行就200张,直至不报错。
(3、将图片resize至更小,如128*128或64*64,但resize到更小后就不能再用caffenet模型,因为该模型要求初始尺寸最小为227. resize至32*32后,可以使用cifar10模型。
特别是这个3,cifar10模型使用的图片大小为32*32,而caffenet使用的是227*227(裁剪后),不在一个量级,占用显存大小肯定相差悬殊。,,,,,就可能是这个原因使得 我精确度是0,
6
原作者说::::我将图片大小resize为256*256是因为caffenet这个模型需要(因为该模型要求初始尺寸最小为227),也就是说图片resize成多大是根据模型不同而变化的,如lenet模型就是28*28。
对第6条备注:这也就解决了,我的另一个问题:数据集和选取网络之间有什么关系???是不是某个数据集只能用与某个网络? 某个网络是不是只针对特定的数据集????举例来说:人们用了很多不同的网络, 应用到imagenet数据集上,比如alexnet,googlenet ,VGGNet...那么能不能在mnist数据集上用各种各样的网络,而不仅仅是LeNet?????
答案就是,网络对数据集有些要求。比如数据集中的图片的大小。比如这里的caffenet网络就要求了。。。
7
BVLC中的B是伯克利大学的意思
8今天要看完全部33篇啊,,时间不多了 8-29.
9
直接进入root用户不是必须,权限问题可以在命令行解决,我现在还没有建立root账户
10
每次重启ubuntu 都要自己手动禁用触摸板