怎么测试gpu 深度学习 tensorflow

深度学习主机环境配置: Ubuntu16.04+GeForce GTX 1080+TensorFlow | 我爱自然语言处理
关注我们的微信公众号看深度学习框架排名第一的TensorFlow如何进行时序预测!
看深度学习框架排名第一的TensorFlow如何进行时序预测!
所以从独家勘探的角度
TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。它灵活的架构让你可以在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPU),服务器,移动设备等等。TensorFlow 最初由Google大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深度神经网络方面的研究,但这个系统的通用性使其也可广泛用于其他计算领域。时间序列分析在计量经济学和财务分析中具有重要意义,但也可以应用于了解趋势做决策和对行为模式的变化做出反应的领域。其中例如,作为主要石油和天然气供应商的MapR融合数据平台客户将传感器放在井上,将数据发送到MapR Streams,然后将其用于趋势监测井的状况,如体积和温度。在金融方面,时间序列分析用于股票价格,资产和商品的价格的预测。计量经济学家长期利用“差分自回归移动平均模型”(ARIMA)模型进行单变量预测。ARIMA模型已经使用了几十年,并且很好理解。然而,随着机器学习的兴起,以及最近的深度学习,其他模式正在被探索和利用。深度学习(DL)是基于一组算法的机器学习的分支,它通过使用由多个非线性变换组成的人造神经网络(ANN)架构来尝试对数据进行高级抽象然后建模。更为流行的DL神经网络之一是循环神经网络(RNN)。RNN是依赖于其输入的顺序性质的一类神经网络。这样的输入可以是文本,语音,时间序列,以及序列中的元素的出现取决于在它之前出现的元素。例如,一句话中的下一个字,如果有人写“杂货”最有可能是“商店”而不是“学校”。在这种情况下,给定这个序列,RNN可能预测是商店而不是学校。人工神经网络实际上,事实证明,虽然神经网络有时是令人畏惧的结构,但使它们工作的机制出奇地简单:随机梯度下降。对于我们网络中的每个参数(如权重或偏差),我们所要做的就是计算相对于损耗的参数的导数,并在相反方向微调一点。ANNs使用称为反向传播(有想了解BP算法的可以参考BP算法双向传,链式求导最缠绵)的方法来调整和优化结果。反向传播是一个两步过程,其中输入通过正向传播馈送到神经网络中,并且在通过激活函数变换之前与(最初随机的)权重和偏差相乘。你的神经网络的深度将取决于你的输入应该经过多少变换。一旦正向传播完成,反向传播步骤通过计算产生误差的权重的偏导数来调整误差。一旦调整权重,模型将重复正向和反向传播步骤的过程,以最小化误差率直到收敛。下图中你看到这是一个只有一个隐藏层的ANN,所以反向传播不需要执行多个梯度下降计算。循环神经网络循环神经网络(RNN)被称为循环是因为它们对输入序列中的所有元素执行相同的计算。由于RNN的广泛应用,RNN正在变得非常受欢迎。它们可以分析时间序列数据,如股票价格,并提供预测。在自动驾驶系统中,他们可以预测汽车轨迹并帮助避免事故。他们可以将句子,文档或音频样本作为输入,它们也可以应用于自然语言处理(NLP)系统,如自动翻译,语音对文本或情感分析。上图是RNN架构的示例,并且我们看到xt是时间步长t的输入。例如,x1可能是时间段1中的股票的第一个价格。st是在时间步长tn处的隐藏状态,并且使用激活函数基于先前的隐藏状态和当前步骤的输入来计算。St-1通常被初始化为零。ot是步骤t的输出。例如,如果我们想预测序列中的下一个值,那么它将是我们时间序列中概率的向量。RNN隐藏层的成长是依赖于先前输入的隐藏状态或记忆,捕获到目前为止所看到的内容。任何时间点的隐藏状态的值都是前一时间步骤中的隐藏状态值和当前时间的输入值进行函数计算的结果。RNN具有与ANN不同的结构,并且通过时间(BPTT)使用反向传播来计算每次迭代之后的梯度下降。一个小例子:此示例使用3个节点的小型MapR群集完成。此示例将使用以下内容:Python 3.5TensorFlow 1.0.1Red Hat 6.9如果你使用Anaconda,你需要保证你能够安装TensorFlow 1.0.1版本在你本地的机器上。此代码将不能在TensorFlow &1.0版本上使用。如果TensorFlow版本相同,则可以在本地机器上运行并传输到集群。其他需要考虑的深度学习库是MXNet,Caffe2,Torch和Theano。Keras是另一个为TensorFlow或Theano提供python包的深度学习库。MapR提供了用户喜好的集成Jupyter Notebook(或Zeppelin)的功能。我们将在这里显示的是数据管道的尾端。在分布式环境中运行RNN时间序列模型的真正价值是你可以构建的数据流水线,将聚合的系列数据推送到可以馈送到TensorFlow计算图中的格式。如果我正在聚合来自多个设备(IDS,syslogs等)的网络流,并且我想预测未来的网络流量模式行为,我可以使用MapR Streams建立一个实时数据管道,将这些数据聚合成一个队列,进入我的TensorFlow模型。对于这个例子,我在集群上只使用一个节点,但是我可以在其他两个节点上安装TensorFlow,并且可以有三个TF模型运行不同的超参数。对于这个例子,我生成了一些虚拟数据。我们在我们的数据中有209个观察结果。我want确保我对每个批次输入都有相同的观察次数。我们看到的是我们的训练数据集由10个批次组成,包含20个观测值。每个观察值是单个值的序列。现在我们有了我们的数据,我们来创建一个将执行计算的TensorFlow图。这里有很多事情需要处理。例如我们正在指定我们用来预测的周期数。我们指定我们的变量占位符。我们初始化一种使用的RNN单元格(大小100)和我们想要的激活函数的类型。ReLU代表“整流线性单元”,是默认的激活功能,但如果需要,可以更改为Sigmoid,Hyberbolic Tangent(Tanh)等。我们希望我们的输出与我们的输入格式相同,我们可以使用损失函数来比较我们的结果。在这种情况下,我们使用均方误差(MSE),因为这是一个回归问题,我们的目标是最小化实际和预测之间的差异。如果我们处理分类结果,我们可能会使用交叉熵。现在我们定义了这个损失函数,可以定义TensorFlow中的训练操作,这将优化我们的输入和输出网络。要执行优化,我们将使用Adam优化器。Adam优化器是一个很好的通用优化器,可以通过反向传播实现渐变下降。现在是时候在我们的训练数据上实施这个模型了。我们将指定我们的批次训练序列循环的迭代/纪元的数量。接着,我们创建我们的图形对象(tf.Session()),并初始化我们的数据,以便在我们遍历历元时被馈送到模型中。缩写输出显示每100个纪元后的MSE。随着我们的模型提供数据向前和反向传播运行,它调整应用于输入的权重并运行另一个训练时期,我们的MSE得到了持续改善(减少)。最后,一旦模型完成,它将接受参数并将其应用于测试数据中,以Y的预测输出。我们来看看我们的预测跟实际相差多少。对于我们的测试数据,我们集中在整个209个周期的最后20个时期。看来这还有一些改进的空间。这可以通过改变隐藏的神经元的数量或增加迭代的数量来完成。优化我们的模式是一个试错的过程,但我们有一个好的开始。这是随机数据,所以我们期待着很好的结果,但是也许将这个模型应用到实时系列中会给ARIMA模型带来一些竞争压力。数据科学家因为RNN(和深度学习)的出现,有了更多可用的选项以此来解决更多有趣的问题。许多数据科学家面临的一个问题是,一旦我们进行了优化,我们如何自动化我们的分析运行?拥有像MapR这样的平台允许这种能力,因为你可以在大型数据环境中构建,训练,测试和优化你的模型。在这个例子中,我们只使用了10个训练批次。如果我的数据允许我利用数百批次,而不仅仅是20个时期,我想我一定能改进这种模式。一旦我做到了,我可以把它打包成一个自动化脚本,在一个单独的节点,一个GPU节点,一个Docker容器中运行。这就是在融合数据平台上进行数据科学和深度学习的力量。希望上述的文章能够帮到你理解TensorFlow。更多阅读:阅读博客“TensorFlow on MapR教程:一个完美的地方开始”阅读博客“深度学习:我的选项是什么?“阅读博客“通过SparkR和H2O的MapR融合数据平台上的可扩展机器学习”希望上述的介绍能够帮助到你!本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。文章原标题《Applying Deep Learning to Time Series Forecasting with TensorFlow》,作者:Justin Brandenburg 译者:袁虎 审阅:
本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
所以从独家勘探的角度
百家号 最近更新:
简介: 最独到的见解,带给你不同的数码世界!
作者最新文章TensorFlow深度学习笔记 实现与优化深度神经网络 - 简书
TensorFlow深度学习笔记 实现与优化深度神经网络
转载请注明作者:Github工程地址:欢迎star,有问题可以到讨论Google深度学习 官方教程/下载
全连接神经网络
辅助阅读: -
Linear Model
加载中的数据集
将Data降维成一维,将label映射为one-hot encodingdef reformat(dataset, labels):
dataset = dataset.reshape((-1, image_size * image_size)).astype(np.float32)
# Map 0 to [1.0, 0.0, 0.0 ...], 1 to [0.0, 1.0, 0.0 ...]
labels = (np.arange(num_labels) == labels[:, None]).astype(np.float32)
return dataset, labels
TensorFlow Graph
使用梯度计算train_loss,用tf.Graph()创建一个计算单元
用tf.constant将dataset和label转为tensorflow可用的训练格式(训练中不可修改)
用tf.truncated_normal生成正太分布的数据,作为W的初始值,初始化b为可变的0矩阵
用tf.variable将上面的矩阵转为tensorflow可用的训练格式(训练中可以修改)
用tf.matmul实现矩阵相乘,计算WX+b,这里实际上logit只是一个变量,而非结果
用tf.nn.softmax_cross_entropy_with_logits计算WX+b的结果相较于原来的label的train_loss,并求均值
使用梯度找到最小train_lossoptimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)
计算相对valid_dataset和test_dataset对应的label的train_loss
上面这些变量都是一种Tensor的概念,它们是一个个的计算单元,我们在Graph中设置了这些计算单元,规定了它们的组合方式,就好像把一个个门电路串起来那样
TensorFLow Session
Session用来执行Graph里规定的计算,就好像给一个个门电路通上电,我们在Session里,给计算单元冲上数据,That’s Flow.
重复计算单元反复训练800次,提高其准确度
为了快速查看训练效果,每轮训练只给10000个训练数据(subset),恩,每次都是相同的训练数据
将计算单元graph传给session
初始化参数
传给session优化器 - train_loss的梯度optimizer,训练损失 - train_loss,每次的预测结果,循环执行训练with tf.Session(graph=graph) as session:
tf.initialize_all_variables().run()
for step in range(num_steps):
_, l, predictions = session.run([optimizer, loss, train_prediction])
在循环过程中,W和b会保留,并不断得到修正
在每100次循环后,会用验证集进行验证一次,验证也同时修正了一部分参数valid_prediction.eval()
最后用测试集进行测试
注意如果lesson 1中没有对数据进行乱序化,可能训练集预测准确度很高,验证集和测试集准确度会很低
这样训练的准确度为83.2%
每次只取一小部分数据做训练,计算loss时,也只取一小部分数据计算loss
对应到程序中,即修改计算单元中的训练数据,
每次输入的训练数据只有128个,随机取起点,取连续128个数据:offset = (step * batch_size) % (train_labels.shape[0] - batch_size)
batch_data = train_dataset[offset:(offset + batch_size), :]
batch_labels = train_labels[offset:(offset + batch_size), :]
由于这里的数据是会变化的,因此用tf.placeholder来存放这块空间tf_train_dataset = tf.placeholder(tf.float32,
shape=(batch_size, image_size * image_size))
tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels))
计算3000次,训练总数据量为384000,比之前8000000少
准确率提高到86.5%,而且准确率随训练次数增加而提高的速度变快了
上面SGD的模型只有一层WX+b,现在使用一个RELU作为中间的隐藏层,连接两个WX+b
仍然只需要修改Graph计算单元为
Y = W2 * RELU(W1*X + b1) + b2
为了在数学上满足矩阵运算,我们需要这样的矩阵运算:
[n * 10] = RELU([n * 784] · [784 * N] + [n * N]) · [N * 10] + [n * 10]
这里N取1024,即1024个隐藏结点
于是四个参数被修改weights1 = tf.Variable(
tf.truncated_normal([image_size * image_size, hidden_node_count]))
biases1 = tf.Variable(tf.zeros([hidden_node_count]))
weights2 = tf.Variable(
tf.truncated_normal([hidden_node_count, num_labels]))
biases2 = tf.Variable(tf.zeros([num_labels]))
预测值计算方法改为ys = tf.matmul(tf_train_dataset, weights1) + biases1
hidden = tf.nn.relu(ys)
logits = tf.matmul(hidden, weights2) + biases2
计算3000次,可以发现准确率一开始提高得很快,后面提高速度变缓,最终测试准确率提高到88.8%
深度神经网络实践
Regularization
在前面实现的中,加Regularization进行约束,采用加l2 norm的方法,进行调节:
代码实现上,只需要对tf_sgd_relu_nn中train_loss做修改即可:
可以用tf.nn.l2_loss(t)对一个Tensor对象求l2 norm
需要对我们使用的各个W都做这样的计算(参考tensorflow官方)l2_loss = tf.nn.l2_loss(weights1) + tf.nn.l2_loss(weights2)
添加到train_loss上
这里还有一个重要的点,Hyper Parameter: β
我觉得这是一个拍脑袋参数,取什么值都行,但效果会不同,我这里解释一下我取β=0.001的理由
如果直接将l2_loss加到train_loss上,每次的train_loss都特别大,几乎只取决于l2_loss
为了让原本的train_loss与l2_loss都能较好地对参数调整方向起作用,它们应当至少在同一个量级
观察不加l2_loss,step 0 时,train_loss在300左右
加l2_loss后, step 0 时,train_loss在300000左右
因此给l2_loss乘0.0001使之降到同一个量级loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels)) + 0.001 * l2_loss
所有其他参数不变,训练3000次,准确率提高到92.7%
黑魔法之所以为黑魔法就在于,这个参数可以很容易地影响准确率,如果β = 0.002,准确率提高到93.5%
OverFit问题
在训练数据很少的时候,会出现训练结果准确率高,但测试结果准确率低的情况
缩小训练数据范围:将把batch数据的起点offset的可选范围变小(只能选择0-1128之间的数据):offset_range = 1000
offset = (step * batch_size) % offset_range
可以看到,在step500后,训练集就一直是100%,验证集一直是77.6%,准确度无法随训练次数上升,最后的测试准确度是85.4%
采取Dropout方式强迫神经网络学习更多知识
参考中dropout的使用
我们需要丢掉RELU出来的部分结果
调用tf.nn.dropout达到我们的目的:keep_prob = tf.placeholder(tf.float32)
if drop_out:
hidden_drop = tf.nn.dropout(hidden, keep_prob)
h_fc = hidden_drop
这里的keep_prob是保留概率,即我们要保留的RELU的结果所占比例,tensorflow建议的是,让它作为一个placeholder,在run时传入
当然我们也可以不用placeholder,直接传一个0.5:if drop_out:
hidden_drop = tf.nn.dropout(hidden, 0.5)
h_fc = hidden_drop
这种训练的结果就是,虽然在step 500对训练集预测没能达到100%(起步慢),但训练集预测率达到100%后,验证集的预测正确率仍然在上升
这就是Dropout的好处,每次丢掉随机的数据,让神经网络每次都学习到更多,但也需要知道,这种方式只在我们有的训练数据比较少时很有效
最后预测准确率为88.0%
Learning Rate Decay
随着训练次数增加,自动调整步长
在之前单纯两层神经网络基础上,添加Learning Rate Decay算法
使用tf.train.exponential_decay方法,指数下降调整步长,具体使用方法说的特别清楚
注意这里面的cur_step传给优化器,优化器在训练中对其做自增计数
与之前单纯两层神经网络对比,准确率直接提高到90.6%
Deep Network
增加神经网络层数,增加训练次数到20000
为了避免修改网络层数需要重写代码,用循环实现中间层# middle layer
for i in range(layer_cnt - 2):
y1 = tf.matmul(hidden_drop, weights[i]) + biases[i]
hidden_drop = tf.nn.relu(y1)
if drop_out:
keep_prob += 0.5 * i / (layer_cnt + 1)
hidden_drop = tf.nn.dropout(hidden_drop, keep_prob)
初始化weight在迭代中使用
for i in range(layer_cnt - 2):
if hidden_cur_cnt & 2:
hidden_next_cnt = int(hidden_cur_cnt / 2)
hidden_next_cnt = 2
hidden_stddev = np.sqrt(2.0 / hidden_cur_cnt)
weights.append(tf.Variable(tf.truncated_normal([hidden_cur_cnt, hidden_next_cnt], stddev=hidden_stddev)))
biases.append(tf.Variable(tf.zeros([hidden_next_cnt])))
hidden_cur_cnt = hidden_next_cnt
第一次测试时,用正太分布设置所有W的数值,将标准差设置为1,由于网络增加了一层,寻找step调整方向时具有更大的不确定性,很容易导致loss变得很大
因此需要用stddev调整其标准差到一个较小的范围(怎么调整有许多研究,这里直接找了一个来用)
stddev = np.sqrt(2.0 / n)
启用regular时,也要适当调一下β,不要让它对原本的loss造成过大的影响
DropOut时,因为后面的layer得到的信息越重要,需要动态调整丢弃的比例,到后面的layer,丢弃的比例要减小keep_prob += 0.5 * i / (layer_cnt + 1)
训练时,调节参数,你可能遇到,训练到一定程度后,梯度优化器没有什么作用,loss和准确率总是在一定范围内徘徊
官方教程表示最好的训练结果是,准确率97.5%,
我的开启六层神经网络,启用Regularization、DropOut、Learning Rate Decay,训练次数20000(应该还有再训练的希望,在这里虽然loss下降很慢了,但仍然在下降),训练结果是,准确率95.2%
觉得我的文章对您有帮助的话,给个可好?
喜欢做有意思的事情&深度学习三大硬件+四大学习库基准测试对比,指标全面呈现
深度学习三大硬件+四大学习库基准测试对比,指标全面呈现
日08时23分来源:
购买用于运行深度学习算法的硬件时,我们常常找不到任何有用的基准,唯一的选择是买一个GPU然后用它来测试。现在市面上性能最好的GPU几乎都来自英伟达,但其中也有很多选择:是买一个新出的TITAN X Pascal还是便宜些的TITAN X Maxwell,又或是GTX 1080?本文中我们对几个最常见的英伟达GPU以及最常用的一些深度学习算法进行了基准测试。软件方面,我们比较了最近发布的四个开源深度学习库:Tensorflow v0.10.0、Neon v1.6.0、Caffe rc3以及caffe的英伟达版本NVcaffe v0.15.10。
GPU基准测试:GeForce GTX 1080 vs Titan X(Maxwell) vs Titan X (Pascal)
我们比较了GeForce GTX 1080、Titan X Maxwell和Titan X Pascal三款GPU,使用的深度学习库是Neon、Tensorflow和Caffe,深度学习网络是AlexNet、GoogleNet、OverFeat和VGG-A。
所有基准测试都使用64位系统,每个结果是100次迭代计算的平均时间。
基于库的测试结果
训练基准测试
使用四种库(Tensorflow,NVcaffe,Caffe,Neon)进行一次前向迭代和反向迭代的总时间[ms](越少越好)。结果如下:
推论基准测试
使用四种库(Tensorflow,NVcaffe,Caffe,Neon)进行一次前向迭代的总时间[ms](越少越好)。结果如下:
基于神经网络的测试结果
训练基准测试
使用四种神经网络(VGG-A,OverFeat,AlexNet,GoogLeNet)进行一次前向迭代和反向迭代的总时间(越少越好)。结果如下:
推论基准测试
使用四种神经网络(VGG-A,OverFeat,AlexNet,GoogLeNet)进行一次前向迭代的总时间(越少越好)。结果如下:
基准测试工具
在Neon上进行基准测试使用的是neon库中的脚本neon/tests/run_benchmarks.py,在Tensorflow上使用的是convnet-benchmarks和不加修改的脚本convnet-benchmarks/tensorflow/benchmark_alexnet.py, convnet-benchmarks/tensorflow/benchmark_googlnet.py, convnet-benchmarks/tensorflow/benchmark_overfeat.py 以及 convnet-benchmarks/tensorflow/benchmark_vgg.py。Caffe使用的也是convnet-benchmarks,但对脚本convnet-benchmarks/caffe/run_imagenet.sh作了修改以指向我们的caffe安装。
深度学习库基准测试:Caffe vs Neon vsNVcaffe vs Tensorflow
同样,所有基准测试都使用64位系统,每个结果是100次迭代计算的平均时间。
基于GPU的测试结果
训练基准测试
使用四种GPU(Titan X Pascal,Titan X Maxwell,GeForce GTX 1080)进行一次前向迭代和反向迭代的总时间(越少越好)。结果如下:
推论基准测试
使用四种GPU(Titan X Pascal,Titan X Maxwell,GeForce GTX 1080)进行一次前向迭代的总时间(越少越好)。结果如下:
基于神经网络的测试结果
训练基准测试
使用四种神经网络(VGG-A,OverFeat,AlexNet,GoogLeNet)进行一次前向迭代和反向迭代的总时间(越少越好)。结果如下:
推论基准测试
使用四种神经网络(VGG-A,OverFeat,AlexNet,GoogLeNet)进行一次前向迭代的总时间(越少越好)。结果如下:
基准测试工具
在Neon上进行基准测试使用的是neon库中的脚本neon/tests/run_benchmarks.py,在Tensorflow上使用的是convnet-benchmarks和不加修改的脚本convnet-benchmarks/tensorflow/benchmark_alexnet.py,convnet benchmarks/tensorflow/benchmark_googlnet.py,convnet-benchmarks/tensorflow/benchmark_overfeat.py以及 convnet-benchmarks/tensorflow/benchmark_vgg.py。Caffe使用的也是convnet-benchmarks,但对脚本convnet-benchmarks/caffe/run_imagenet.sh作了修改以指向我们的caffe安装。
戳原文,更有料!}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信