书上的一个例子,是要识别英文字符C、I、T。
则XC=(1,1,1,1,0,0,1,1,1),XI=(0,1,0,0,1,0,0,1,0),XT=(1,1,1,0,1,0,0,1,0)。
1.标准BP算法
网络图我就不画了。
输入层X=(x0,x1,x2,...xi,...,xn)
隐藏层Y=(y0,y1,y2,...,yj,...,ym)
x0=y0=-1
输出层O=(o1,o2,...,ok,...,ol)
期望输出D=(d1,d2,...,dk,...,dl)
输入层到隐藏层的权重Vij
隐藏层到输出层的权重Wjk
对于输出层:
净输入
输出
对于隐藏层:
净输入
输出
变换函数f(x)采用单极形Sigmoid函数:
函数具有性质:
采用批训练法,误差是所有样本的均方误差和:
显然误差E是网络权值W和V的函数,E分别对W和V求偏导得到E的梯度,要减小误差E,则权值W和V调整的方向就应该是误差梯度的反方向。结合(1)式(2)式可得权值调整公式:
上代码:
首先从复旦语料库全体训练集中随机挑取360个训练样本(每类40个)作为神经网络的输入
View Code
#/usr/bin/perl
srand();
my $outf="/home/orisun/master/fudan_corpus/tc_ann.txt";
open OUT,">$outf" or die "Can't open file:$!";
my $dir_prefix="/home/orisun/master/fudan_corpus/train_vec/";
my @cat=qw/C3-Art_ws C7-History_ws C11-Space_ws C19-Computer_ws C31-Enviornment_ws C32-Agriculture_ws C34-Economy_ws C38-Politics_ws C39-Sports_ws/;
foreach(0..$#cat){
$dir=$dir_prefix.$cat[$_];
opendir(DIR,"$dir") or die "Can't open directory:$!";
@files=grep {/^[^\.]/} readdir(DIR); #文件不能以.开头