Matlab实现图像识别(三)

这节实现一个简单的神经网络。

首先要有一个60*80=4800的输入层,我们将img进行reshape就可以得到了。
 

input = reshape(img, 4800, 1);

这样我们就将img转化成四千八百行,1列的一个列向量 。

但其实这个并不是列向量,因为img每一个单元都有3个的分量,需要通过im2double来转化:

input = im2double(input);

这样才算成功转化。

然后我们设计隐藏层,隐藏层的话,一般隐藏层是输入层的一倍或者两倍就够了,现在调成五千个节点。然后我们设计w为五千行,四千八百列的一个数组,内容初始化为random的函数。
 

w1 = rand(5000, 4800);


b1为五千列一行的向量,初始化为随机,不贴代码了。

然后进行输入层到隐含层的转移,添加一个sigmoid激活函数,如果有更好的激活函数,以后再改:
 

hide = sigmoid_mat(w1*input+b1);

关于这个Sigmiod函数,我们另开一个函数脚本,脚本里面有这个函数和它的导数,然后引用就可以了。
新开一个脚本sigmoid.m,写入代码:

function y = sigmoid(x)
y = 1./(1+e^(-x));
end

这样就实现了sigmoid激活函数,但是这个只是一个数的sigmoid函数,如果实现一个向量的sigmoid函数就更方便了,新建文件sigmoid_mat.m里写入:

function Y = sigmoid_mat(X)
len = length(X);
Y = zero(len, 1);
for i = 1:len
    Y(i,1) = sigmoid(X(i,1));
end
end

这样就实现了向量的sigmoid函数。

然后设计输出层,没错隐藏层就一层,现在是先让它跑起来,再慢慢改。输出层有101个节点,从0~100标记上数字,然后让名字按照字典序一一对应即可,它的w2是101行,五千列的一个向量,b2是101行,1列的向量。

w2 = rand(101, 5000);
b2 = rand(101, 1);
output = sigmoid(w2*hide+b2);

这样前向传播就完成了。下面实现反向传播。

 

  • 5
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值