❶ 在神经网络使用elu激活函数时怎么使用交叉熵作为损失函数
P、T矩阵均为一列为一个样本,因此P、T的列数必须相等,否则报错。你参考下别人的程序,我建议使用newff函数,不要弄得这么复杂。还有P、T的生成不需要那么复杂,只需要:P(i,:)=YY(i:i+2);附上newff函数的格式为:net=newff(PR,[S1S2SN],{TF1TF2TFN},BTF,BLF,PF),函数newff建立一个可训练的前馈网络。输入参数说明:PR:Rx2的矩阵以定义R个输入向量的最小值和最大值;Si:第i层神经元个数;TFi:第i层的传递函数,默认函数为tansig函数;BTF:训练函数,默认函数为trainlm函数;BLF:权值/阀值学习函数,默认函数为learngdm函数;PF:性能函数,默认函数为mse函数。
❷ 神经网络中如果训练数据识别率远高于测试数据的识别率,说明了什么问题
您好,出现这种情况的可能原因为:
1.训练是使用GPU训练,而测试时没有使用
2.model.predict在预测时会对数据进行shuffle 导致输出的预测值与原始数据的顺序不匹配,从而导致结果不一致
3.这里进行的是多分类,而训练时损失函数设置为binary_crossentropy(二分类的损失函数)显示的是二进制精度,不是分类精度,修改为categorical_crossentropy后,两者结果一致。
❸ 神经网络中的各种损失函数介绍
不同的损失函数可用于不同的目标。在这篇文章中,我将带你通过一些示例介绍一些非常常用的损失函数。这篇文章提到的一些参数细节都属于tensorflow或者keras的实现细节。
损失函数的简要介绍
损失函数有助于优化神经网络的参数。我们的目标是通过优化神经网络的参数(权重)来最大程度地减少神经网络的损失。通过神经网络将目标(实际)值与预测值进行匹配,再经过损失函数就可以计算出损失。然后,我们使用梯度下降法来优化网络权重,以使损失最小化。这就是我们训练神经网络的方式。
均方误差
当你执行回归任务时,可以选择该损失函数。顾名思义,这种损失是通过计算实际(目标)值和预测值之间的平方差的平均值来计算的。
例如,你有一个神经网络,通过该网络可以获取一些与房屋有关的数据并预测其价格。在这种情况下,你可以使用MSE(均方误差)损失。基本上,在输出为实数的情况下,应使用此损失函数。
二元交叉熵
当你执行二元分类任务时,可以选择该损失函数。如果你使用BCE(二元交叉熵)损失函数,则只需一个输出节点即可将数据分为两类。输出值应通过sigmoid激活函数,以便输出在(0-1)范围内。
例如,你有一个神经网络,该网络获取与大气有关的数据并预测是否会下雨。如果输出大于0.5,则网络将其分类为会下雨;如果输出小于0.5,则网络将其分类为不会下雨。即概率得分值越大,下雨的机会越大。
训练网络时,如果标签是下雨,则输入网络的目标值应为1,否则为0。
重要的一点是,如果你使用BCE损失函数,则节点的输出应介于(0-1)之间。这意味着你必须在最终输出中使用sigmoid激活函数。因为sigmoid函数可以把任何实数值转换(0–1)的范围。(也就是输出概率值)
如果你不想在最后一层上显示使用sigmoid激活函数,你可以在损失函数的参数上设置from logits为true,它会在内部调用Sigmoid函数应用到输出值。
多分类交叉熵
当你执行多类分类任务时,可以选择该损失函数。如果使用CCE(多分类交叉熵)损失函数,则输出节点的数量必须与这些类相同。最后一层的输出应该通过softmax激活函数,以便每个节点输出介于(0-1)之间的概率值。
例如,你有一个神经网络,它读取图像并将其分类为猫或狗。如果猫节点具有高概率得分,则将图像分类为猫,否则分类为狗。基本上,如果某个类别节点具有最高的概率得分,图像都将被分类为该类别。
为了在训练时提供目标值,你必须对它们进行一次one-hot编码。如果图像是猫,则目标向量将为(1,0),如果图像是狗,则目标向量将为(0,1)。基本上,目标向量的大小将与类的数目相同,并且对应于实际类的索引位置将为1,所有其他的位置都为零。
如果你不想在最后一层上显示使用softmax激活函数,你可以在损失函数的参数上设置from logits为true,它会在内部调用softmax函数应用到输出值。与上述情况相同。
稀疏多分类交叉熵
该损失函数几乎与多分类交叉熵相同,只是有一点小更改。
使用SCCE(稀疏多分类交叉熵)损失函数时,不需要one-hot形式的目标向量。例如如果目标图像是猫,则只需传递0,否则传递1。基本上,无论哪个类,你都只需传递该类的索引。
这些是最重要的损失函数。训练神经网络时,可能会使用这些损失函数之一。
下面的链接是Keras中所有可用损失函数的源代码。
(https://github.com/keras-team/keras/blob//keras/backend/numpy_backend.py)
❹ sklearn 神经网络 MLPClassifier简单应用与参数说明
MLPClassifier是一个监督学习算法,下图是只有1个隐藏层的MLP模型 ,左侧是输入层,右侧是输出层。
上图的整体结构可以简单的理解为下图所示:
MLP又名多层感知机,也叫人工神经网络(ANN,Artificial Neural Network),除了输入输出层,它中间可以有多个隐藏层,如果没有隐藏层即可解决线性可划分的数据问题。最简单的MLP模型只包含一个隐藏层,即三层的结构,如上图。
从上图可以看到,多层感知机的层与层之间是全连接的(全连接的意思就是:上一层的任何一个神经元与下一层的所有神经元都有连接)。多层感知机最底层是输入层,中间是隐藏层,最后是输出层。
输入层没什么好说,你输入什么就是什么,比如输入是一个n维向量,就有n个神经元。
隐藏层的神经元怎么得来?首先它与输入层是全连接的,假设输入层用向量X表示,则隐藏层的输出就是
f(W1X+b1),W1是权重(也叫连接系数),b1是偏置,函数f 可以是常用的sigmoid函数或者tanh函数:
最后就是输出层,输出层与隐藏层是什么关系?其实隐藏层到输出层可以看成是一个多类别的逻辑回归,也即softmax回归,所以输出层的输出就是softmax(W2X1+b2),X1表示隐藏层的输出f(W1X+b1)。
MLP整个模型就是这样子的,上面说的这个三层的MLP用公式总结起来就是,函数G是softmax
因此,MLP所有的参数就是各个层之间的连接权重以及偏置,包括W1、b1、W2、b2。对于一个具体的问题,怎么确定这些参数?求解最佳的参数是一个最优化问题,解决最优化问题,最简单的就是梯度下降法了(sgd):首先随机初始化所有参数,然后迭代地训练,不断地计算梯度和更新参数,直到满足某个条件为止(比如误差足够小、迭代次数足够多时)。这个过程涉及到代价函数、规则化(Regularization)、学习速率(learning rate)、梯度计算等。
下面写了一个超级简单的实例,训练和测试数据是mnist手写识别数据集:
from sklearn.neural_network import MLPClassifier
import gzip
import pickle
with gzip.open('./mnist.pkl.gz') as f_gz:
train_data,valid_data,test_data = pickle.load(f_gz)
clf = MLPClassifier(solver='sgd',activation = 'identity',max_iter = 10,alpha = 1e-5,hidden_layer_sizes = (100,50),random_state = 1,verbose = True)
clf.fit(train_data[0][:10000],train_data[1][:10000])
print clf.predict(test_data[0][:10])
print(clf.score(test_data[0][:100],test_data[1][:100]))
print(clf.predict_proba(test_data[0][:10]))
参数说明:
参数说明:
1. hidden_layer_sizes :例如hidden_layer_sizes=(50, 50),表示有两层隐藏层,第一层隐藏层有50个神经元,第二层也有50个神经元。
2. activation :激活函数,{‘identity’, ‘logistic’, ‘tanh’, ‘relu’}, 默认relu
- identity:f(x) = x
- logistic:其实就是sigmod,f(x) = 1 / (1 + exp(-x)).
- tanh:f(x) = tanh(x).
- relu:f(x) = max(0, x)
3. solver: {‘lbfgs’, ‘sgd’, ‘adam’}, 默认adam,用来优化权重
- lbfgs:quasi-Newton方法的优化器
- sgd:随机梯度下降
- adam: Kingma, Diederik, and Jimmy Ba提出的机遇随机梯度的优化器
注意:默认solver ‘adam’在相对较大的数据集上效果比较好(几千个样本或者更多),对小数据集来说,lbfgs收敛更快效果也更好。
4. alpha :float,可选的,默认0.0001,正则化项参数
5. batch_size : int , 可选的,默认’auto’,随机优化的minibatches的大小batch_size=min(200,n_samples),如果solver是’lbfgs’,分类器将不使用minibatch
6. learning_rate :学习率,用于权重更新,只有当solver为’sgd’时使用,{‘constant’,’invscaling’, ‘adaptive’},默认constant
- ‘constant’: 有’learning_rate_init’给定的恒定学习率
- ‘incscaling’:随着时间t使用’power_t’的逆标度指数不断降低学习率learning_rate_ ,effective_learning_rate = learning_rate_init / pow(t, power_t)
- ‘adaptive’:只要训练损耗在下降,就保持学习率为’learning_rate_init’不变,当连续两次不能降低训练损耗或验证分数停止升高至少tol时,将当前学习率除以5.
7. power_t: double, 可选, default 0.5,只有solver=’sgd’时使用,是逆扩展学习率的指数.当learning_rate=’invscaling’,用来更新有效学习率。
8. max_iter: int,可选,默认200,最大迭代次数。
9. random_state:int 或RandomState,可选,默认None,随机数生成器的状态或种子。
10. shuffle: bool,可选,默认True,只有当solver=’sgd’或者‘adam’时使用,判断是否在每次迭代时对样本进行清洗。
11. tol:float, 可选,默认1e-4,优化的容忍度
12. learning_rate_int:double,可选,默认0.001,初始学习率,控制更新权重的补偿,只有当solver=’sgd’ 或’adam’时使用。
14. verbose : bool, 可选, 默认False,是否将过程打印到stdout
15. warm_start : bool, 可选, 默认False,当设置成True,使用之前的解决方法作为初始拟合,否则释放之前的解决方法。
16. momentum : float, 默认 0.9,动量梯度下降更新,设置的范围应该0.0-1.0. 只有solver=’sgd’时使用.
17. nesterovs_momentum : boolean, 默认True, Whether to use Nesterov’s momentum. 只有solver=’sgd’并且momentum > 0使用.
18. early_stopping : bool, 默认False,只有solver=’sgd’或者’adam’时有效,判断当验证效果不再改善的时候是否终止训练,当为True时,自动选出10%的训练数据用于验证并在两步连续迭代改善,低于tol时终止训练。
19. validation_fraction : float, 可选, 默认 0.1,用作早期停止验证的预留训练数据集的比例,早0-1之间,只当early_stopping=True有用
20. beta_1 : float, 可选, 默认0.9,只有solver=’adam’时使用,估计一阶矩向量的指数衰减速率,[0,1)之间
21. beta_2 : float, 可选, 默认0.999,只有solver=’adam’时使用估计二阶矩向量的指数衰减速率[0,1)之间
22. epsilon : float, 可选, 默认1e-8,只有solver=’adam’时使用数值稳定值。
属性说明:
- classes_:每个输出的类标签
- loss_:损失函数计算出来的当前损失值
- coefs_:列表中的第i个元素表示i层的权重矩阵
- intercepts_:列表中第i个元素代表i+1层的偏差向量
- n_iter_ :迭代次数
- n_layers_:层数
- n_outputs_:输出的个数
- out_activation_:输出激活函数的名称。
方法说明:
- fit(X,y):拟合
- get_params([deep]):获取参数
- predict(X):使用MLP进行预测
- predic_log_proba(X):返回对数概率估计
- predic_proba(X):概率估计
- score(X,y[,sample_weight]):返回给定测试数据和标签上的平均准确度
-set_params(**params):设置参数。
❺ 深度神经网络dnn怎么调节参数
深度神经网络(DNN)目前是许多现代AI应用的基础。
自从DNN在语音识别和图像识别任务中展现出突破性的成果,使用DNN的应用数量呈爆炸式增加。这些DNN方法被大量应用在无人驾驶汽车,癌症检测,游戏AI等方面。
在许多领域中,DNN目前的准确性已经超过人类。与早期的专家手动提取特征或制定规则不同,DNN的优越性能来自于在大量数据上使用统计学习方法,从原始数据中提取高级特征的能力,从而对输入空间进行有效的表示。
然而,DNN超高的准确性是以超高的计算复杂度为代价的。
通常意义下的计算引擎,尤其是GPU,是DNN的基础。因此,能够在不牺牲准确性和增加硬件成本的前提下,提高深度神经网络的能量效率和吞吐量的方法,对于DNN在AI系统中更广泛的应用是至关重要的。研究人员目前已经更多的将关注点放在针对DNN计算开发专用的加速方法。
鉴于篇幅,本文主要针对论文中的如下几部分详细介绍:
DNN的背景,历史和应用
DNN的组成部分,以及常见的DNN模型
简介如何使用硬件加速DNN运算
DNN的背景
人工智能与深度神经网络
深度神经网络,也被称为深度学习,是人工智能领域的重要分支,根据麦卡锡(人工智能之父)的定义,人工智能是创造像人一样的智能机械的科学工程。深度学习与人工智能的关系如图1所示:
图1:深度神经网络与人工智能的关系
人工智能领域内,一个大的子领域是机器学习,由Arthur Samuel在1959年定义为:让计算机拥有不需要明确编程即可学习的能力。
这意味着创建一个程序,这个程序可以被训练去学习如何去做一些智能的行为,然后这个程序就可以自己完成任务。而传统的人工启发式方法,需要对每个新问题重新设计程序。
高效的机器学习算法的优点是显而易见的。一个机器学习算法,只需通过训练,就可以解决某一领域中每一个新问题,而不是对每个新问题特定地进行编程。
在机器学习领域,有一个部分被称作brain-inspired computation。因为人类大脑是目前学习和解决问题最好的“机器”,很自然的,人们会从中寻找机器学习的方法。
尽管科学家们仍在探索大脑工作的细节,但是有一点被公认的是:神经元是大脑的主要计算单元。
人类大脑平均有860亿个神经元。神经元相互连接,通过树突接受其他神经元的信号,对这些信号进行计算之后,通过轴突将信号传递给下一个神经元。一个神经元的轴突分支出来并连接到许多其他神经元的树突上,轴突分支和树突之间的连接被称为突触。据估计,人类大脑平均有1014-1015个突触。
突触的一个关键特性是它可以缩放通过它的信号大小。这个比例因子可以被称为权重(weight),普遍认为,大脑学习的方式是通过改变突触的权重实现的。因此,不同的权重导致对输入产生不同的响应。注意,学习过程是学习刺激导致的权重调整,而大脑组织(可以被认为是程序)并不改变。
大脑的这个特征对机器学习算法有很好的启示。
神经网络与深度神经网络
神经元的计算是输入值的加权和这个概念启发了神经网络的研究。这些加权和对应于突触的缩放值以及神经元所接收的值的组合。此外,神经元并不仅仅是输入信号的加权和,如果是这样的话,级联的神经元的计算将是一种简单的线性代数运算。
相反的是,神经元组合输入的操作似乎是一种非线性函数,只有输入达到某个阈值的时候,神经元才会生成输出。因此,通过类比,我们可以知道神经网络在输入值的加权和的基础上应用了非线性函数。
图2(a)展示了计算神经网络的示意图,图的最左边是接受数值的“输入层”。这些值被传播到中间层神经元,通常也叫做网络的“隐藏层”。通过一个或更多隐藏层的加权和最终被传播到“输出层”,将神经网络的最终结果输出给用户。
图2:神经网络示意图
在神经网络领域,一个子领域被称为深度学习。最初的神经网络通常只有几层的网络。而深度网络通常有更多的层数,今天的网络一般在五层以上,甚至达到一千多层。
目前在视觉应用中使用深度神经网络的解释是:将图像所有像素输入到网络的第一层之后,该层的加权和可以被解释为表示图像不同的低阶特征。随着层数的加深,这些特征被组合,从而代表更高阶的图像特征。
例如,线可以被组合成形状,再进一步,可以被组合成一系列形状的集合。最后,再训练好这些信息之后,针对各个图像类别,网络给出由这些高阶特征组成各个对象的概率,即分类结果。
推理(Inference)与训练(Training)
既然DNN是机器学习算法中的一员,那么它的基本编程思想仍然是学习。DNN的学习即确定网络的权重值。通常,学习过程被称为训练网络(training)。一旦训练完成,程序可以使用由训练确定的权值进行计算,这个使用网络完成任务的操作被被称为推断(inference)。
接下来,如图3所示,我们用图像分类作为例子来展示如何训练一个深度神经网络。当我们使用一个DNN的时候,我们输入一幅图片,DNN输出一个得分向量,每一个分数对应一个物体分类;得到最高分数的分类意味着这幅图片最有可能属于这个分类。
训练DNN的首要目标就是确定如何设置权重,使得正确分类的得分最高(图片所对应的正确分类在训练数据集中标出),而使其他不正确分类的得分尽可能低。理想的正确分类得分与目前的权重所计算出的得分之间的差距被称为损失函数(loss)。
因此训练DNN的目标即找到一组权重,使得对一个较大规模数据集的loss最小。
图3:图像分类
权重(weight)的优化过程类似爬山的过程,这种方法被称为梯度下降(gradient decent)。损失函数对每个权值的梯度,即损失函数对每个权值求偏导数,被用来更新权值(例:第t到t+1次迭代:,其中α被称为学习率(Learning rate)。梯度值表明权值应该如何变化以减小loss。这个减小loss值的过程是重复迭代进行的。
梯度可以通过反向传播(Back-Propagation)过程很高效地进行计算,loss的影响反向通过网络来计算loss是如何被每个权重影响的。
训练权重有很多种方法。前面提到的是最常见的方法,被称为监督学习,其中所有的训练样本是有标签的。
无监督学习是另一种方法,其中所有训练样本都没有标签,最终目标是在数据中查找结构或聚类。半监督学习结合了两种方法,只有训练数据的一小部分被标记(例如,使用未标记的数据来定义集群边界,并使用少量的标记数据来标记集群)。
最后,强化学习可以用来训练一个DNN作为一个策略网络,对策略网络给出一个输入,它可以做出一个决定,使得下一步的行动得到相应的奖励;训练这个网络的过程是使网络能够做出使奖励(即奖励函数)最大化的决策,并且训练过程必须平衡尝试新行为(Exploration)和使用已知能给予高回报的行为(Exploitation)两种方法。
用于确定权重的另一种常用方法是fine-tune,使用预先训练好的模型的权重用作初始化,然后针对新的数据集(例如,传递学习)或新的约束(例如,降低的精度)调整权重。与从随机初始化开始相比,能够更快的训练,并且有时会有更好的准确性。
❻ 神经网络超参数选择
深度学习模型通常由随机梯度下降算法进行训练。随机梯度下降算法有许多变形:例如 Adam、RMSProp、Adagrad 等等。这些算法都需要你设置学习率。学习率决定了在一个小批量(mini-batch)中权重在梯度方向要移动多远。
如果学习率很低,训练会变得更加可靠,但是优化会耗费较长的时间,因为朝向损失函数最小值的每个步长很小。
如果学习率很高,训练可能根本不会收敛,损失函数一直处于波动中,甚至会发散。权重的改变量可能非常大,使得优化越过最小值,使得损失函数变得更糟。
训练应当从相对较大的学习率开始。这是因为在开始时,初始的随机权重远离最优值。在训练过程中,学习率应当下降,以允许细粒度的权重更新。
参考: https://www.jiqixin.com/articles/2017-11-17-2
批次大小是每一次训练神经网络送入模型的样本数。在 合理的范围之内 ,越大的 batch size 使下降方向越准确,震荡越小,通常取值为[16,32,64,128]。
Batch_Size=全部数据集 缺点:
1) 随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行。
2) 以 Rprop 的方式迭代,会由于各个 Batch 之间的采样差异性,各次梯度修正值相互抵消,无法修正。
Batch_Size = 1 缺点:
使用在线学习,每次修正方向以各自样本的梯度方向修正,横冲直撞各自为政,难以达到收敛。
在合理范围内,增大 Batch_Size 有何好处?
1) 内存利用率提高了,大矩阵乘法的并行化效率提高。
2) 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
3) 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。
盲目增大 Batch_Size 有何坏处?
1) 内存利用率提高了,但是内存容量可能撑不住了。
2) 跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
3) Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。
参考: https://blog.csdn.net/juronghui/article/details/78612653
迭代次数是指整个训练集输入到神经网络进行训练的次数,当测试错误率和训练错误率相差较小,且测试准确率趋于稳定时(达到最优),可认为当前迭代次数合适;当测试错误率先变小后变大时则说明迭代次数过大了,需要减小迭代次数,否则容易出现过拟合。
用激活函数给神经网络加入一些非线性因素,使得网络可以更好地解决较为复杂的问题。参考: https://blog.csdn.net/tyhj_sf/article/details/79932893
它能够把输入的连续实值变换为0和1之间的输出。
缺点:
1) 在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。
2) Sigmoid 的 output 不是0均值,使得收敛缓慢。batch的输入能缓解这个问题。
它解决了Sigmoid函数的不是zero-centered输出问题,然而梯度消失的问题和幂运算的问题仍然存在。
tanh函数具有中心对称性,适合于有对称性的二分类
虽然简单,但却是近几年的重要成果,有以下几大优点:
1) 解决了梯度消散问题 (在正区间)
2)计算速度非常快,只需要判断输入是否大于0
3)收敛速度远快于sigmoid和tanh
ReLU也有几个需要特别注意的问题:
1)ReLU的输出不是zero-centered
2)Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
为了解决Dead ReLU Problem,提出了将ReLU的前半段设为 αx 而非 0 ,如 PReLU 。
1)深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。
2)如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout.
3)最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.
公式: https://www.cnblogs.com/xiaobingqianrui/p/10756046.html
优化器比较: https://blog.csdn.net/weixin_40170902/article/details/80092628
❼ 卷及神经网络中loss怎么计算
这个问题比较泛,因为网络的损失函数是由自己设计的,如果不特殊说明一般是有均方误差和交叉熵两种损失函数的。其中均方误差当然就是指的输出与标签的差的平方和的平均,计算方式如下:
❽ BP神经网络损失函数居高不下
1、模型结构和特征工程存在问题。
2、权重初始化方案有问题。
3、正则化过度。
4、选择合适的激活函数、损失函数。
5、选择合适的优化器和学习速率。
6、训练时间不足,模型训练遇到瓶颈。