淘宝seo什么意思seo优化内容
淘宝seo什么意思,seo优化内容,动漫设计专修学校,那个网站上有打码的任务做来自http://deeplearning.net/tutorial/gettingstarted.html#gettingstarted 一、下载 在后续的每个学习算法上#xff0c;都需要下载对应的文档#xff0c;如果想要一次全部下好#xff0c;那么可以复制git上面的这个教程的资料#xff1a; git clone git://github.com/li… 来自http://deeplearning.net/tutorial/gettingstarted.html#gettingstarted 一、下载 在后续的每个学习算法上都需要下载对应的文档如果想要一次全部下好那么可以复制git上面的这个教程的资料 git clone git://github.com/lisa-lab/DeepLearningTutorials.git 二、数据集 MNIST 数据集(mnist.pkl.gz)现在这个数据集除了教学好像已经没什么人关注了 这个MNIST 数据集包含的是手写数字图像其中有6w张训练样本和1w张测试样本不过在几乎许多论文和本教程中都是将这6w张训练样本划分成5w张训练样本和1w张验证集样本所有的图片都已经中心化而且是固定的大小28×28其中是灰度图白色为255黑色为0.为了方面本教程是需要在python下使用的可以下载 here.也就是已经划分好了三个list训练集、验证集和测试集。每一个list都是由图像和相应的标签组成的。其中图像是numpy的78428*28的一维数组就是把2维的图像拉成一条向量标签则是一个0-9之间的数字。下面的代码演示了如何使用这个数据集 import cPickle, gzip, numpy# Load the dataset
f gzip.open(mnist.pkl.gz, rb)
train_set, valid_set, test_set cPickle.load(f)
f.close() 当使用这个数据集的时候通常是将它划分成minibatches Stochastic Gradient Descent还有http://blog.csdn.net/shouhuxianjian/article/details/41040245这是hinton的视频的第6课。我们建议你可以将这个数据集放入到共享变量shared variables中并通过基于minibatch索引、给定一个固定和已知的batch size来访问它。这样做的好处就是共享变量之后可以用在gpu上因为当将数据复制到GPU内存上的时候会有较大的开销如果按照代码的执行每个minibatch都是独立的来进行传输数据的时候如果不是用共享变量的方法结果反而比只使用CPU的速度还慢。如果使用Theano 共享变量那么就是让Theano将整个数据在共享变量构造的时候通过一个单一的调用都复制到GPU上。之后GPU可以通过在这个共享变量上进行切片slice来访问任何minibatch而不需要从cpu的内存上复制到GPU上所以避免了很多的数据传输的开销。因为这些数据点和他们的标签通常都是不同的标签通常是整数而数据点通常是实数我们建议使用不同的变量来表示数据和标签。同样我们推荐使用对这三个不同的集合也采用不同的变量来使得代码更具有可读性会生成6个不同的共享变量。因为当前的数据是一个变量而且一个minibatch可以被定为这个变量的一个切片所以很自然的可以通过指定索引和尺寸来定义一个minibatch。在我们的步骤中batch size在代码执行过程中 一直是一个常量所以一个函数实际上需要的只是索引来指定哪个数据点被使用了。下面的代码来表示如何存储数据并且如何访问一个minibatch def shared_dataset(data_xy): Function that loads the dataset into shared variablesThe reason we store our dataset in shared variables is to allowTheano to copy it into the GPU memory (when code is run on GPU).Since copying data into the GPU is slow, copying a minibatch everytimeis needed (the default behaviour if the data is not in a sharedvariable) would lead to a large decrease in performance.data_x, data_y data_xyshared_x theano.shared(numpy.asarray(data_x, dtypetheano.config.floatX))#因为GPU只接受float类型shared_y theano.shared(numpy.asarray(data_y, dtypetheano.config.floatX))#因为GPU只接受float类型# When storing data on the GPU it has to be stored as floats# therefore we will store the labels as floatX as well# (shared_y does exactly that). But during our computations# we need them as ints (we use labels as index, and if they are# floats it doesnt make sense) therefore instead of returning# shared_y we will have to cast it to int. This little hack# lets us get around this issuereturn shared_x, T.cast(shared_y, int32) #返回的时候强制标签为int类型test_set_x, test_set_y shared_dataset(test_set)
valid_set_x, valid_set_y shared_dataset(valid_set)
train_set_x, train_set_y shared_dataset(train_set)batch_size 500 # size of the minibatch# accessing the third minibatch of the training set 访问训练集的第三个minibatchdata train_set_x[2 * 500: 3 * 500]
label train_set_y[2 * 500: 3 * 500] 在GPU上存储的数据只能是floats类型的存储在GPu上时右边的dtype被赋值为theano.config.floatX.为了绕过这个标签上的问题通过将其存储为float然后返回的时候强制为int类型。 note如果你想要在GPU上运行代码而你使用的数据集太大而无法放入GPU内存中这种情况下你可能会将数据存储到一个共享变量中。然而你可以存储一个足够小的数据块几个minibatches放到一个共享变量中然后使用这个来进行训练当这个数据块训练完成之后更新存储的数据块换下一部分。这个方法是为了最小化CPU和GPU之间数据传输的次数的折衷方法。 三、符号 数据集符号 我们将数据集表示成当需要区别对待的时候将训练集验证集和测试集表示成: , 和。验证集是用来执行模型选取和超参数选择的而且测试集是用来验证最后的 泛化误差和以无偏的方式来对比不同的算法。该教程基本上处理的是分类问题这里每个数据集是有关 对的索引集合使用上标来区分不同的训练集样本 是第 i 个维度为的训练样本。相似的是第 i 个指派给输入的标签。这样就可以简单的扩展这些例子使得能够有其他类型例如高斯回归或者能够预测多个符号的多项式组也就是多分类。 数学约定 : 大写符号用来表示一个矩阵除非有其他的特指 : 矩阵的第i 行第j 列的元素: 向量, 表示矩阵第i 行: 向量, 表示矩阵第j 列: 小写符号用来表示一个向量除非有其他的特指: 向量的第i 个元素 符号和函数的列表 : 输入的维度数.: 第i 层隐藏单元的个数., : 和模型 相关的分类函数, 定义成 . 注意到这里通常将下标 丢弃掉.L:标签的个数.: 由参数定义模型 的的log似然 . 在数据集上由参数决定的预测函数 f 的期望损失.NLL: 负似然lognegative log-likelihoodNLL: 对于一个给定模型的所有参数集合 python的命名空间本教程的代码通常使用下面的命名空间 import theano
import theano.tensor as T
import numpy四、在DL上的有监督优化的入门深度学习最让人兴奋的主要是利用深网络的无监督学习。不过有监督学习同样也扮演着很重要的角色。无监督预训练的使用通常是基于当使用有监督微调之后获得效果的基础上来进行评估的。本部分回顾下作为分类模型的有监督的基础部分然后介绍下作为在许多dl教程中模型上使用的微调的minibatch随机梯度下降算法。详细的可以看看introductory course notes on gradient-based learning 来了解更多关于使用梯度来优化训练标准的基本概念。 学习一个分类器 zero-one 损失 本教程中呈现的模型大多是用来做分类的。训练一个分类器的目标是为了最小化在不可见样本上的误差0-1损失的数量。如果 是预测函数那么损失函数可以写成 这里是 表示的是训练集合在训练的时候或者 为了避免验证集或者测试误差的有偏估计。 是指示函数可以被定义成 在这个教程中f 被定义成 在python中使用Theano的话可以写成如下形式 # zero_one_loss is a Theano variable representing a symbolic
# expression of the zero one loss ; to get the actual value this
# symbolic expression has to be compiled into a Theano function (see
# the Theano tutorial for more details)
zero_one_loss T.sum(T.neq(T.argmax(p_y_given_x), y))负log似然损失 因为0-1损失不能微分对于大型模型成千上百万的参数的优化来说代价是非常高昂的计算量。所以我们在训练集给定所有的标签的基础上让我们的分类器的log似然最大化 正确类别的似然和正确预测的数量是不相同的不过从一个随机初始化的分类器的观点上看它们相当接近。不过提醒下0-1损失和似然是不同的目标你需要看见它们是在验证集上是正相关的不过有时候却是负相关的。因为我们通常说要最小化一个损失函数所以学习其实就是为了最小化这个负log似然函数定义为 我们分类器的NLL是可微分的所以可以用来代替0-1损失而且我们在基于训练数据上使用这个函数的梯度作为 一个分类器的dl 有监督学习信号其实就是用梯度来训练分类器的意思我直译的而已。这可以通过使用下面的代码来计算得到 # NLL is a symbolic variable ; to get the actual value of NLL, this symbolic
# expression has to be compiled into a Theano function (see the Theano
# tutorial for more details)
NLL -T.sum(T.log(p_y_given_x)[T.arange(y.shape[0]), y])
# note on syntax: T.arange(y.shape[0]) is a vector of integers [0,1,2,...,len(y)].
# Indexing a matrix M by the two vectors [0,1,...,K], [a,b,...,k] returns the
# elements M[0,a], M[1,b], ..., M[K,k] as a vector. Here, we use this
# syntax to retrieve the log-probability of the correct labels, y.随机梯度下降 普通的梯度下降是什么它是一个简单的算法在这个算法中首先有由一些参数定义的损失函数表示的错误表面然后在这个表面上重复的使用很小的步长进行下降的算法。针对于普通的梯度下降法的目的来说训练数据是需要放入到这个损失函数中的。然后这个算法的伪代码可以写成如下形式 # GRADIENT DESCENTwhile True:loss f(params)d_loss_wrt_params ... # compute gradientparams - learning_rate * d_loss_wrt_paramsif stopping condition is met:return params 随机梯度下降法是和用普通梯度下降法一样的原则来work的不过可以通过每次一点样本来计算梯度从而更快速的进行处理所以不需要一次放入整个训练样本了。对应的伪代码如下 # STOCHASTIC GRADIENT DESCENT
for (x_i,y_i) in training_set:# imagine an infinite generator# that may repeat examples (if there is only a finite training set)loss f(params, x_i, y_i)d_loss_wrt_params ... # compute gradientparams - learning_rate * d_loss_wrt_paramsif stopping condition is met:return params 在dl 上我们推荐使用在随机梯度上的进一步变体叫做“minibatches”。minibatch sgd的工作规则是和sgd一样的只是我们在每次的梯度估计上使用不止一个训练样本来训练。这个技术可以梯度估计中间的方差而且通常在现代计算机中可以更好地利用层级存储的组织方式 for (x_batch,y_batch) in train_batches:# imagine an infinite generator# that may repeat examplesloss f(params, x_batch, y_batch)d_loss_wrt_params ... # compute gradient using theanoparams - learning_rate * d_loss_wrt_paramsif stopping condition is met:return params 这是在minibatch size 的选择上的权衡考虑。方差的减小和SIMD指令的使用在当从1增加到2的时候通常是很有帮助的不过这个很小的提升却会很快的回归虚无。使用更大的时间会消耗在减少梯度估计器的方差减少上本来这些时间是应该更好的用在额外的梯度步长上的。一个最优的是基于模型、数据集、和硬件考虑的同时可以在任何地方从1上升到甚至好几百。在这个教程中我们将它设置成20不过这个选择通常是任意的。 note如果你训练的时候使用的是固定数量的epochs那么这个minibatch size就变得很重要了因为它控制着你的参数的更新次数。使用batch size 为1 的10次epochs来训练相同的模型得到的结果完全不同于训练batch size 为20的而且也是10个epochs的结果。记得在不同的batch sizes之间转换的时候记得按照使用过的这个batch size 来调整所有的其他参数。 上面所有的演示该算法的伪代码块在theano中执行同样的算法的代码如下 # Minibatch Stochastic Gradient Descent# assume loss is a symbolic description of the loss function given
# the symbolic variables params (shared variable), x_batch, y_batch;# compute gradient of loss with respect to params
d_loss_wrt_params T.grad(loss, params)# compile the MSGD step into a theano function
updates [(params, params - learning_rate * d_loss_wrt_params)]
MSGD theano.function([x_batch,y_batch], loss, updatesupdates)for (x_batch, y_batch) in train_batches:# here x_batch and y_batch are elements of train_batches and# therefore numpy arrays; function MSGD also updates the paramsprint(Current loss is , MSGD(x_batch, y_batch))if stopping_condition_is_met:return params正则化 除了优化在机器学习中还有更重要的部分。当我们从数据中训练我们的模型的时候我们是将它准备用在新样本上的而不是那些我们已经见过的样本。上面的MSGD的训练循环如果没有考虑到这一点也许就会过拟合训练样本。一个对应过你的方法就是正则化。这里有好几种正则化的方法这里会介绍L1/L2正则化和早期停止。 L1/L2 正则化 L2和L2正则化涉及到在损失函数上增加额外的项用来惩罚某一个参数组合。形式上如果我们的损失函数是 那么正则化损失就该是 或者在我们的情况中 这里 这是 的 范数。是一个超参数用来控制正则化参数的相关重要性。通常 p的值是1和2所以命名为L1/L2如果p2那么这个正则化叫做“权重衰减”。原则上说对损失函数增加一个正则化项将会使得在NN中网络更加的平滑通过惩罚值较大的参数这些值较大的参数会降低网络模型的非线性程度所以需要惩罚。更直观的说这两项NLL和对应于很好的对数据进行建模NLL和有着“简单”或“平滑”的解决方法。因此最小化这两个项的和从理论上来说就是为了在拟合训练数据和解决方法的“泛化”之间找到正确的平衡点。为了遵循Occam的razor原则这个最小化应该让我们找到最简单的解决方法通过我们简单的标准来测量的来拟合训练数据。注意到这样一个事实一个所谓的“简单”的解决方法不是意味着能够很好的泛化。经验上来说通常是在NN的背景下这样的正则化的添加有助于泛化特别是对于小的数据集来说。下面的代码块用来表示当包含由来权重化的L1正则化项和由来权重化的L2正则化项的时候如何在python中计算损失的 # symbolic Theano variable that represents the L1 regularization term
L1 T.sum(abs(param))# symbolic Theano variable that represents the squared L2 term
L2_sqr T.sum(param ** 2)# the loss
loss NLL lambda_1 * L1 lambda_2 * L2早期停止 用早期停止来解决过拟合是通过在验证集合上监测模型的执行结果来完成的。验证集就是我们在梯度下降的时候未使用的样本集不过这同样也不是测试集的一部分。验证集样本是被认为作为未来测试集样本的代表的。我们可以在训练的时候使用时因为它们不是测试集的一部分。如果模型的效果在验证集上已经停止了提升或者甚至在后面的优化上还有下降那么这里需要做的就是停止使用更多的优化。选择什么时候停止是一个主观判断而且是存在启发式的不过这些教程将会在基于会具有几何增长的patience数量上使用一些策略 # early-stopping parameters
patience 5000 # look as this many examples regardless
patience_increase 2 # wait this much longer when a new best is# found
improvement_threshold 0.995 # a relative improvement of this much is# considered significant
validation_frequency min(n_train_batches, patience/2)# go through this many# minibatches before checking the network# on the validation set; in this case we# check every epochbest_params None
best_validation_loss numpy.inf
test_score 0.
start_time time.clock()done_looping False
epoch 0
while (epoch n_epochs) and (not done_looping):# Report 1 for first epoch, n_epochs for last epochepoch epoch 1for minibatch_index in xrange(n_train_batches):d_loss_wrt_params ... # compute gradientparams - learning_rate * d_loss_wrt_params # gradient descent# iteration number. We want it to start at 0.iter (epoch - 1) * n_train_batches minibatch_index# note that if we do iter % validation_frequency it will be# true for iter 0 which we do not want. We want it true for# iter validation_frequency - 1.if (iter 1) % validation_frequency 0:this_validation_loss ... # compute zero-one loss on validation setif this_validation_loss best_validation_loss:# improve patience if loss improvement is good enoughif this_validation_loss best_validation_loss * improvement_threshold:patience max(patience, iter * patience_increase)best_params copy.deepcopy(params)best_validation_loss this_validation_lossif patience iter:done_looping Truebreak# POSTCONDITION:
# best_params refers to the best out-of-sample parameters observed during the optimization 如果我们在跑完patience之前跑完了所有的训练数据那么我们只需要回到训练数据的开始部分然后再来一次。 notevalidation_frequency应该总是要小于patience的。在跑完patience之前代码需要检查至少两次。这是因为我们使用的公式validation_frequency min( value,patience/2)。 note当决定什么时候需要增大patience的时候算法可以通过使用统计测试的方法来明显的提升而不是简单的使用对比。 测试 在现有的循环之后best_params变量表示在验证集上best-performing的模型。如果我们给另一个模型类别重复这个过程或者甚至使用另一个随机初始化我们应该也要对数据使用相同的train/valid/test划分然后得到其他best-performing模型。如果我们不得不需要选择最好的模型类别或者最好的初始化我们需要对每个模型进行对比best_validation_loss。当我们选择我们认为的最好的模型基于验证集的时候我们会将这个模型用在测试集上并报告结果。 回顾 这是为了优化部分准备的。早期停止的技术需要我们将样本集合划分成三个不同的集合训练集、验证集、测试集。训练集用来作为目标函数的可微分的近似函数的minibatch sgd上。当我们执行梯度下降的时候我们定期的使用验证集来观察我们在真正的目标函数上模型的结果或者至少从经验上分析。当我们在验证集上看到一个好的模型的时候我们需要保存下来当我们发现从看到一个好模型已经过去了很久那么我们就放弃我们的研究回头去找到那些最好的参数然后在测试集上进行评估。 五、theano/python的提示 装载和保存模型 当你做实验的时候会花费好几个小时或者几天来做梯度下降然后找到最好的参数。一旦你找到了它们你将会需要保存这些权重。随着研究的开展你也许同样会想要保存你当前最好的结果。 从共享变量中pickle这个numpy ndarrays 最好的保存/存档你的模型的参数的方法是使用pickle或者深度复制ndarray对象。例如如果你的参数都放在共享变量wvu中那么你可以像下面的命令来保存 import cPicklesave_file open(path, wb) # this will overwrite current contentscPickle.dump(w.get_value(borrowTrue), save_file, -1) # the -1 is for HIGHEST_PROTOCOLcPickle.dump(v.get_value(borrowTrue), save_file, -1) # .. and it triggers much more efficientcPickle.dump(u.get_value(borrowTrue), save_file, -1) # .. storage than numpys defaultsave_file.close()然后你可以像这样装载你的数据 save_file open(path)w.set_value(cPickle.load(save_file), borrowTrue)v.set_value(cPickle.load(save_file), borrowTrue)u.set_value(cPickle.load(save_file), borrowTrue)这些技术是有一点过于详尽了不过试过都是正确的。你可以在matplotlib中毫无问题的装载你的数据然后对它进行加工。 不要为需要长期存储的目的而pickle你的训练或测试函数 theano函数是兼容python的深度复制和pickle机制的不过你没必要一定pickle一个theano函数。如果你更新你的theano文件夹或者说其内部有一些改变那么你也许没法unpickle你的模型。theano仍然是一个动态的开发项目内部的APIs可能会改变。所以从安全角度上来说不要为了长期的存储而pickle你的整个训练或者测试函数也就是如果save几天或者几个礼拜估计还ok就是怕几个月之后更新了theano之前的保存的就没法读取了。pickle机智是为了短期存储而准备的例如一个临时文件或者在一个分布式工作中从一个机器上复制到另一个机器上。 了解更多可以看看 serialization in Theano, 或者 Python的 pickling. 显示中间的结果 可视化对于理解你的模型或者训练算法在干什么是很有帮助的工具。你可能需要视图键入matplotlib画图命令或者PIL 图像呈现命令到你的模型训练脚本中。然而之后你可能想要从这些预呈现的图形中显示一些你感兴趣的或者想要看看从图形中得到的是否清晰那么你需要保存原始的模型。 如果你有足够的磁盘空间你的训练脚本应该保存中间模型并且一个可视化脚本应该用来处理这些保存的模型。 你已经有了一个模型保存函数了吗可以再次使用它来保存这些中间模型 你可能会想要了解的库python图像库 (PIL), matplotlib. 参考资料 [1] 官网http://deeplearning.net/tutorial/gettingstarted.html#gettingstarted [2] theano学习指南1http://www.cnblogs.com/xueliangliu/archive/2013/04/03/2997437.html 转载于:https://www.cnblogs.com/shouhuxianjian/p/4564627.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/87905.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!