2014-09-28 51 views
0

有人可以检查我猜测输入/隐藏/输出层和整体参数中的神经元的数量是否正确。MATLAB中特定人工神经网络的体系结构

我此ANN的想法:

输入神经元:784(28x28)
隐藏层:1种
尺寸隐藏层(多个)的:25
激活函数:登陆乙状结肠
训练方法:梯度下降
数据大小:400 + 200

有400个bmp图像用于训练它,并有200个用于检查(但只有1-50会被100%的比率和其他0%的比率估计... )

clear all; 
clc 
for kk=1:400 
    pl=ones(28,28);      %³õʼ»¯28*28¶þֵͼÏñΪȫ°× 
    m=strcat('b',int2str(kk),'.bmp'); %Á¬½Ó×Ö·ûµÃµ½Ñù±¾ÎļþÃû 
    x=imread(m,'bmp');     %¶ÁÈëÑб¾ÎļþͼÏñ 
    pl=im2bw(x,0.5);     %°ÑÑù±¾Í¼Ïñת»¯Îª¶þֵͼ 
    for m=0:27       %ÐγÉÉñ¾­ÍøÂçÊäÈëÏòÁ¿ 
     p(m*28+1:(m+1)*28,kk)=pl(1:28,m+1); 
    end 
end 
%ÊÖдÌåÑù±¾¶ÔÓ¦µÄÊý×Ö£¨´Ób1.bmpµ½b400.bmp ¹²400¸ö£©£º 
t=[5 0 4 1 9 2 1 3 1 4 3 6 3 6 1 7 2 8 6 9 4 0 9 1 1 2 4 3 2 7 8 8 6 9 0 5 6 0 7...... 
    6 1 8 7 9 3 9 8 5 9 3 3 0 7 4 9 8 0 9 4 1 4 4 6 0 4 5 6 1 0 0 1 7 1 6 3 0 2 1...... 
    1 7 8 0 2 6 7 8 3 9 0 4 6 7 4 6 8 0 7 8 3 1 5 7 1 7 1 1 6 3 0 2 9 3 1 1 0 4 9...... 
    2 0 0 2 0 2 7 1 8 6 4 1 6 3 4 1 9 1 3 3 9 5 4 7 7 4 2 8 5 8 6 0 3 4 6 1 9 9 6...... 
    0 3 7 2 8 2 9 4 4 6 4 9 7 0 9 2 7 5 1 5 9 1 2 3 1 3 5 9 1 7 6 2 8 2 2 6 0 7 4...... 
    9 7 8 3 2 1 1 8 3 6 1 0 3 1 0 0 1 1 2 7 3 0 4 6 5 2 6 4 7 1 8 9 9 3 0 7 1 0 2...... 
    0 3 5 4 6 5 8 6 3 7 5 8 0 9 1 0 3 1 2 2 3 3 6 4 7 5 0 6 2 7 9 8 5 9 2 1 1 4 4...... 
    5 6 4 1 2 5 3 9 3 9 0 5 9 6 5 7 4 1 3 4 0 4 8 0 4 3 6 8 7 6 0 9 7 5 7 2 1 1 6...... 
    8 9 4 1 5 2 2 9 0 3 9 6 7 2 0 3 5 4 3 6 5 8 9 5 4 7 4 2 7 3 4 8 9 1 9 2 1 7 9...... 
    1 8 7 4 1 3 1 1 0 2 3 9 4 9 2 1 6 8 4 7 7 4 4 9 2 5 7 2 4 4 2 1 9 2 2 8 7 6 9...... 
    8 2 3 8 1 6 5 1 1 0]; 
%´´½¨BPÍøÂç 
pr(1:784,1)=0; 
pr(1:784,2)=1; 
t1=clock;     %¼Æʱ¿ªÊ¼ 
%ÉèÖÃѵÁ·²ÎÊý 
net=newff(pr,[25 1],{'logsig','purelin'},'traingdx','learngdm'); 
net.trainParam.epochs=5000;    %ÉèÖÃѵÁ·´ÎÊý 
net.trainParam.goal=0.05;    %ÉèÖÃÐÔÄܺ¯Êý 
net.trainParam.show=10;     %ÿ10ÏÔʾ 
net.trainParam.Ir=0.05;     %ÉèÖÃѧϰËÙÂÊ 
net=train(net,p,t);      %ѵÁ·BPÍøÂç 
datat=etime(clock,t1)     %¼ÆËãÉè¼ÆÍøÂçµÄʱ¼äΪ66.417s 
%Éú³É²âÊÔÑù±¾ 
pt(1:784,1)=1;      
pl=ones(28,28);       %³õʼ»¯28*28¶þֵͼÏñÏñËØ 
for kk=401:600 
    pl=ones(28,28);      %³õʼ»¯28*28¶þֵͼÏñΪȫ°× 
    m=strcat('b',int2str(kk),'.bmp'); %Á¬½Ó×Ö·ûµÃµ½Ñù±¾ÎļþÃû 
    x=imread(m,'bmp');     %¶ÁÈëÑб¾ÎļþͼÏñ 
    pl=im2bw(x,0.5);     %°ÑÑù±¾Í¼Ïñת»¯Îª¶þֵͼ 
    for m=0:27       %ÐγÉÉñ¾­ÍøÂçÊäÈëÏòÁ¿ 
     pt(m*28+1:(m+1)*28,kk-400)=pl(1:28,m+1); 
    end 
end 
[a,Pf,Af]=sim(net,pt);     %ÍøÂç·ÂÕæ 
a=round(a)        %Êä³öʶ±ð½á¹û 
%²âÊÔÑù±¾¶ÔÓ¦µÄÊý×Ö£¨´Ób401.bmpµ½b600.bmp ¹²200¸ö£©£º 
tl=[2 6 4 5 8 3 1 5 1 9 2 7 4 4 4 8 1 5 8 9 5 6 7 9 9 3 7 0 9...... 
    0 6 6 2 3 9 0 7 5 4 8 0 9 4 1 1 8 7 1 2 6 1 0 3 0 1 1 8 2 0 3 9 4 0 5 0 6 1 7...... 
    7 8 1 9 2 0 5 1 2 2 7 3 5 4 4 7 1 8 3 9 6 0 3 1 1 2 0 3 5 7 6 8 2 9 5 8 5 7 4...... 
    1 1 3 1 7 5 5 5 2 5 8 2 0 9 7 7 5 0 9 0 0 8 9 2 4 8 1 6 1 6 5 1 8 3 4 0 5 5 8...... 
    3 4 2 3 9 2 1 1 5 2 1 3 2 8 7 3 7 2 4 6 9 7 2 4 2 8 1 1 3 8 4 0 6 5 9 3 0 9 2...... 
    4 7 1 1 9 4 2 6 1 8 9 0 6 6 7]; 
k=0; 
for i=1:200 
    if a(i)==tl(i) 
     k=k+1; 
    end 
end 
rate=1.00*k/200;      %¼ÆËã×îºóÕýÈ·ÂÊΪ0.495 
+0

我不确定你在这里要求什么。这是关于神经网络体系结构,还是代码中存在产生不需要结果的问题?你能否提供更多信息?谢谢。 – 2014-09-29 03:33:43

+0

是的马修,它是关于神经网络。我在pudn找到了这个例子,我想看看我是否正确理解了NN的拓扑结构(什么是输入和输出等)。谢谢 – Munsta 2014-09-29 18:13:57

回答

0

我可能是错的,因为您没有指定输出神经元的数量和数据集中每个类的模式数量。但是,您似乎只为您的网络创建了一个输出神经元。在这种情况下,网络将所有模式分配到相同的类别,并且您获得的分类准确度等于先验概率。例如,如果数据集中的前50个模式属于同一个类,其余的则属于不同的类,则具有一个输出的分类器会将所有模式分配给第一个类,因此您将得到前50个。

如果是这种情况,您应该创建一个带有N个输出的分类器,其中N是数据集中类的数量。在这种情况下,分类器将为每个类投票,并将该模式​​分配给具有最大输出的类。例如,如果您有3个类,并且特定模式的输出为[0.2,0.83,0.6],则该模式将被分配给第二类。

此外,将图像转换为黑白图像可能不是最好的方法。将图像转换为灰度(以在一定程度上保留直方图)会更好,并使用一些归一化来弥补光照差异。

最后,请记住,神经网络本质上检测输入向量之间的相似性。所以,如果你需要对图片进行分类,你需要找到一个表示,以便类似的图像产生相似的输入向量。将像素的值馈送到分类器中不是这样的表示。例如,如果颠倒图像,输入矢量将完全改变,即使它仍然显示相同的对象。你不想那样。您需要的是取决于所示对象的功能,而不是照明/角度等。但是,提取这些功能完全不同(例如,请参阅OpenCV框架中的image preprocessingfeature extraction的一些示例,标准图像处理和计算机视觉如果你对神经网络而不是图像处理感兴趣,最好从UCI repository(例如,虹膜花,威斯康星乳腺癌)开始,并用它们练习一些标准分类问题直到您产生好的结果并且对使用的工具感觉舒适。

+0

输入神经元呢,784是正确的还是?这不是我的设计,它来自pudn.com上的一些例子。我会等待你修改答案,但你100%正确,我认为你知道很多有关ANN的知识,因为你猜测前50张图片会被猜到。当在MATLAB R2010a中运行时,这个ANN的成功率为25%+/- 0.1%。我明天会接受答案,所以我不打破你的编辑。 'TheSting'的PS bluenote? – Munsta 2014-09-30 18:32:25

+0

如果将像素馈送到网络中,则28 * 28 = 784是正确的。然而,这通常不是一个好主意(我编辑答案的细节)。 PS:来自布鲁斯吉他音阶的“bluenote”,我不记得电影中的马:) – 2014-10-01 11:16:18

+0

Hehehe好男人! – Munsta 2014-10-03 11:35:07