这节实现一个简单的神经网络。
首先要有一个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);
这样前向传播就完成了。下面实现反向传播。