‘壹’ 请问如何并行化训练神经网络模型
各个框架都有自己的方法实现并行计算。
我常用的是pytorch,可通过以下方法实现并行计算(单机多卡):
new_net = nn.DataParallel(net, device_ids=[0, 1])
output = new_net(input)
通过device_ids参数可以指定在哪些GPU上进行优化
‘贰’ 怎样可以提高神经网络的收敛速度
摘要 先确定神经网络的训练算法和神经元节点数。
‘叁’ 如何建立bp神经网络预测 模型
建立BP神经网络预测 模型,可按下列步骤进行:
1、提供原始数据
2、训练数据预测数据提取及归一化
3、BP网络训练
4、BP网络预测
5、结果分析
现用一个实际的例子,来预测2015年和2016年某地区的人口数。
已知2009年——2014年某地区人口数分别为3583、4150、5062、4628、5270、5340万人
执行BP_main程序,得到
[ 2015, 5128.631704710423946380615234375]
[ 2016, 5100.5797325642779469490051269531]
代码及图形如下。
‘肆’ 如何在R语言中进行神经网络模型的建立
不能发链接,所以我复制过来了。
#载入程序和数据
library(RSNNS)
data(iris)
#将数据顺序打乱
iris <- iris[sample(1:nrow(iris),length(1:nrow(iris))),1:ncol(iris)]
#定义网络输入
irisValues <- iris[,1:4]
#定义网络输出,并将数据进行格式转换
irisTargets <- decodeClassLabels(iris[,5])
#从中划分出训练样本和检验样本
iris <- splitForTrainingAndTest(irisValues, irisTargets, ratio=0.15)
#数据标准化
iris <- normTrainingAndTestSet(iris)
#利用mlp命令执行前馈反向传播神经网络算法
model <- mlp(iris$inputsTrain, iris$targetsTrain, size=5, learnFunc="Quickprop", learnFuncParams=c(0.1, 2.0, 0.0001, 0.1),maxit=100, inputsTest=iris$inputsTest, targetsTest=iris$targetsTest)
#利用上面建立的模型进行预测
predictions <- predict(model,iris$inputsTest)
#生成混淆矩阵,观察预测精度
confusionMatrix(iris$targetsTest,predictions)
#结果如下:
# predictions
#targets 1 2 3
# 1 8 0 0
# 2 0 4 0
# 3 0 1 10
‘伍’ bp神经网络 Matlab实现总是达不到精度,请问应该要怎么弄
更改参数,如修改学习率、更换训练函数如trainlm等。
更改结构:增加隐层节点数、甚至增加隐层数,可以做成双隐层。
BP(Back Propagation)神经网络是86年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网络模型拓扑结构包括输入层(input)、隐层(hidden layer)和输出层(output layer)。
‘陆’ 2.搭建一个神经网络模型训练MNIST手写体数字数据集中遇到的问题及解决方法
批量输入后,如何使用numpy矩阵计算的方法计算各权值梯度,提高计算速度
def backprop(self, x, y): #x为多维矩阵。每列为一个x值。 y为多维矩阵。每列为一个y值。
batch_num=x.shape[1]
#print(x.shape)
#print(y.shape)
"""创建两个变量,用来存储所有b值和所有w值对应的梯度值。初始化为0.nabla_b为一个list,形状与biases的形状完全一致。nabla_w 为一个list,形状与weights的形状完全一致。
"""
nabla_b = [np.zeros(b.shape) for b in self.biases]
nabla_w = [np.zeros(w.shape) for w in self.weights]
# feedforward
"""activations,用来所有中间层和输出层在一次前向计算过程中的最终输出值,即a值。该值记录下来,以供后期使用BP算法求每个b和w的梯度。
"""
activation = x #x为本批多个x为列组成的矩阵。
activations = [x] # list to store all the activations, layer by layer
"""zs,用来所有中间层和输出层在一次前向计算过程中的线性输出值,即z值。该值记录下来,以供后期使用BP算法求每个b和w的梯度。
"""
zs = [] # list to store all the z vectors, layer by layer ,zs的每个元素为本batch的x对应的z为列构成的矩阵。
"""
通过一次正向计算,将中间层和输出层所有的z值和a值全部计算出来,并存储起来。供接下来求梯度使用。
"""
for b, w in zip(self.biases, self.weights):
#print(w.shape)
#print(np.dot(w, activation).shape)
#print(b.shape)
z = np.dot(w, activation)+b #z为本batch的x对应的z为列构成的矩阵。
zs.append(z)
activation = sigmoid(z)
activations.append(activation)
"""
以下部分是采用BP算法求解每个可训练参数的计算方法。是权重更新过程中的关键。
"""
# backward pass
# 求出输出层的delta值
delta = ((activations[-1]-y) * sigmoid_prime(zs[-1]))
nabla_b[-1] = delta.mean(axis=1).reshape(-1, 1)
nabla_w[-1] =np.dot(delta,activations[-2].transpose())/batch_num
# Note that the variable l in the loop below is used a little
# differently to the notation in Chapter 2 of the book. Here,
# l = 1 means the last layer of neurons, l = 2 is the
# second-last layer, and so on. It's a renumbering of the
# scheme in the book, used here to take advantage of the fact
# that Python can use negative indices in lists.
for l in range(2, self.num_layers):
z = zs[-l]
sp = sigmoid_prime(z)
delta = (np.dot(self.weights[-l+1].transpose(), delta) * sp)
nabla_b[-l] = delta.mean(axis=1).reshape(-1, 1)
nabla_w[-l] =np.dot(delta,activations[-l-1].transpose())/batch_num
return (nabla_b, nabla_w)
##梯度计算后,如何更新各权值
def update_mini_batch(self, mini_batch, eta):
"""Update the network's weights and biases by applying
gradient descent using backpropagation to a single mini batch.
The ``mini_batch`` is a list of tuples ``(x, y)``, and ``eta``
is the learning rate."""
""" 初始化变量,去存储各训练参数的微分和。
"""
nabla_b = [np.zeros(b.shape) for b in self.biases]
nabla_w = [np.zeros(w.shape) for w in self.weights]
""" 循环获取batch中的每个数据,获取各训练参数的微分,相加后获得各训练参数的微分和。
"""
x_batch=None
y_batch=None
for x, y in mini_batch:
if( x_batch is None):
x_batch=x
else:
x_batch=np.append(x_batch,x,axis=1)
if( y_batch is None):
y_batch=y
else:
y_batch=np.append(y_batch,y,axis=1)
delta_nabla_b, delta_nabla_w = self.backprop(x_batch, y_batch)
nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]
nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]
""" 使用各训练参数的平均微分和与步长的乘积,去更新每个训练参数
"""
self.weights = [w-eta*nw
for w, nw in zip(self.weights, nabla_w)]
self.biases = [b-eta*nb
for b, nb in zip(self.biases, nabla_b)]
‘柒’ 神经网络模型 nlp是什么意思
NLP是神经语言程序学 (Neuro-Linguistic Programming) 的英文缩写。在香港,也有意译为身心语法程式学的。N (Neuro) 指的是神经系统,包括大脑和思维过程。L (Linguistic) 是指语言,更准确点说,是指从感觉信号的输入到构成意思的过程。P (Programming) 是指为产生某种后果而要执行的一套具体指令。即指我们思维上及行为上的习惯,就如同电脑中的程式,可以透过更新软件而改变。
故此,NLP也可以解释为研究我们的大脑如何工作的学问。知道大脑如何工作后,我们可以配合和提升它,从而使人生更成功快乐。也因此,把NLP译为"身心语法程式学"或"神经语言程式学"。
‘捌’ BP神经网络模型各个参数的选取问题
样本变量不需要那么多,因为神经网络的信息存储能力有限,过多的样本会造成一些有用的信息被丢弃。如果样本数量过多,应增加隐层节点数或隐层数目,才能增强学习能力。
一、隐层数
一般认为,增加隐层数可以降低网络误差(也有文献认为不一定能有效降低),提高精度,但也使网络复杂化,从而增加了网络的训练时间和出现“过拟合”的倾向。一般来讲应设计神经网络应优先考虑3层网络(即有1个隐层)。一般地,靠增加隐层节点数来获得较低的误差,其训练效果要比增加隐层数更容易实现。对于没有隐层的神经网络模型,实际上就是一个线性或非线性(取决于输出层采用线性或非线性转换函数型式)回归模型。因此,一般认为,应将不含隐层的网络模型归入回归分析中,技术已很成熟,没有必要在神经网络理论中再讨论之。
二、隐层节点数
在BP 网络中,隐层节点数的选择非常重要,它不仅对建立的神经网络模型的性能影响很大,而且是训练时出现“过拟合”的直接原因,但是目前理论上还没有一种科学的和普遍的确定方法。 目前多数文献中提出的确定隐层节点数的计算公式都是针对训练样本任意多的情况,而且多数是针对最不利的情况,一般工程实践中很难满足,不宜采用。事实上,各种计算公式得到的隐层节点数有时相差几倍甚至上百倍。为尽可能避免训练时出现“过拟合”现象,保证足够高的网络性能和泛化能力,确定隐层节点数的最基本原则是:在满足精度要求的前提下取尽可能紧凑的结构,即取尽可能少的隐层节点数。研究表明,隐层节点数不仅与输入/输出层的节点数有关,更与需解决的问题的复杂程度和转换函数的型式以及样本数据的特性等因素有关。
‘玖’ 如何提高BP神经网络模型的预测精度
直接调用归一化函数就可以啦,不会的话看一下这个帖子吧:遗传算法优化BP神经网络的案例(matlab代码分享)
http://www.ilovematlab.cn/forum. ... &fromuid=679292
希望对你有帮助!