我来寻找我正在写的程序的一般提示。神经网络[ocr]
目标是: 使用神经网络程序识别3个字母[D,O,M](或者如果我输入除3之外的任何内容则显示“什么都不识别”)。
这是我到目前为止有:
一类为我的单神经元
public class neuron
{
double[] weights;
public neuron()
{
weights = null;
}
public neuron(int size)
{
weights = new double[size + 1];
Random r = new Random();
for (int i = 0; i <= size; i++)
{
weights[i] = r.NextDouble()/5 - 0.1;
}
}
public double output(double[] wej)
{
double s = 0.0;
for (int i = 0; i < weights.Length; i++) s += weights[i] * wej[i];
s = 1/(1 + Math.Exp(s));
return s;
}
}
一种用于层类:
public class layer
{
neuron[] tab;
public layer()
{
tab = null;
}
public layer(int numNeurons, int numInputs)
{
tab = new neuron[numNeurons];
for (int i = 0; i < numNeurons; i++)
{
tab[i] = new neuron(numInputs);
}
}
public double[] compute(double[] wejscia)
{
double[] output = new double[tab.Length + 1];
output[0] = 1;
for (int i = 1; i <= tab.Length; i++)
{
output[i] = tab[i - 1].output(wejscia);
}
return output;
}
}
最后一类的网络
public class network
{
layer[] layers = null;
public network(int numLayers, int numInputs, int[] npl)
{
layers = new layer[numLayers];
for (int i = 0; i < numLayers; i++)
{
layers[i] = new layer(npl[i], (i == 0) ? numInputs : (npl[i - 1]));
}
}
double[] compute(double[] inputs)
{
double[] output = layers[0].compute(inputs);
for (int i = 1; i < layers.Length; i++)
{
output = layers[i].compute(output);
}
return output;
}
}
现在为algorythm我选择了:
我有一个图片框,大小200x200,您可以在其中绘制一个字母(或从jpg文件中读取一个字母)。
我然后将其转换为我的第一个阵列(让整个画面)和2一(切周围的非相关背景),像这样:
Bitmap bmp2 = new Bitmap(this.pictureBox1.Image);
int[,] binaryfrom = new int[bmp2.Width, bmp2.Height];
int minrow=0, maxrow=0, mincol=0, maxcol=0;
for (int i = 0; i < bmp2.Height; i++)
{
for (int j = 0; j < bmp2.Width; j++)
{
if (bmp2.GetPixel(j, i).R == 0)
{
binaryfrom[i, j] = 1;
if (minrow == 0) minrow = i;
if (maxrow < i) maxrow = i;
if (mincol == 0) mincol = j;
else if (mincol > j) mincol = j;
if (maxcol < j) maxcol = j;
}
else
{
binaryfrom[i, j] = 0;
}
}
}
int[,] boundaries = new int[binaryfrom.GetLength(0)-minrow-(binaryfrom.GetLength(0)-(maxrow+1)),binaryfrom.GetLength(1)-mincol-(binaryfrom.GetLength(1)-(maxcol+1))];
for(int i = 0; i < boundaries.GetLength(0); i++)
{
for(int j = 0; j < boundaries.GetLength(1); j++)
{
boundaries[i, j] = binaryfrom[i + minrow, j + mincol];
}
}
并将其转换为12X8像我的最后一个数组所以(我知道我可以这样缩短公平一点,但希望在不同循环的每一步,所以我可以看到哪里出了问题更容易[如果有的话确实]):
int[,] finalnet = new int[12, 8];
int k = 1;
int l = 1;
for (int i = 0; i < finalnet.GetLength(0); i++)
{
for (int j = 0; j < finalnet.GetLength(1); j++)
{
finalnet[i, j] = 0;
}
}
while (k <= finalnet.GetLength(0))
{
while (l <= finalnet.GetLength(1))
{
for (int i = (int)(boundaries.GetLength(0)/finalnet.GetLength(0)) * (k - 1); i < (int)(boundaries.GetLength(0)/finalnet.GetLength(0)) * k; i++)
{
for (int j = (int)(boundaries.GetLength(1)/finalnet.GetLength(1)) * (l - 1); j < (int)(boundaries.GetLength(1)/finalnet.GetLength(1)) * l; j++)
{
if (boundaries[i, j] == 1) finalnet[k-1, l-1] = 1;
}
}
l++;
}
l = 1;
k++;
}
int a = boundaries.GetLength(0);
int b = finalnet.GetLength(1);
if((a%b) != 0){
k = 1;
while (k <= finalnet.GetLength(1))
{
for (int i = (int)(boundaries.GetLength(0)/finalnet.GetLength(0)) * finalnet.GetLength(0); i < boundaries.GetLength(0); i++)
{
for (int j = (int)(boundaries.GetLength(1)/finalnet.GetLength(1)) * (k - 1); j < (int)(boundaries.GetLength(1)/finalnet.GetLength(1)) * k; j++)
{
if (boundaries[i, j] == 1) finalnet[finalnet.GetLength(0) - 1, k - 1] = 1;
}
}
k++;
}
}
if (boundaries.GetLength(1) % finalnet.GetLength(1) != 0)
{
k = 1;
while (k <= finalnet.GetLength(0))
{
for (int i = (int)(boundaries.GetLength(0)/finalnet.GetLength(0)) * (k - 1); i < (int)(boundaries.GetLength(0)/finalnet.GetLength(0)) * k; i++)
{
for (int j = (int)(boundaries.GetLength(1)/finalnet.GetLength(1)) * finalnet.GetLength(1); j < boundaries.GetLength(1); j++)
{
if (boundaries[i, j] == 1) finalnet[k - 1, finalnet.GetLength(1) - 1] = 1;
}
}
k++;
}
for (int i = (int)(boundaries.GetLength(0)/finalnet.GetLength(0)) * finalnet.GetLength(0); i < boundaries.GetLength(0); i++)
{
for (int j = (int)(boundaries.GetLength(1)/finalnet.GetLength(1)) * finalnet.GetLength(1); j < boundaries.GetLength(1); j++)
{
if (boundaries[i, j] == 1) finalnet[finalnet.GetLength(0) - 1, finalnet.GetLength(1) - 1] = 1;
}
}
}
结果是12X8(我可以在代码中更改它以从一些窗体控件中获取它)0和1的数组,其中1构成粗糙的shap e你画的一封信。
现在我的问题是: 这是一个正确的algorythm? 是我的功能
1/(1+Math.Exp(x))
好一个在这里使用? 什么应该是拓扑结构? 2或3层,如果3,隐藏层中有多少个神经元?我有96个输入(finalnet数组的每个字段),所以我应该在第一层还需要96个神经元?我应该在最后一层还是4层有3个神经元(考虑到“不承认”的情况),还是没有必要?
谢谢你的帮助。
编辑:哦,我忘了补充,我要训练我的网络使用Backpropagation algorythm。
那么,在我的演讲中,没有说明是使用双极性还是单极性功能更好,所以我在网上进行了搜索,但我仍然不确定这一点。 3个输出神经元看起来更容易是的,但是阈值让我感到困惑,所以我们假设所有的神经元都返回接近0的值,如0,1; 0,2; 0,15是否可以安全地假设它不识别? – NagashTDN 2014-11-08 10:46:35
@NagashTDN yes – BlackBear 2014-11-08 10:47:08
alrgiht,thank you :) – NagashTDN 2014-11-08 10:53:14