神经网络训练算力
❶ 怎么将数据输入训练好的神经网络运算啊 我的神经网络训练好了,检验网络不会,怎么进行运算也不会了
利用Y=sim(net,P),仿真一下跟原来的输入比较一下。。。
❷ 神经网络训练0到9十个数字需要多少样本
看你的各种要求,如果只是练习mnist手写体字符的话我推荐7:3
❸ 神经网络训练最后的收敛图 best training performance is NaN at。。。什么意思,是没有收敛吗
NaN意思是Not A Number,除非是发散,不过一般不会出现这种情况。可能你的程序有错。
如果是新定义算法的话理论上的收敛要证明,可以证明它在迭代次数趋近无穷的时候等于某一解,也可以证明它满足李普希兹条件(就是带有完备范数和李普希兹常数的那个),这种情形下我们叫做收敛,要是用已有算法或者干脆就是BP算法的时候不需要你证明.理论上不收敛的情况是这样,当迭代次数趋近无穷的时候,权向量的解不唯一.
实际上的收敛是这样,给定一个最大迭代次数n,一个误差限erl,反向传播算法应该很容易找,我不往上写了,每一步权值修正都会使er减小,直观的看就是权向量的分量沿着梯度减小的方向在前进,虽然理论上样本足够大并且n趋于无穷的时候会收敛,但是实际上有可能出现当迭代到第n次,误差er依然大于误差限erl的情况,也就是说我们没有解出来满足要求的权向量,所以网络训练失败,叫做不收敛.当然,也可以使用梯度限来作为迭代终止的条件,这种情况下不收敛就是梯度在迭代了n次以后没有小于某一值,从而没有求出满足要求的权向量;收敛就是求出了满足梯度限的权向量.
❹ matlab神经网络训练一般需要多少数据
只要你觉得这些数据能把握住你要解决的问题了,够这个问题的学习了,就够了。几十到上百万都是有可能的。一般数据多一些更有利于精度。
❺ 急急急!!帮忙解释一下我的神经网络训练结果图的含义!越详细越好!
我最近也要学习神经网络 跟楼主探讨探讨 楼主用9输入1输出两个隐层 迭代次数10000次 用时1分钟 progess左方是目标值(不太确定) 右方是训练精度目标 迭代10000次后有效性检验为6次无错误 梯度接近目标精度 最终的均方差也接近目标值 楼主的神经网络训练应该是成功的 接下来可以直接做仿真了 (增加迭代次数应该可以增加精度,不过只要差不多就可以了)
❻ 什么神经网络训练学习学习有哪几种方式
神经网络的学习算法很多 , 根据一种广泛采用的分类方法 , 可将神经网络的学习算法
归纳为 3 类 。 一类是有导师学习 , 一类为无导师学习 , 还有一类是灌输式学习 。
《人工神经网络教程》(韩力群)
❼ 神经网络训练为什么效果不佳
那是肯定有影响的。你这样理解,就像你让一个复杂的结构构造的机器去学习一个东西,和你用一个构造简单的机器去学习一个东西,它们理解的会一样吗?而且关于隐含层神经元个数还有几个公式来推测它可能的神经元个数,你可以查查看,如果没有影响...
❽ BP神经网络的训练集需要大样本吗一般样本个数为多少
BP神经网络的训练集需要大样本吗?一般样本个数为多少?
BP神经网络样本数有什么影响
学习神经网络这段时间,有一个疑问,BP神经网络中训练的次数指的网络的迭代次数,如果有a个样本,每个样本训练次数n,则网络一共迭代an次,在n>>a 情况下 , 网络在不停的调整权值,减小误差,跟样本数似乎关系不大。而且,a大了的话训练时间必然会变长。
换一种说法,将你的数据集看成一个固定值, 那么样本集与测试集 也可以按照某种规格确定下来如7:3 所以如何看待 样本集的多少与训练结果呢? 或者说怎么使你的网络更加稳定,更加符合你的所需 。
我尝试从之前的一个例子中看下区别
如何用70行Java代码实现深度神经网络算法
作者其实是实现了一个BP神经网络 ,不多说,看最后的例子
一个运用神经网络的例子
最后我们找个简单例子来看看神经网络神奇的效果。为了方便观察数据分布,我们选用一个二维坐标的数据,下面共有4个数据,方块代表数据的类型为1,三角代表数据的类型为0,可以看到属于方块类型的数据有(1,2)和(2,1),属于三角类型的数据有(1,1),(2,2),现在问题是需要在平面上将4个数据分成1和0两类,并以此来预测新的数据的类型。
图片描述
我们可以运用逻辑回归算法来解决上面的分类问题,但是逻辑回归得到一个线性的直线做为分界线,可以看到上面的红线无论怎么摆放,总是有一个样本被错误地划分到不同类型中,所以对于上面的数据,仅仅一条直线不能很正确地划分他们的分类,如果我们运用神经网络算法,可以得到下图的分类效果,相当于多条直线求并集来划分空间,这样准确性更高。
图片描述
简单粗暴,用作者的代码运行后 训练5000次 。根据训练结果来预测一条新数据的分类(3,1)
预测值 (3,1)的结果跟(1,2)(2,1)属于一类 属于正方形
这时如果我们去掉 2个样本,则样本输入变成如下
//设置样本数据,对应上面的4个二维坐标数据
double[][] data = new double[][]{{1,2},{2,2}};
//设置目标数据,对应4个坐标数据的分类
double[][] target = new double[][]{{1,0},{0,1}};
1
2
3
4
1
2
3
4
则(3,1)结果变成了三角形,
如果你选前两个点 你会发现直接一条中间线就可以区分 这时候的你的结果跟之前4个点时有区别 so 你得增加样本 直到这些样本按照你所想要的方式分类 ,所以样本的多少 重要性体现在,样本得能反映所有的特征值(也就是输入值) ,样本多少或者特征(本例子指点的位置特征)决定的你的网络的训练结果,!!!这是 我们反推出来的结果 。这里距离深度学习好像近了一步。
另外,这个70行代码的神经网络没有保存你训练的网络 ,所以你每次运行都是重新训练的网络。其实,在你训练过后 权值已经确定了下来,我们确定网络也就是根据权值,so只要把训练后的权值保存下来,将需要分类的数据按照这种权值带入网络,即可得到输出值,也就是一旦网络确定, 权值也就确定,一个输入对应一个固定的输出,不会再次改变!个人见解。
最后附上作者的源码,作者的文章见开头链接
下面的实现程序BpDeep.java可以直接拿去使用,
import java.util.Random;
public class BpDeep{
public double[][] layer;//神经网络各层节点
public double[][] layerErr;//神经网络各节点误差
public double[][][] layer_weight;//各层节点权重
public double[][][] layer_weight_delta;//各层节点权重动量
public double mobp;//动量系数
public double rate;//学习系数
public BpDeep(int[] layernum, double rate, double mobp){
this.mobp = mobp;
this.rate = rate;
layer = new double[layernum.length][];
layerErr = new double[layernum.length][];
layer_weight = new double[layernum.length][][];
layer_weight_delta = new double[layernum.length][][];
Random random = new Random();
for(int l=0;l<layernum.length;l++){
layer[l]=new double[layernum[l]];
layerErr[l]=new double[layernum[l]];
if(l+1<layernum.length){
layer_weight[l]=new double[layernum[l]+1][layernum[l+1]];
layer_weight_delta[l]=new double[layernum[l]+1][layernum[l+1]];
for(int j=0;j<layernum[l]+1;j++)
for(int i=0;i<layernum[l+1];i++)
layer_weight[l][j][i]=random.nextDouble();//随机初始化权重
}
}
}
//逐层向前计算输出
public double[] computeOut(double[] in){
for(int l=1;l<layer.length;l++){
for(int j=0;j<layer[l].length;j++){
double z=layer_weight[l-1][layer[l-1].length][j];
for(int i=0;i<layer[l-1].length;i++){
layer[l-1][i]=l==1?in[i]:layer[l-1][i];
z+=layer_weight[l-1][i][j]*layer[l-1][i];
}
layer[l][j]=1/(1+Math.exp(-z));
}
}
return layer[layer.length-1];
}
//逐层反向计算误差并修改权重
public void updateWeight(double[] tar){
int l=layer.length-1;
for(int j=0;j<layerErr[l].length;j++)
layerErr[l][j]=layer[l][j]*(1-layer[l][j])*(tar[j]-layer[l][j]);
while(l-->0){
for(int j=0;j<layerErr[l].length;j++){
double z = 0.0;
for(int i=0;i<layerErr[l+1].length;i++){
z=z+l>0?layerErr[l+1][i]*layer_weight[l][j][i]:0;
layer_weight_delta[l][j][i]= mobp*layer_weight_delta[l][j][i]+rate*layerErr[l+1][i]*layer[l][j];//隐含层动量调整
layer_weight[l][j][i]+=layer_weight_delta[l][j][i];//隐含层权重调整
if(j==layerErr[l].length-1){
layer_weight_delta[l][j+1][i]= mobp*layer_weight_delta[l][j+1][i]+rate*layerErr[l+1][i];//截距动量调整
layer_weight[l][j+1][i]+=layer_weight_delta[l][j+1][i];//截距权重调整
}
}
layerErr[l][j]=z*layer[l][j]*(1-layer[l][j]);//记录误差
}
}
}
public void train(double[] in, double[] tar){
double[] out = computeOut(in);
updateWeight(tar);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
下面是这个测试程序BpDeepTest.java的源码:
import java.util.Arrays;
public class BpDeepTest{
public static void main(String[] args){
//初始化神经网络的基本配置
//第一个参数是一个整型数组,表示神经网络的层数和每层节点数,比如{3,10,10,10,10,2}表示输入层是3个节点,输出层是2个节点,中间有4层隐含层,每层10个节点
//第二个参数是学习步长,第三个参数是动量系数
BpDeep bp = new BpDeep(new int[]{2,10,2}, 0.15, 0.8);
//设置样本数据,对应上面的4个二维坐标数据
double[][] data = new double[][]{{1,2},{2,2},{1,1},{2,1}};
//设置目标数据,对应4个坐标数据的分类
double[][] target = new double[][]{{1,0},{0,1},{0,1},{1,0}};
//迭代训练5000次
for(int n=0;n<5000;n++)
for(int i=0;i<data.length;i++)
bp.train(data[i], target[i]);
//根据训练结果来检验样本数据
for(int j=0;j<data.length;j++){
double[] result = bp.computeOut(data[j]);
System.out.println(Arrays.toString(data[j])+":"+Arrays.toString(result));
}
//根据训练结果来预测一条新数据的分类
double[] x = new double[]{3,1};
double[] result = bp.computeOut(x);
System.out.println(Arrays.toString(x)+":"+Arrays.toString(result));
}
}
❾ 这个神经网络训练有没有梯度消失,或者梯度爆炸,具体怎么看阿
增加网络的非线性能力,从而拟合更多的非线性过程。ReLU在一定程度上能够防止梯度消失,但防止梯度消失不是用它的主要原因,主要原因是求导数简单。一定程度是指,右端的不会趋近于饱和,求导数时,导数不为零,从而梯度不消失,但左端问题依然存在,一样掉进去梯度也会消失。所以出现很多改进的ReLU。
❿ 如果有足够的计算能力,神经网络理论真的能100%模拟人脑吗
不能。
现在的计算机是逻辑计算机,感性思考能力很差劲,量子计算机依旧很遥远。
就目前理论和工程实践,无论神经网络算法规模有多大,等真正想要机器人动一根手指还是老老实实的用C++或其他语言写程序。
神经网络本质是一种信息处理算法,只有编程才能让机器人产生行为。目前还没有理论可以整合两者,即:我们并不能通过信息的处理实现自动编程的目的,我们也无法通过编程产生程序员无法预测的信息。缺少这个基础谈模拟人脑,只能说我们连毛都没摸到。
