当前位置:文档之家› 卷积神经网络CNN相关代码注释

卷积神经网络CNN相关代码注释

卷积神经网络CNN相关代码注释
卷积神经网络CNN相关代码注释

cnnexamples.m

[plain]view plaincopy

1.clear all; close all; clc;

2.addpath('../data');

3.addpath('../util');

4.load mnist_uint8;

5.

6.train_x = double(reshape(train_x',28,28,60000))/255;

7.test_x = double(reshape(test_x',28,28,10000))/255;

8.train_y = double(train_y');

9.test_y = double(test_y');

10.

11.%% ex1

12.%will run 1 epoch in about 200 second and get around 11% error.

13.%With 100 epochs you'll get around 1.2% error

14.

https://www.doczj.com/doc/4914503490.html,yers = {

16. struct('type', 'i') %input layer

17. struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer

18. struct('type', 's', 'scale', 2) %sub sampling layer

19. struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution laye

r

20. struct('type', 's', 'scale', 2) %subsampling layer

21.};

22.

23.% 这里把cnn的设置给cnnsetup,它会据此构建一个完整的CNN网络,并返回

https://www.doczj.com/doc/4914503490.html,n = cnnsetup(cnn, train_x, train_y);

25.

26.% 学习率

27.opts.alpha = 1;

28.% 每次挑出一个batchsize的batch来训练,也就是每用batchsize个样本就调整一次权值,

而不是

29.% 把所有样本都输入了,计算所有样本的误差了才调整一次权值

30.opts.batchsize = 50;

31.% 训练次数,用同样的样本集。我训练的时候:

32.% 1的时候 11.41% error

33.% 5的时候 4.2% error

34.% 10的时候 2.73% error

35.opts.numepochs = 10;

36.

37.% 然后开始把训练样本给它,开始训练这个CNN网络

https://www.doczj.com/doc/4914503490.html,n = cnntrain(cnn, train_x, train_y, opts);

39.

40.% 然后就用测试样本来测试

41.[er, bad] = cnntest(cnn, test_x, test_y);

42.

43.%plot mean squared error

44.plot(cnn.rL);

45.%show test error

46.disp([num2str(er*100) '% error']);

cnnsetup.m

[plain]view plaincopy

1.function net = cnnsetup(net, x, y)

2. inputmaps = 1;

3. % B=squeeze(A) 返回和矩阵A相同元素但所有单一维都移除的矩阵B,单一维是满足

size(A,dim)=1的维。

4. % train_x中图像的存放方式是三维的reshape(train_x',28,28,60000),前面两维表示

图像的行与列,

5. % 第三维就表示有多少个图像。这样squeeze(x(:, :, 1))就相当于取第一个图像样本后,

再把第三维

6. % 移除,就变成了28x28的矩阵,也就是得到一幅图像,再size一下就得到了训练样本图

像的行数与列数了

7. mapsize = size(squeeze(x(:, :, 1)));

8.

9. % 下面通过传入net这个结构体来逐层构建CNN网络

10. % n = numel(A)返回数组A中元素个数

11. % https://www.doczj.com/doc/4914503490.html,yers中有五个struct类型的元素,实际上就表示CNN共有五层,这里范围的是

5

12. for l = 1 : numel(https://www.doczj.com/doc/4914503490.html,yers) % layer

13. if strcmp(https://www.doczj.com/doc/4914503490.html,yers{l}.type, 's') % 如果这层是子采样层

14. % subsampling层的mapsize,最开始mapsize是每张图的大小28*28

15. % 这里除以scale=2,就是pooling之后图的大小,pooling域之间没有重叠,

所以pooling后的图像为14*14

16. % 注意这里的右边的mapsize保存的都是上一层每张特征map的大小,它会随着

循环进行不断更新

17. mapsize = floor(mapsize / https://www.doczj.com/doc/4914503490.html,yers{l}.scale);

18. for j = 1 : inputmaps % inputmap就是上一层有多少张特征图

19. https://www.doczj.com/doc/4914503490.html,yers{l}.b{j} = 0; % 将偏置初始化为0

20. end

21. end

22. if strcmp(https://www.doczj.com/doc/4914503490.html,yers{l}.type, 'c') % 如果这层是卷积层

23. % 旧的mapsize保存的是上一层的特征map的大小,那么如果卷积核的移动步长

是1,那用

24. % kernelsize*kernelsize大小的卷积核卷积上一层的特征map后,得到的新

的map的大小就是下面这样

25. mapsize = mapsize - https://www.doczj.com/doc/4914503490.html,yers{l}.kernelsize + 1;

26. % 该层需要学习的参数个数。每张特征map是一个(后层特征图数量)*(用来卷积

的patch图的大小)

27. % 因为是通过用一个核窗口在上一个特征map层中移动(核窗口每次移动1个像

素),遍历上一个特征map

28. % 层的每个神经元。核窗口由kernelsize*kernelsize个元素组成,每个元素

是一个独立的权值,所以

29. % 就有kernelsize*kernelsize个需要学习的权值,再加一个偏置值。另外,

由于是权值共享,也就是

30. % 说同一个特征map层是用同一个具有相同权值元素的

kernelsize*kernelsize的核窗口去感受输入上一

31. % 个特征map层的每个神经元得到的,所以同一个特征map,它的权值是一样的,

共享的,权值只取决于

32. % 核窗口。然后,不同的特征map提取输入上一个特征map层不同的特征,所以

采用的核窗口不一样,也

33. % 就是权值不一样,所以outputmaps个特征map就有

(kernelsize*kernelsize+1)* outputmaps那么多的权值了

34. % 但这里fan_out只保存卷积核的权值W,偏置b在下面独立保存

35. fan_out = https://www.doczj.com/doc/4914503490.html,yers{l}.outputmaps * https://www.doczj.com/doc/4914503490.html,yers{l}.kernelsize ^

2;

36. for j = 1 : https://www.doczj.com/doc/4914503490.html,yers{l}.outputmaps % output map

37. % fan_out保存的是对于上一层的一张特征map,我在这一层需要对这一张

特征map提取outputmaps种特征,

38. % 提取每种特征用到的卷积核不同,所以fan_out保存的是这一层输出新的

特征需要学习的参数个数

39. % 而,fan_in保存的是,我在这一层,要连接到上一层中所有的特征map,

然后用fan_out保存的提取特征

40. % 的权值来提取他们的特征。也即是对于每一个当前层特征图,有多少个参

数链到前层

41. fan_in = inputmaps * https://www.doczj.com/doc/4914503490.html,yers{l}.kernelsize ^ 2;

42. for i = 1 : inputmaps % input map

43. % 随机初始化权值,也就是共有outputmaps个卷积核,对上层的每个

特征map,都需要用这么多个卷积核

44. % 去卷积提取特征。

45. % rand(n)是产生n×n的 0-1之间均匀取值的数值的矩阵,再减去0.5

就相当于产生-0.5到0.5之间的随机数

46. % 再 *2 就放大到 [-1, 1]。然后再乘以后面那一数,why?

47. % 反正就是将卷积核每个元素初始化为

[-sqrt(6 / (fan_in + fan_out)), sqrt(6 / (fan_in + fan_out))]

48. % 之间的随机数。因为这里是权值共享的,也就是对于一张特征map,

所有感受野位置的卷积核都是一样的

49. % 所以只需要保存的是 inputmaps * outputmaps 个卷积核。

50. https://www.doczj.com/doc/4914503490.html,yers{l}.k{i}{j} = (rand(https://www.doczj.com/doc/4914503490.html,yers{l}.kernelsize)

- 0.5) * 2 * sqrt(6 / (fan_in + fan_out));

51. end

52. https://www.doczj.com/doc/4914503490.html,yers{l}.b{j} = 0; % 将偏置初始化为0

53. end

54. % 只有在卷积层的时候才会改变特征map的个数,pooling的时候不会改变个数。

这层输出的特征map个数就是

55. % 输入到下一层的特征map个数

56. inputmaps = https://www.doczj.com/doc/4914503490.html,yers{l}.outputmaps;

57. end

58. end

59.

60. % fvnum 是输出层的前面一层的神经元个数。

61. % 这一层的上一层是经过pooling后的层,包含有inputmaps个特征map。每个特征map

的大小是mapsize。

62. % 所以,该层的神经元个数是 inputmaps * (每个特征map的大小)

63. % prod: Product of elements.

64. % For vectors, prod(X) is the product of the elements of X

65. % 在这里 mapsize = [特征map的行数特征map的列数],所以prod后就是特征map

的行*列

66. fvnum = prod(mapsize) * inputmaps;

67. % onum 是标签的个数,也就是输出层神经元的个数。你要分多少个类,自然就有多少个输

出神经元

68. onum = size(y, 1);

69.

70. % 这里是最后一层神经网络的设定

71. % ffb 是输出层每个神经元对应的基biases

72. net.ffb = zeros(onum, 1);

73. % ffW 输出层前一层与输出层连接的权值,这两层之间是全连接的

74. net.ffW = (rand(onum, fvnum) - 0.5) * 2 * sqrt(6 / (onum + fvnum));

75.end

cnntrain.m

[plain]view plaincopy

1.function net = cnntrain(net, x, y, opts)

2. m = size(x, 3); % m 保存的是训练样本个数

3. numbatches = m / opts.batchsize;

4. % rem: Remainder after division. rem(x,y) is x - n.*y 相当于求余

5. % rem(numbatches, 1) 就相当于取其小数部分,如果为0,就是整数

6. if rem(numbatches, 1) ~= 0

7. error('numbatches not integer');

8. end

9.

10. net.rL = [];

11. for i = 1 : opts.numepochs

12. % disp(X) 打印数组元素。如果X是个字符串,那就打印这个字符串

13. disp(['epoch ' num2str(i) '/' num2str(opts.numepochs)]);

14. % tic 和 toc 是用来计时的,计算这两条语句之间所耗的时间

15. tic;

16. % P = randperm(N) 返回[1, N]之间所有整数的一个随机的序列,例如

17. % randperm(6) 可能会返回 [2 4 5 6 1 3]

18. % 这样就相当于把原来的样本排列打乱,再挑出一些样本来训练

19. kk = randperm(m);

20. for l = 1 : numbatches

21. % 取出打乱顺序后的batchsize个样本和对应的标签

22. batch_x = x(:, :, kk((l - 1) * opts.batchsize + 1 : l * opts.bat

chsize));

23. batch_y = y(:, kk((l - 1) * opts.batchsize + 1 : l * opts.bat

chsize));

24.

25. % 在当前的网络权值和网络输入下计算网络的输出

26. net = cnnff(net, batch_x); % Feedforward

27. % 得到上面的网络输出后,通过对应的样本标签用bp算法来得到误差对网络权

28. %(也就是那些卷积核的元素)的导数

29. net = cnnbp(net, batch_y); % Backpropagation

30. % 得到误差对权值的导数后,就通过权值更新方法去更新权值

31. net = cnnapplygrads(net, opts);

32. if isempty(net.rL)

33. net.rL(1) = net.L; % 代价函数值,也就是误差值

34. end

35. net.rL(end + 1) = 0.99 * net.rL(end) + 0.01 * net.L; % 保存历史的

误差值,以便画图分析

36. end

37. toc;

38. end

39.

40.end

cnnff.m

[plain]view plaincopy

1.function net = cnnff(net, x)

2. n = numel(https://www.doczj.com/doc/4914503490.html,yers); % 层数

3. https://www.doczj.com/doc/4914503490.html,yers{1}.a{1} = x; % 网络的第一层就是输入,但这里的输入包含了多个训练图

4. inputmaps = 1; % 输入层只有一个特征map,也就是原始的输入图像

5.

6. for l = 2 : n % for each layer

7. if strcmp(https://www.doczj.com/doc/4914503490.html,yers{l}.type, 'c') % 卷积层

8. % !!below can probably be handled by insane matrix operations

9. % 对每一个输入map,或者说我们需要用outputmaps个不同的卷积核去卷积图

10. for j = 1 : https://www.doczj.com/doc/4914503490.html,yers{l}.outputmaps % for each output map

11. % create temp output map

12. % 对上一层的每一张特征map,卷积后的特征map的大小就是

13. % (输入map宽 - 卷积核的宽 + 1)* (输入map高 - 卷积核高 + 1)

14. % 对于这里的层,因为每层都包含多张特征map,对应的索引保存在每层map

的第三维

15. % 所以,这里的z保存的就是该层中所有的特征map了

16. z = zeros(size(https://www.doczj.com/doc/4914503490.html,yers{l - 1}.a{1}) - [https://www.doczj.com/doc/4914503490.html,yers{l}.kern

elsize - 1 https://www.doczj.com/doc/4914503490.html,yers{l}.kernelsize - 1 0]);

17. for i = 1 : inputmaps % for each input map

18. % convolve with corresponding kernel and add to temp ou

tput map

19. % 将上一层的每一个特征map(也就是这层的输入map)与该层的卷积

核进行卷积

20. % 然后将对上一层特征map的所有结果加起来。也就是说,当前层的一

张特征map,是

21. % 用一种卷积核去卷积上一层中所有的特征map,然后所有特征map对

应位置的卷积值的和

22. % 另外,有些论文或者实际应用中,并不是与全部的特征map链接的,

有可能只与其中的某几个连接

23. z = z + convn(https://www.doczj.com/doc/4914503490.html,yers{l - 1}.a{i}, https://www.doczj.com/doc/4914503490.html,yers{l}.k{i}

{j}, 'valid');

24. end

25. % add bias, pass through nonlinearity

26. % 加上对应位置的基b,然后再用sigmoid函数算出特征map中每个位置的

激活值,作为该层输出特征map

27. https://www.doczj.com/doc/4914503490.html,yers{l}.a{j} = sigm(z + https://www.doczj.com/doc/4914503490.html,yers{l}.b{j});

28. end

29. % set number of input maps to this layers number of outputmaps

30. inputmaps = https://www.doczj.com/doc/4914503490.html,yers{l}.outputmaps;

31. elseif strcmp(https://www.doczj.com/doc/4914503490.html,yers{l}.type, 's') % 下采样层

32. % downsample

33. for j = 1 : inputmaps

34. % !! replace with variable

35. % 例如我们要在scale=2的域上面执行mean pooling,那么可以卷积大小

为2*2,每个元素都是1/4的卷积核

36. z = convn(https://www.doczj.com/doc/4914503490.html,yers{l - 1}.a{j}, ones(https://www.doczj.com/doc/4914503490.html,yers{l}.scale)

/ (https://www.doczj.com/doc/4914503490.html,yers{l}.scale ^ 2), 'valid');

37. % 因为convn函数的默认卷积步长为1,而pooling操作的域是没有重叠的,

所以对于上面的卷积结果

38. % 最终pooling的结果需要从上面得到的卷积结果中以scale=2为步长,跳

着把mean pooling的值读出来

39. https://www.doczj.com/doc/4914503490.html,yers{l}.a{j} = z(1 : https://www.doczj.com/doc/4914503490.html,yers{l}.scale : end, 1 : ne

https://www.doczj.com/doc/4914503490.html,yers{l}.scale : end, :);

40. end

41. end

42. end

43.

44. % concatenate all end layer feature maps into vector

45. % 把最后一层得到的特征map拉成一条向量,作为最终提取到的特征向量

46. net.fv = [];

47. for j = 1 : numel(https://www.doczj.com/doc/4914503490.html,yers{n}.a) % 最后一层的特征map的个数

48. sa = size(https://www.doczj.com/doc/4914503490.html,yers{n}.a{j}); % 第j个特征map的大小

49. % 将所有的特征map拉成一条列向量。还有一维就是对应的样本索引。每个样本一列,

每列为对应的特征向量

50. net.fv = [net.fv; reshape(https://www.doczj.com/doc/4914503490.html,yers{n}.a{j}, sa(1) * sa(2), sa(3))]

;

51. end

52. % feedforward into output perceptrons

53. % 计算网络的最终输出值。sigmoid(W*X + b),注意是同时计算了batchsize个样本的输

出值

54. net.o = sigm(net.ffW * net.fv + repmat(net.ffb, 1, size(net.fv, 2)));

55.

56.end

cnnbp.m

[plain]view plaincopy

1.function net = cnnbp(net, y)

2. n = numel(https://www.doczj.com/doc/4914503490.html,yers); % 网络层数

3.

4. % error

5. net.e = net.o - y;

6. % loss function

7. % 代价函数是均方误差

8. net.L = 1/2* sum(net.e(:) .^ 2) / size(net.e, 2);

9.

10. %% backprop deltas

11. % 这里可以参考 UFLDL 的反向传导算法的说明

12. % 输出层的灵敏度或者残差

13. net.od = net.e .* (net.o .* (1 - net.o)); % output delta

14. % 残差反向传播回前一层

15. net.fvd = (net.ffW' * net.od); % feature vector delta

16. if strcmp(https://www.doczj.com/doc/4914503490.html,yers{n}.type, 'c') % only conv layers has sigm

function

17. net.fvd = net.fvd .* (net.fv .* (1 - net.fv));

18. end

19.

20. % reshape feature vector deltas into output map style

21. sa = size(https://www.doczj.com/doc/4914503490.html,yers{n}.a{1}); % 最后一层特征map的大小。这里的最后一层都是指

输出层的前一层

22. fvnum = sa(1) * sa(2); % 因为是将最后一层特征map拉成一条向量,所以对于一个样

本来说,特征维数是这样

23. for j = 1 : numel(https://www.doczj.com/doc/4914503490.html,yers{n}.a) % 最后一层的特征map的个数

24. % 在fvd里面保存的是所有样本的特征向量(在cnnff.m函数中用特征map拉成的),

所以这里需要重新

25. % 变换回来特征map的形式。d 保存的是 delta,也就是灵敏度或者残差

26. https://www.doczj.com/doc/4914503490.html,yers{n}.d{j} = reshape(net.fvd(((j - 1) * fvnum + 1) : j * fvn

um, :), sa(1), sa(2), sa(3));

27. end

28.

29. % 对于输出层前面的层(与输出层计算残差的方式不同)

30. for l = (n - 1) : -1 : 1

31. if strcmp(https://www.doczj.com/doc/4914503490.html,yers{l}.type, 'c')

32. for j = 1 : numel(https://www.doczj.com/doc/4914503490.html,yers{l}.a) % 该层特征map的个数

33. % https://www.doczj.com/doc/4914503490.html,yers{l}.d{j} 保存的是第l层的第j个 map 的灵敏度

map。也就是每个神经元节点的delta的值

34. % expand的操作相当于对l+1层的灵敏度map进行上采样。然后前面的操

作相当于对该层的输入a进行sigmoid求导

35. % 这条公式请参考 Notes on Convolutional Neural Networks

36. % for k = 1:size(https://www.doczj.com/doc/4914503490.html,yers{l + 1}.d{j}, 3)

37. % https://www.doczj.com/doc/4914503490.html,yers{l}.d{j}(:,:,k) = https://www.doczj.com/doc/4914503490.html,yers{l}.a{j}(:,:,k)

.* (1 - https://www.doczj.com/doc/4914503490.html,yers{l}.a{j}(:,:,k)) .* kron(https://www.doczj.com/doc/4914503490.html,yers{l + 1}.d{j}(:,:,k), on es(https://www.doczj.com/doc/4914503490.html,yers{l + 1}.scale)) / https://www.doczj.com/doc/4914503490.html,yers{l + 1}.scale ^ 2;

38. % end

39. https://www.doczj.com/doc/4914503490.html,yers{l}.d{j} = https://www.doczj.com/doc/4914503490.html,yers{l}.a{j} .* (1 - https://www.doczj.com/doc/4914503490.html,yers{l

}.a{j}) .* (expand(https://www.doczj.com/doc/4914503490.html,yers{l + 1}.d{j}, [https://www.doczj.com/doc/4914503490.html,yers{l + 1}.scale https://www.doczj.com/doc/4914503490.html,yer s{l + 1}.scale 1]) / https://www.doczj.com/doc/4914503490.html,yers{l + 1}.scale ^ 2);

40. end

41. elseif strcmp(https://www.doczj.com/doc/4914503490.html,yers{l}.type, 's')

42. for i = 1 : numel(https://www.doczj.com/doc/4914503490.html,yers{l}.a) % 第l层特征map的个数

43. z = zeros(size(https://www.doczj.com/doc/4914503490.html,yers{l}.a{1}));

44. for j = 1 : numel(https://www.doczj.com/doc/4914503490.html,yers{l + 1}.a) % 第l+1层特征map的个

45. z = z + convn(https://www.doczj.com/doc/4914503490.html,yers{l + 1}.d{j}, rot180(https://www.doczj.com/doc/4914503490.html,yers

{l + 1}.k{i}{j}), 'full');

46. end

47. https://www.doczj.com/doc/4914503490.html,yers{l}.d{i} = z;

48. end

49. end

50. end

51.

52. %% calc gradients

53. % 这里与 Notes on Convolutional Neural Networks 中不同,这里的子采样层没有

参数,也没有

54. % 激活函数,所以在子采样层是没有需要求解的参数的

55. for l = 2 : n

56. if strcmp(https://www.doczj.com/doc/4914503490.html,yers{l}.type, 'c')

57. for j = 1 : numel(https://www.doczj.com/doc/4914503490.html,yers{l}.a)

58. for i = 1 : numel(https://www.doczj.com/doc/4914503490.html,yers{l - 1}.a)

59. % dk 保存的是误差对卷积核的导数

60. https://www.doczj.com/doc/4914503490.html,yers{l}.dk{i}{j} = convn(flipall(https://www.doczj.com/doc/4914503490.html,yers{l - 1}

.a{i}), https://www.doczj.com/doc/4914503490.html,yers{l}.d{j}, 'valid') / size(https://www.doczj.com/doc/4914503490.html,yers{l}.d{j}, 3);

61. end

62. % db 保存的是误差对于bias基的导数

63. https://www.doczj.com/doc/4914503490.html,yers{l}.db{j} = sum(https://www.doczj.com/doc/4914503490.html,yers{l}.d{j}(:)) / size(net.

layers{l}.d{j}, 3);

64. end

65. end

66. end

67. % 最后一层perceptron的gradient的计算

68. net.dffW = net.od * (net.fv)' / size(net.od, 2);

69. net.dffb = mean(net.od, 2);

70.

71. function X = rot180(X)

72. X = flipdim(flipdim(X, 1), 2);

73. end

74.end

cnnapplygrads.m

[plain]view plaincopy

1.function net = cnnapplygrads(net, opts)

2. for l = 2 : numel(https://www.doczj.com/doc/4914503490.html,yers)

3. if strcmp(https://www.doczj.com/doc/4914503490.html,yers{l}.type, 'c')

4. for j = 1 : numel(https://www.doczj.com/doc/4914503490.html,yers{l}.a)

5. for ii = 1 : numel(https://www.doczj.com/doc/4914503490.html,yers{l - 1}.a)

6. % 这里没什么好说的,就是普通的权值更新的公式:

W_new = W_old - alpha * de/dW(误差对权值导数)

7. https://www.doczj.com/doc/4914503490.html,yers{l}.k{ii}{j} = https://www.doczj.com/doc/4914503490.html,yers{l}.k{ii}{j} - opts.a

lpha * https://www.doczj.com/doc/4914503490.html,yers{l}.dk{ii}{j};

8. end

9. end

10. https://www.doczj.com/doc/4914503490.html,yers{l}.b{j} = https://www.doczj.com/doc/4914503490.html,yers{l}.b{j} - opts.alpha * https://www.doczj.com/doc/4914503490.html,yer

s{l}.db{j};

11. end

12. end

13.

14. net.ffW = net.ffW - opts.alpha * net.dffW;

15. net.ffb = net.ffb - opts.alpha * net.dffb;

16.end

cnntest.m

[plain]view plaincopy

1.function [er, bad] = cnntest(net, x, y)

2. % feedforward

3. net = cnnff(net, x); % 前向传播得到输出

4. % [Y,I] = max(X) returns the indices of the maximum values in vector I

5. [~, h] = max(net.o); % 找到最大的输出对应的标签

6. [~, a] = max(y); % 找到最大的期望输出对应的索引

7. bad = find(h ~= a); % 找到他们不相同的个数,也就是错误的次数8.

9. er = numel(bad) / size(y, 2); % 计算错误率

10.end

卷积神经网络Convolutional Neural Networks(CNN)

卷积神经网络Convolutional Neural Networks(CNN)一、什么是卷积 首先回顾一下,数字图像处理中我们用卷积模板和原始图像的像素卷积。过程如下:Step 1、先将模板旋转180度(又称折叠) Step 2、然后让模板依次和原始图像重叠,并且计算重叠部分的数值乘积之和 以2D为例 先对模板K做折叠,然后依次覆盖图像I,并且计算重叠部分的数值乘积之和 依次进行到最后,会多出一圈,得到最后的卷积结果

卷积的意义(图像处理而言);对图像使用不同的卷积模板,对图像做不同的处理。比如平滑模板可以使图像模糊,并且可以减少噪声、锐化模板可以使图像的轮廓变得清晰。 二、卷积网络的结构 2.1 从BP网络到卷积网络 回想一下BP神经网络。BP网络每一层节点是一个线性的一维排列状态,层与层的网络节点之间是全连接的。这样设想一下,如果BP网络中层与层之间的节点连接不再是全连接,而是局部连接的。这样,就是一种最简单的一维卷积网络。如果我们把上述这个思路扩展到二维,这就是我们在大多数参考资料上看到的卷积神经网络。具体参看下图: 图1:全连接的2D 网络(BP网络)图2:局部连接的2D网络(卷积网络) 现在我们考虑单隐层结构, 上图左:全连接网络。如果我们有1000x1000像素的图像,有1百万个隐层神经元,每个隐层神经元都连接图像的每一个像素点,就有1000x1000x1000000=10^12个连接,也就是10^12个权值参数。上图右:局部连接网络,每一个节点与上层节点同位置附近10x10的窗口相连接,则1百万个隐层神经元就只有100w乘以100,即10^8个参数。其权值连接个数比原来减少了四个数量级。 因此,卷积网络降低了网络模型的复杂度,减少了权值的数量。该优点在网络的输入是多维图像时表现的更为明显,使图像可以直接作为网络的输入,避免了传统识别算法中复杂的特征提取和数据重建过程。

卷积神经网络CNN从入门到精通

卷积神经网络CNN从入门到精通 卷积神经网络算法的一个实现 前言 从理解卷积神经到实现它,前后花了一个月时间,现在也还有一些地方没有理解透彻,CNN还是有一定难度的,不是看哪个的博客和一两篇论文就明白了,主要还是靠自己去专研,阅读推荐列表在末尾的参考文献。目前实现的CNN在MINIT数据集上效果还不错,但是还有一些bug,因为最近比较忙,先把之前做的总结一下,以后再继续优化。 卷积神经网络CNN是Deep Learning的一个重要算法,在很多应用上表现出卓越的效果,[1]中对比多重算法在文档字符识别的效果,结论是CNN优于其他所有的算法。CNN在手写体识别取得最好的效果,[2]将CNN应用在基于人脸的性别识别,效果也非常不错。前段时间我用BP神经网络对手机拍照图片的数字进行识别,效果还算不错,接近98%,但在汉字识别上表现不佳,于是想试试卷积神经网络。 1、CNN的整体网络结构 卷积神经网络是在BP神经网络的改进,与BP类似,都采用了前向传播计算输出值,反向传播调整权重和偏置;CNN与标准的BP最大的不同是:CNN中相邻层之间的神经单元并不是全连接,而是部分连接,也就是某个神经单元的感知区域来自于上层的部分神经单元,而不是像BP那样与所有的神经单元相连接。CNN的有三个重要的思想架构: 局部区域感知 权重共享 空间或时间上的采样 局部区域感知能够发现数据的一些局部特征,比如图片上的一个角,一段弧,这些基本特征是构成动物视觉的基础[3];而BP中,所有的像素点是一堆混乱的点,相互之间的关系没有被挖掘。 CNN中每一层的由多个map组成,每个map由多个神经单元组成,同一个map 的所有神经单元共用一个卷积核(即权重),卷积核往往代表一个特征,比如某个卷积和代表一段弧,那么把这个卷积核在整个图片上滚一下,卷积值较大的区域就很有可能是一段弧。注意卷积核其实就是权重,我们并不需要单独去计算一个卷积,而是一个固定大小的权重矩阵去图像上匹配时,这个操作与卷积类似,因此我们称为卷积神经网络,实际上,BP也可以看做一种特殊的卷积神经网络,只是这个卷积核就是某层的所有权重,即感知区域是整个图像。权重共享策略减少了需要训练的参数,使得训练出来的模型的泛华能力更强。 采样的目的主要是混淆特征的具体位置,因为某个特征找出来后,它的具体位置已经不重要了,我们只需要这个特征与其他的相对位置,比如一个“8”,当我们得到了上面一个"o"时,我们不需要知道它在图像的具体位置,只需要知道它下面又是一个“o”我们就可以知道是一个'8'了,因为图片中"8"在图片中偏左或者偏右都不影响我们认识它,这种混淆具体位置的策略能对变形和扭曲的图片进行识别。 CNN的这三个特点是其对输入数据在空间(主要针对图像数据)上和时间(主要针对时间序列数据,参考TDNN)上的扭曲有很强的鲁棒性。CNN一般采用卷积层与

(完整版)卷积神经网络CNN原理、改进及应用

卷积神经网络(CNN) 一、简介 卷积神经网络(Convolutional Neural Networks,简称CNN)是近年发展起来,并引起广泛重视的一种高效的识别方法。 1962年,Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现其独特的局部互连网络结构可以有效地降低反馈神经网络的复杂性,继而提出了卷积神经网络[1](Convolutional Neural Networks-简称CNN)7863。现在,CNN已经成为众多科学领域的研究热点之一,特别是在模式分类领域,由于该网络避免了对图像的复杂前期预处理,可以直接输入原始图像,因而得到了更为广泛的应用。 Fukushima在1980年基于神经元间的局部连通性和图像的层次组织转换,为解决模式识别问题,提出的新识别机(Neocognitron)是卷积神经网络的第一个实现网络[2]。他指出,当在不同位置应用具有相同参数的神经元作为前一层的patches时,能够实现平移不变性1296。随着1986年BP算法以及T-C问题[3](即权值共享和池化)9508的提出,LeCun和其合作者遵循这一想法,使用误差梯度(the error gradient)设计和训练卷积神经网络,在一些模式识别任务中获得了最先进的性能[4][5]。在1998年,他们建立了一个多层人工神经网络,被称为LeNet-5[5],用于手写数字分类,这是第一个正式的卷积神经网

络模型3579。类似于一般的神经网络,LeNet-5有多层,利用BP算法来训练参数。它可以获得原始图像的有效表示,使得直接从原始像素(几乎不经过预处理)中识别视觉模式成为可能。然而,由于当时大型训练数据和计算能力的缺乏,使得LeNet-5在面对更复杂的问题时,如大规模图像和视频分类,不能表现出良好的性能。 因此,在接下来近十年的时间里,卷积神经网络的相关研究趋于停滞,原因有两个:一是研究人员意识到多层神经网络在进行BP训练时的计算量极其之大,当时的硬件计算能力完全不可能实现;二是包括SVM在内的浅层机器学习算法也渐渐开始暂露头脚。直到2006年,Hinton终于一鸣惊人,在《科学》上发表文章,使得CNN再度觉醒,并取得长足发展。随后,更多的科研工作者对该网络进行了改进。其中,值得注意的是Krizhevsky等人提出的一个经典的CNN架构,相对于图像分类任务之前的方法,在性能方面表现出了显著的改善2674。他们方法的整体架构,即AlexNet[9](也叫ImageNet),与LeNet-5相似,但具有更深的结构。它包括8个学习层(5个卷积与池化层和3个全连接层),前边的几层划分到2个GPU上,(和ImageNet 是同一个)并且它在卷积层使用ReLU作为非线性激活函数,在全连接层使用Dropout减少过拟合。该深度网络在ImageNet大赛上夺冠,进一步掀起了CNN学习热潮。 一般地,CNN包括两种基本的计算,其一为特征提取,每个神经元的输入与前一层的局部接受域相连,并提取该局部的特征。一旦该

(完整word版)深度学习-卷积神经网络算法简介

深度学习 卷积神经网络算法简介 李宗贤 北京信息科技大学智能科学与技术系 卷积神经网络是近年来广泛应用在模式识别、图像处理领域的一种高效识别算法,具有简单结构、训练参数少和适应性强的特点。它的权值共享网络结构使之更类似与生物神经网络,降低了网络的复杂度,减少了权值的数量。以二维图像直接作为网络的输入,避免了传统是被算法中复杂的特征提取和数据重建过程。卷积神经网络是为识别二维形状特殊设计的一个多层感知器,这种网络结构对于平移、比例缩放、倾斜和其他形式的变形有着高度的不变形。 ?卷积神经网络的结构 卷积神经网络是一种多层的感知器,每层由二维平面组成,而每个平面由多个独立的神经元组成,网络中包含一些简单元和复杂元,分别记为C元和S元。C元聚合在一起构成卷积层,S元聚合在一起构成下采样层。输入图像通过和滤波器和可加偏置进行卷积,在C层产生N个特征图(N值可人为设定),然后特征映射图经过求和、加权值和偏置,再通过一个激活函数(通常选用Sigmoid函数)得到S层的特征映射图。根据人为设定C层和S层的数量,以上工作依次循环进行。最终,对最尾部的下采样和输出层进行全连接,得到最后的输出。

卷积的过程:用一个可训练的滤波器fx去卷积一个输入的图像(在C1层是输入图像,之后的卷积层输入则是前一层的卷积特征图),通过一个激活函数(一般使用的是Sigmoid函数),然后加一个偏置bx,得到卷积层Cx。具体运算如下式,式中Mj是输入特征图的值: X j l=f?(∑X i l?1?k ij l+b j l i∈Mj) 子采样的过程包括:每邻域的m个像素(m是人为设定)求和变为一个像素,然后通过标量Wx+1加权,再增加偏置bx+1,然后通过激活函数Sigmoid产生特征映射图。从一个平面到下一个平面的映射可以看作是作卷积运算,S层可看作是模糊滤波器,起到了二次特征提取的作用。隐层与隐层之间的空间分辨率递减,而每层所含的平面数递增,这样可用于检测更多的特征信息。对于子采样层来说,有N 个输入特征图,就有N个输出特征图,只是每个特征图的的尺寸得到了相应的改变,具体运算如下式,式中down()表示下采样函数。 X j l=f?(βj l down (X j l?1) +b j l)X j l) ?卷积神经网络的训练过程 卷积神经网络在本质上是一种输入到输出的映射,它能够学习大量的输入和输出之间的映射关系,而不需要任何输入和输出之间的精确数学表达式。用已知的模式对卷积网络加以训练,网络就具有了输

卷积神经网络全面解析之算法实现

卷积神经网络全面解析之算法实现 前言 从理解卷积神经到实现它,前后花了一个月时间,现在也还有一些地方没有理解透彻,CNN还是有一定难度的,不是看哪个的博客和一两篇论文就明白了,主要还是靠自己去专研,阅读推荐列表在末尾的参考文献。目前实现的CNN在MINIT数据集上效果还不错,但是还有一些bug,因为最近比较忙,先把之前做的总结一下,以后再继续优化。 卷积神经网络CNN是Deep Learning的一个重要算法,在很多应用上表现出卓越的效果,[1]中对比多重算法在文档字符识别的效果,结论是CNN优于其他所有的算法。CNN 在手写体识别取得最好的效果,[2]将CNN应用在基于人脸的性别识别,效果也非常不错。前段时间我用BP神经网络对手机拍照图片的数字进行识别,效果还算不错,接近98%,但在汉字识别上表现不佳,于是想试试卷积神经网络。 1、CNN的整体网络结构 卷积神经网络是在BP神经网络的改进,与BP类似,都采用了前向传播计算输出值,反向传播调整权重和偏置;CNN与标准的BP最大的不同是:CNN中相邻层之间的神经单元并不是全连接,而是部分连接,也就是某个神经单元的感知区域来自于上层的部分神经单元,而不是像BP那样与所有的神经单元相连接。CNN的有三个重要的思想架构: ?局部区域感知 ?权重共享 ?空间或时间上的采样 局部区域感知能够发现数据的一些局部特征,比如图片上的一个角,一段弧,这些基本特征是构成动物视觉的基础[3];而BP中,所有的像素点是一堆混乱的点,相互之间的关系没有被挖掘。 CNN中每一层的由多个map组成,每个map由多个神经单元组成,同一个map的所有神经单元共用一个卷积核(即权重),卷积核往往代表一个特征,比如某个卷积和代表一段弧,那么把这个卷积核在整个图片上滚一下,卷积值较大的区域就很有可能是一段弧。注意卷积核其实就是权重,我们并不需要单独去计算一个卷积,而是一个固定大小的权重矩阵去图像上匹配时,这个操作与卷积类似,因此我们称为卷积神经网络,实际上,BP也可以看做一种特殊的卷积神经网络,只是这个卷积核就是某层的所有权重,即感知区域是整个图像。权重共享策略减少了需要训练的参数,使得训练出来的模型的泛华能力更强。 采样的目的主要是混淆特征的具体位置,因为某个特征找出来后,它的具体位置已经不重要了,我们只需要这个特征与其他的相对位置,比如一个“8”,当我们得到了上面一个"o"时,我们不需要知道它在图像的具体位置,只需要知道它下面又是一个“o”我们就可以知道是一个'8'了,因为图片中"8"在图片中偏左或者偏右都不影响我们认识它,这种混淆具体位置的策略能对变形和扭曲的图片进行识别。 CNN的这三个特点是其对输入数据在空间(主要针对图像数据)上和时间(主要针对时间序列数据,参考TDNN)上的扭曲有很强的鲁棒性。CNN一般采用卷积层与采样层交

一文读懂卷积神经网络CNN

一文读懂卷积神经网络CNN ★据说阿尔法狗战胜李世乭靠的是卷积神经网络算法,所以小编找到了一篇介绍该算法的文章,大家可以看一看。★ 自去年七月份以来,一直在实验室负责卷积神经网络(Convolutional Neural Network,CNN),期间配置和使用过theano和cuda-convnet、cuda-convnet2。为了增进CNN的理解和使用,特写此博文,以其与人交流,互有增益。正文之前,先说几点自己对于CNN的感触。先明确一点就是,Deep Learning是全部深度学习算法的总称,CNN是深度学习算法在图像处理领域的一个应用。第一点,在学习Deep learning 和CNN之前,总以为它们是很了不得的知识,总以为它们能解决很多问题,学习了之后,才知道它们不过与其他机器学习算法如svm等相似,仍然可以把它当做一个分类器,仍然可以像使用一个黑盒子那样使用它。第二点,Deep Learning强大的地方就是可以利用网络中间某一层的输出当做是数据的另一种表达,从而可以将其认为是经过网络学习到的特征。基于该特征,可以进行进一步的相似度比较等。第三点,Deep Learning算法能够有效的关键其实是大规模的数据,这一点原因在于每个DL都有众多的参数,少量数据无法将参数训练充分。接下来话不多说,直接奔入主题开始

CNN之旅。卷积神经网络简介(Convolutional Neural Networks,简称CNN)卷积神经网络是近年发展起来,并引起广泛重视的一种高效识别方法。20世纪60年代,Hubel 和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现其独特的网络结构可以有效地降低反馈神经网 络的复杂性,继而提出了卷积神经网络(Convolutional Neural Networks-简称CNN)。现在,CNN已经成为众多科学领域的研究热点之一,特别是在模式分类领域,由于该网络避免了对图像的复杂前期预处理,可以直接输入原始图像,因而得到了更为广泛的应用。K.Fukushima在1980年提出的新识别机是卷积神经网络的第一个实现网络。随后,更多的科研工作者对该网络进行了改进。其中,具有代表性的研究成果是Alexander和Taylor提出的“改进认知机”,该方法综合了各种改进方法的优点并避免了耗时的误差反向传播。一般地,CNN的基本结构包括两层,其一为特征提取层,每个神经元的输入与前一层的局部接受域相连,并提取该局部的特征。一旦该局部特征被提取后,它与其它特征间的位置关系也随之确定下来;其二是特征映射层,网络的每个计算层由多个特征映射组成,每个特征映射是一个平面,平面上所有神经元的权值相等。特征映射结构采用影响函数核小的sigmoid 函数作为卷积网络的激活函数,使得特征映射具有位移不变性。此外,由于一个映射面上的神经元共享权值,因而减少

卷积神经网络(CNN)学习笔记

CNN卷积神经网络 卷积神经网络是人工神经网络的一种,已成为当前语音分析和图像识别领域的研究热点。它的权值共享网络结构使之更类似于生物神经网络,降低了网络模型的复杂度,减少了权值的数量。该优点在网络的输入是多维图像时表现的更为明显,使图像可以直接作为网络的输入,避免了传统识别算法中复杂的特征提取和数据重建过程。卷积网络是为识别二维形状而特殊设计的一个多层感知器,这种网络结构对平移、比例缩放、倾斜或者共他形式的变形具有高度不变性。 CNNs是受早期的延时神经网络(TDNN)的影响。延时神经网络通过在时间维度上共享权值降低学习复杂度,适用于语音和时间序列信号的处理。 CNNs是第一个真正成功训练多层网络结构的学习算法。它利用空间关系减少需要学习的参数数目以提高一般前向BP算法的训练性能。CNNs作为一个深度学习架构提出是为了最小化数据的预处理要求。在CNN中,图像的一小部分(局部感受区域)作为层级结构的最低层的输入,信息再依次传输到不同的层,每层通过一个数字滤波器去获得观测数据的最显著的特征。这个方法能够获取对平移、缩放和旋转不变的观测数据的显著特征,因为图像的局部感受区域允许神经元或者处理单元可以访问到最基础的特征,例如定向边缘或者角点。 2)卷积神经网络的网络结构

图:卷积神经网络的概念示范:输入图像通过和三个可训练的滤波器和可加偏置进行卷积,滤波过程如图一,卷积后在C1层产生三个特征映射图,然后特征映射图中每组的四个像素再进行求和,加权值,加偏置,通过一个Sigmoid函数得到三个S2层的特征映射图。这些映射图再进过滤波得到C3层。这个层级结构再和S2一样产生S4。最终,这些像素值被光栅化,并连接成一个向量输入到传统的神经网络,得到输出。 一般地,C层为特征提取层,每个神经元的输入与前一层的局部感受野相连,并提取该局部的特征,一旦该局部特征被提取后,它与其他特征间的位置关系也随之确定下来;S层是特征映射层,网络的每个计算层由多个特征映射组成,每个特征映射为一个平面,平面上所有神经元的权值相等。特征映射结构采用影响函数核小的sigmoid函数作为卷积网络的激活函数,使得特征映射具有位移不变性。 此外,由于一个映射面上的神经元共享权值,因而减少了网络自由参数

卷积神经网络CNN代码解析-matlab

卷积神经网络CNN代码解析 deepLearnToolbox-master是一个深度学习matlab包,里面含有很多机器学习算法,如卷积神经网络CNN,深度信念网络DBN,自动编码AutoEncoder(堆栈SAE,卷积CAE)的作者是Rasmus Berg Palm (rasmusbergpalm@https://www.doczj.com/doc/4914503490.html,) 代码下载:https://https://www.doczj.com/doc/4914503490.html,/rasmusbergpalm/DeepLearnToolbox 这里我们介绍deepLearnToolbox-master中的CNN部分。 DeepLearnToolbox-master中CNN内的函数: 调用关系为: 该模型使用了mnist的数字mnist_uint8.mat作为训练样本,作为cnn的一个使用样例, 每个样本特征为一个28*28=的向量。

网络结构为: 让我们来看看各个函数: 一、Test_example_CNN: (2) 三、cnntrain.m (5) 四、cnnff.m (6) 五、cnnbp.m (7) 五、cnnapplygrads.m (10) 六、cnntest.m (11) 一、Test_example_CNN: Test_example_CNN: 1设置CNN的基本参数规格,如卷积、降采样层的数量,卷积核的大小、降采样的降幅 2 cnnsetup函数初始化卷积核、偏置等 3 cnntrain函数训练cnn,把训练数据分成batch,然后调用 3.1 cnnff 完成训练的前向过程,

3.2 cnnbp计算并传递神经网络的error,并计算梯度(权重的修改量) 3.3 cnnapplygrads 把计算出来的梯度加到原始模型上去 4 cnntest 函数,测试当前模型的准确率 该模型采用的数据为mnist_uint8.mat, 含有70000个手写数字样本其中60000作为训练样本,10000作为测试样本。把数据转成相应的格式,并归一化。 设置网络结构及训练参数 初始化网络,对数据进行批训练,验证模型准确率 绘制均方误差曲线 二、Cnnsetup.m 该函数你用于初始化CNN的参数。 设置各层的mapsize大小, 初始化卷积层的卷积核、bias 尾部单层感知机的参数设置 * bias统一设置为0

卷积神经网络

卷积神经网络 摘要:卷积神经网络是近年来广泛应用于模式识别、图像处理等领域的一种高效识别算法,它具有结构简单、训练参数少和适应性强等特点。本文从卷积神经网络的发展历史开始,详细阐述了卷积神经网络的网络结构、神经元模型和训练算法。在此基础上以卷积神经网络在人脸检测和形状识别方面的应用为例,简单介绍了卷积神经网络在工程上的应用,并给出了设计思路和网络结构。 关键字:模型;结构;训练算法;人脸检测;形状识别 0 引言 卷积神经网络是人工神经网络的一种已成为当前语音分析和图像识别领域的研究热点,它的权值共享网络结构使之更类似于生物神经网络,降低了网络模型的复杂度,减少了权值的数量。该优点在网络的输入是多维图像时表现的更为明显,使图像可以直接作为网络的输入,避免了传统识别算法中复杂的特征提取和数据重建过程。卷积网络是为识别二维形状而特殊设计的一个多层感知器,这种网络结构对平移、比例缩放、倾斜或者共他形式的变形具有高度不变性。 1 卷积神经网络的发展历史 1962年Hubel和Wiesel通过对猫视觉皮层细胞的研究,提出了感受野(receptive field)的概念,1984年日本学者Fukushima基于感受野概念提出的神经认知机(neocognitron)可以看作是卷积神经网络的第一个实现网络,也是感受野概念在人工神经网络领域的首次应用。神经认知机将一个视觉模式分解成许多子模式(特征),然后进入分层递阶式相连的特征平面进行处理,它试图将视觉系统模型化,使其能够在即使物体有位移或轻微变形的时候,也能完成识别。神经认知机能够利用位移恒定能力从激励模式中学习,并且可识别这些模式的变化形,在其后的应用研究中,Fukushima将神经认知机主要用于手写数字的识别。随后,国内外的研究人员提出多种卷积神经网络形式,在邮政编码识别和人脸识别方面得到了大规模的应用。 通常神经认知机包含两类神经元,即承担特征抽取的S-元和抗变形的C-元。S-元中涉及两个重要参数,即感受野与阈值参数,前者确定输入连接的数目,后者则控制对特征子模式的反应程度。许多学者一直致力于提高神经认知机的性能的研究:在传统的神经认知机中,每个S-元的感光区中由C-元带来的视觉模糊量呈正态分布。如果感光区的边缘所产生的模糊效果要比中央来得大,S-元将会接受这种非正态模糊所导致的更大的变形容忍性。我们希望得到的是,训练模式与变形刺激模式在感受野的边缘与其中心所产生的效果之间的差异变得越来越大。为了有效地形成这种非正态模糊,Fukushima提出了带双C-元层的改进型神经认知机。 Trotin 等人提出了动态构造神经认知机并自动降低闭值的方法[1],初始态的神经认知机各层的神经元数目设为零,然后会对于给定的应用找到合适的网络规模。在构造网络过程中,利用一个反馈信号来预测降低阈值的效果,再基于这种预测来调节阈值。他们指出这种自动阈值调节后的识别率与手工设置阈值的识别率相若,然而,上述反馈信号的具体机制并未给出,并且在他们后来的研究中承认这种自动阈值调节是很困难的【8】。 Hildebrandt将神经认知机看作是一种线性相关分类器,也通过修改阈值以使神经认知机成为最优的分类器。Lovell应用Hildebrandt的训练方法却没有成功。对此,Hildebrandt解释的是,该方法只能应用于输出层,而不能应用于网络的每一层。事实上,Hildebrandt没有考虑信息在网络传播中会逐层丢失。 Van Ooyen和Niehuis为提高神经认知机的区别能力引入了一个新的参数。事实上,该参数作为一种抑制信号,抑制了神经元对重复激励特征的激励。多数神经网络在权值中记忆训练信息。根据Hebb学习规则,某种特征训练的次数越多,在以后的识别过程中就越容易

关于卷积神经网络损失函数的改进算法

第39卷 第1期 高 师 理 科 学 刊 Vol. 39 No.1 2019年 1月 Journal of Science of Teachers′College and University Jan. 2019 文章编号:1007-9831(2019)01-0023-05 关于卷积神经网络损失函数的改进算法 徐振忠 (广东工业大学 应用数学学院,广东 广州 510520) 摘要:经典的卷积神经网络模型损失函数在设计时只考虑输出与标签之间的比较,没有涉及到图片之间的差异.为了提高卷积神经网络模型提取特征的差异,提出了基于Triplet network模型约束的卷积神经网络模型,这种方法提高了卷积神经网络提取有效特征的能力,减少数据集数量对于模型的影响. 在MNIST数据集和cifar-10数据集上进行实验,提出的新模型在这2个数据集上比经典的卷积神经网络模型识别效果更好. 关键词:卷积神经网络;Triplet network模型;反馈调节 中图分类号:TP391文献标识码:A doi:10.3969/j.issn.1007-9831.2019.01.007 An improved algorithm for the loss function of convolution neural networks XU Zhen-zhong (School of Applied Mathematics,Guangdong University of Technology,Guangzhou 510520,China) Abstract:The loss function of classical convolution neural network model only considers the comparison between output and label,but does not involve the difference between pictures.In order to improve the difference of feature extraction from convolutional neural network model,proposes a convolution neural network model based on Triplet network model constraint.This method improves the ability of convolution neural network in extracting effective features and reduces the infection due to the dataset′ number.MINIST datasets and cifar-10 datasets will be tested for certifying the effectiveness of this methed,and the result shows that the new model is better than the classical convolutional neural network model in recognition of these two datasets. Key words:convolution neural network;Triplet network model;back propagation 1980年,Fukushima根据Huble和Wiesel[1]的研究提出了多层感知机[2].多层感知机为卷积神经网络的出现奠定了重要的基础.Lecun[3]等在Fukushima的研究基础上采用BP算法建立了卷积神经网络(CNN)模型并运用到手写字符的识别上,并取得了一定的效果,该模型被称为LeNet-5.LeNet-5是最基本的CNN 模型,该模型包括输入层、卷积层、池化层、全连接层和输出层.后面的研究者大多在这个模型的基础上进行相应的改进.目前,对于经典CNN模型的改进大体从5个方面进行:(1)CNN结构的层数,如增加卷积层和池化层的数目,改变它们的顺序[4-5];(2)卷积核的大小和连接方式,如选择大小不同的卷积核进行组合[6-7];(3)池化的方式,如最大值池化和均值池化[8-9];(4)激活函数的选择,如sigmoid函数、tanh 函数和ReLU函数[10-11];(5)损失函数的选择,如采用不同的损失函数或在损失函数上加上相应的正则约 束[12-13].本文在经典CNN模型损失函数的基础上加了Triplet Network[14]的正则约束,得到基于Triplet network 模型约束的深度学习算法CNN模型(简称为TCNN).在经典CNN模型的损失函数中加入同类和异类的2 收稿日期:2018-10-05 作者简介:徐振忠(1992-),男,广东雷州人,在读硕士研究生,从事深度学习和图像识别及处理研究.E-mail:745007440@https://www.doczj.com/doc/4914503490.html,

卷积神经网络(CNN)代码实现(MNIST)解析

卷积神经网络(CNN)代码实现(MNIST) 解析 共7层:依次为输入层、C1层、S2层、C3层、S4层、C5层、输出层,C代表卷积层(特征提取),S代表降采样层或池化层(Pooling),输出层为全连接层。 1. 各层权值、偏置(阈值)初始化: 各层权值、偏置个数计算如下: (1)、输入层:预处理后的32*32图像数据,无权值和偏置; (2)、C1层:卷积窗大小5*5,输出特征图数量6,卷积窗种类1*6=6,输出特征图大小28*28,因此可训练参数(权值+偏置):(5*5*1)*6+6=150+6; (3)、S2层:卷积窗大小2*2,输出下采样图数量6,卷积窗种类6,输出下采样图大小14*14,因此可训练参数(权值+偏置):1*6+6=6+6; (4)、C3层:卷积窗大小5*5,输出特征图数量16,卷积窗种类6*16=96,输出特征图大小10*10,因此可训练参数(权值+偏置):(5*5*6)*16+16=2400+16; (5)、S4层:卷积窗大小2*2,输出下采样图数量16,卷积窗种类16,输出下采样图大小5*5,因此可训练参数(权值+偏置):1*16+16=16+16; (6)、C5层:卷积窗大小5*5,输出特征图数量120,卷积窗种类16*120=1920,输出特征图大小1*1,因此可训练参数(权值+偏置):(5*5*16)*120+120=48000+120; (7)、输出层:卷积窗大小1*1,输出特征图数量10,卷积窗种类120*10=1200,输出特征图大小1*1,因此可训练参数(权值+偏置):(1*120)*10+10=1200+10. 代码段如下: [cpp] view plain copy #define num_map_input_CNN 1 //输入层map个数 #define num_map_C1_CNN 6 //C1层map个数 #define num_map_S2_CNN 6 //S2层map个数 #define num_map_C3_CNN 16 //C3层map个数 #define num_map_S4_CNN 16 //S4层map个数 #define num_map_C5_CNN 120 //C5层map个数 #define num_map_output_CNN 10 //输出层map个数 #define len_weight_C1_CNN 150 //C1层权值数,(5*5*1)*6=150 #define len_bias_C1_CNN 6 //C1层阈值数,6

完整版一文读懂卷积神经网络CNN

一文读懂卷积神经网络CNN 第一点,在学习Deep learning和CNN之前,总以为它们是很了不得的知识,总以为它们能解决很多问题,学习了之后,才知道它们不过与其他机器学习算法如SVM等相似,仍然可以把它当作一个分类器,仍然可以像使用一个黑盒子那样使用它。 第二点,Deep Learning强大的地方就是可以利用网络中间某一层的输出当作是数据的另一种表达,从而可以将其认为是经过网络学习到的特征。基于该特征,可以进行进一步的相似度比较等。 第三点,Deep Learning算法能够有效的关键其实是大规模的数据,这一点原因在于每个DL都有众多的参数,少量数据无法将参数训练充分。 接下来话不多说,直接奔入主题开始CNN之旅。 卷积神经网络简介(Convolutional Neural Networks,简称CNN),卷积神经网络是近年发展起来,并引起广泛重视的一种高效识别方法。20世纪60年代,Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现其独特的网络结构可以有效地降低反馈神经网络的复杂性,继而提出了卷积神经网络(Convolutional Neural Networks-简称CNN )。现在,CNN已经成为众多科学领域的研究热点之一,特别是在模式分类领域,由于该网络避免了对图像的复杂前期预处理,可以直接输入原始图像,因而得到了更为广泛的应用。K.Fukushima 在1980年提出的新识别机是卷积神经网络的第一个实现网络。随后,更多的科研工作者对该网络进行了改进。其中,具有代表性的研究成果是Alexander和Taylor提出的改进认知机”该方法综合了各种改进方法的优点并避免了耗时的误差反向传播。

相关主题
文本预览
相关文档 最新文档