针对上节的风景图片分类,我们也可以使用多层感知器的神经网络
我们将样本图片分块提取特征,然后这些特征做为样本所属类的输入,训练的输出目标我们使用下面的矩阵来表示
[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个元素,训练速度较慢,但训练过程的误差下降比较平滑。