您的位置:首页 > 理论基础 > 计算机网络

数学之路(3)-机器学习(3)-机器学习算法-神经网络[21]

2013-09-08 20:31 316 查看
针对上节的风景图片分类,我们也可以使用多层感知器的神经网络

我们将样本图片分块提取特征,然后这些特征做为样本所属类的输入,训练的输出目标我们使用下面的矩阵来表示

[0,0,1]
[0,1,0]
[1,0,0]
第一行表示第一类,以此类推,最后一行表示最后一类


本博客所有内容是原创,如果转载请注明来源


http://blog.csdn.net/myhaspl/

整理输入样本与输出目标的代码如下:
#x和d样本初始化
train_x =[]
d=[]
sp_d=[]
sp_d.append([0,0,1])
sp_d.append([0,1,0])
sp_d.append([1,0,0])
#读取图片
for ii in xrange(1,4):
for jj in xrange(1,3):
fn='p'+str(ii)+'-'+str(jj)+'.jpg'
pictz=readpic(fn)
train_x.append(pictz)
d.append(sp_d[ii-1])

myinput=np.array(train_x)
mytarget=np.array(d)
mymax=np.max(myinput)
训练完成,我们用样本和未知图片进行测试

print u'\n训练神经网络完毕'
pl.subplot(111)
pl.plot(err)
pl.xlabel('Epoch number')
pl.ylabel('error (default SSE)')
print u"对样本进行测试"
simd= bpnet.sim(myinput)
mysimd=getresult(simd)
print mysimd
print u"进行仿真"
testpictz=np.array([readpic('ptest1.jpg')])
simtest=bpnet.sim(testpictz)
mysimtest=getresult(simtest)
print mysimtest
testpictz=np.array([readpic('ptest2.jpg')])
simtest=bpnet.sim(testpictz)
mysimtest=getresult(simtest)
print mysimtest
testpictz=np.array([readpic('ptest3.jpg')])
simtest=bpnet.sim(testpictz)
mysimtest=getresult(simtest)
print mysimtest
pl.show()
另外,为了保证神经网络的泛化性,我们将训练的目标误差率设得较高,为0.2,另外对仿真输出结果通过一个函数运算得出最终的输出结果,这个函数的功能就是取输出矩阵的3个元素最大值,输出最大值所在的位置,因为仿真输出结果数组索引以0为起点,所以将其加上1后即为图片属于的类型。

def getresult(simjg):
jg=[]
for j in xrange(0,len(simjg)):
maxjg=-2
nowii=0
for i in xrange(0,len(simjg[0])):
if simjg[j][i]>maxjg:
maxjg=simjg[j][i]
nowii=i
jg.append(len(simjg[0])-nowii)
return jg

泛化性指对一个映射给出一定的必要的训练样本训练后,网络能否对样本以外的样本给出较为准确的预测,泛化能力也就是神经网络用于对未知数据预测的能力。

运行后,效果不错,泛化能力也不错。

>>> runfile(r'I:\book_prog\ann_bppicsb1.py', wdir=r'I:\book_prog')
http://blog.csdn.net/myhaspl
myhaspl@qq.com

正在处理中

正在建立神经网络

训练神经网络中...

Epoch: 5; Error: 1.0814420868;

Epoch: 10; Error: 0.441414239355;

Epoch: 15; Error: 0.282786951037;

Epoch: 20; Error: 0.265960631109;

Epoch: 25; Error: 0.264202738281;

Epoch: 30; Error: 0.2235438277;

The goal of learning is reached

训练神经网络完毕

对样本进行测试

[1, 1, 2, 2, 3, 3]

进行仿真

===ptest1.jpg===

[[-0.49165957  0.23890683  0.98145658]]

[1]

===ptest2.jpg===

[[ 0.6871799   0.97719221  0.63006021]]

[2]

===ptest3.jpg===

[[ 0.76380555  0.35239096  0.44558729]]

[3]

>>> 

下面是该 神经网络的误差训练效果,我们调用了第三方的纯python神经网络库来实现,每个样本的输入项有600个元素,训练速度较慢,但训练过程的误差下降比较平滑。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: