为了caffe(四)学习人家的文章

为了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

不行啊,,,运行例程成功,,可是这个命令还是不行

网上有说调小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)

 

所以这条路走不通,,电脑显卡太烂了,不行啊

 

 

网上有说调小图片大小的,,这个就是要用很多显存的。。。我的显卡就是不够 我的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

 

原因:

 

 

 

 

附录:

 

注意几个点::

,,在train和test过程中用了同一个均值文件,这个均值文件是来自训练数据的,,,,原作者说:验证或测试数据,减去的是训练集的均值,就是这样的,没有问题,,,,,,有人说:(谢谢,博主。我明白了,测试数据的均值和训练集的均值是一样,所以减去的是训练集的均值 就行。 是这样理解吗?)这样说法不对啊,一样吗??????

 

深度学习中的训练数据必须是标注好的,如果没有标注就没办法进行训练。将数据进行聚类用不着深度学习,用k-means就可以了。

 

深度学习主要的目的是用来自动提取特征(那么提取特征用来干什么啊??不还是分类什么的啊??是不是啊???),所以也叫无监督特征学习,以代替传统的手工提取特征。如果只是用来分类,就不叫深度学习,只能叫人工神经网络ANN(浅层网络).分类最好的还是传统的机器学习方法,如svm,随机森林等。

 

请问训练后的model怎么保存?谢谢!

修改solver.prototxt,设置snapshot和snapshot_prefix,snapshot用于设置训练多少次后进行保存,默认为0,不保存。snapshot_prefix设置保存路径。(具体怎么弄前面有讲)

 

显存不够时:

你可以试着从以下几个方面解决:
(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

原作者说::::我将图片大小resize为256*256是因为caffenet这个模型需要(因为该模型要求初始尺寸最小为227),也就是说图片resize成多大是根据模型不同而变化的,如lenet模型就是28*28。

 

对第6条备注:这也就解决了,我的另一个问题:数据集和选取网络之间有什么关系???是不是某个数据集只能用与某个网络? 某个网络是不是只针对特定的数据集????举例来说:人们用了很多不同的网络, 应用到imagenet数据集上,比如alexnet,googlenet ,VGGNet...那么能不能在mnist数据集上用各种各样的网络,而不仅仅是LeNet?????

答案就是,网络对数据集有些要求。比如数据集中的图片的大小。比如这里的caffenet网络就要求了。。。

 

 

 

BVLC中的B是伯克利大学的意思

 

今天要看完全部33篇啊,,时间不多了   8-29.

 

直接进入root用户不是必须,权限问题可以在命令行解决,我现在还没有建立root账户

 

10 

每次重启ubuntu  都要自己手动禁用触摸板

 

 

 

 

 

 

你可能感兴趣的:(为了caffe(四)学习人家的文章)