在对模型进行编译(Compile)的过程中,要选择并指定优化器。 优化器决定模型如何根据其看到的数据和自身的损失函数对模型参数进行更新,以最小化损失函数 。Keras中的 优化器 有:
那么,该如何选择呢?首先,Keras的优化器可以分为:
在大多数情况下,Adam 是自适应优化器中最好的,无脑选择Adam,没问题。使用Adam这种自适应优化器,还不需要关心学习率的问题。
这篇文章介绍的是关于并行深度神经网络的设计。在今年发布的两个机器学习项目中,cxxnet是最精彩的一个。因为它包含了我们团队可以发挥到的机器学习和系统的各个方面的极致:除了前沿的深度学习之外,它的两个独到特点也是让我们在设计实现中最为享受的1)灵活的公式支持和极致的C++模板编程;深度神经网络的实现大致分两类:以python为主的编程效率派和以c++为核心的为代表的追逐性能派。前者支持直接tensor的计算,而后者往往需要给每个神经网络的层和更新公式编写独立的cudakernel。编程效率派认为机器学习程序员应该是写公式来达到代码最大的可读性和易改写性。而很多以C++为核心的代码之所以没有支持非常灵活的张量计算,是因为因为运算符重载和临时空间的分配会带来效率的降低。cxxnet的核心mshadow在这两者之间做了一个平衡。使得我们在不损失效率的前提下可以通过模板编程技术允许开发者编写和matlab/numpy类似的代码,并且在编译时自动成优化的kernel。其背后的expressiontemplate技术是我最喜欢的c++trick之一。非常值得最求效率抽象和优美的同学了解。因为采用了mshadow作为核心,直接导致cxxnet的各种实现可以非常简单可读,编写一份代码就可以在GPU和CPU上面跑。使得其在代码简洁和可扩展上更加容易。2)通用的并行参数共享和更新方案多卡和多机计算一直是大规模机器学习中一个让人兴奋的话题。提到神经网络并行,最让我头疼的是可以选择的方案很多,而都涉及到不同的hack。单机多卡到底是用P2P,还是拷贝到内存,是用stream开始开多线程。分布式到底是用parameterserver,MPI还是自己写一个框架。可以选择的方法很多。设计出一个分布式的代码不难,困难的是如何让并行的接口自然的独立出来,使得其不会影响其它部分的实现。经过不断地考虑,最终我决定采用了mshadow-ps这样一个统一的参数共享接口。简单的说,mshadow-ps是一个GPU的异步parameterserver接口(应该也是目前为止唯一一个,因为GPU线程模型和CPU不同,原有的的ps库并不能直接用于GPU)。异步通信对于神经网络的更新非常重要。在backprop算法中,我们很早就可以获得梯度并且进行梯度同步,而只有到下一次forward到对应层的时候才会需要这个weight。我和limu合作设计了ps风格的三个接口来解决这样的同步问题,Push/PullReq和Pullwait。当获backprop得梯度的时候直接调用push把梯度发送出去,并且调用pullreq请求结果。Push和Pullreq都是异步 *** 作,背后会有单独的线程同时完成数据拷贝同步,以及拷回的 *** 作。而当我们需要weight之前在调用Pullwait来等待可能没有完成的 *** 作。这样简单的三个接口,使得我们可以经过很少的改动就可以设计出多卡和分布式的神经网络来,并且在调用这些接口的时候完全不需要关系同步的实现是什么。值得一提的是,这样的编程模式把多GPU,分布式以及各个通信框架直接结合起来。mshadow-ps支持单机多卡的GPUPS,以及基于parameter-server的分布式PS实现。同样的也可以很容易MPI来支持多机通信。使得一个统一的接口,可以完成从单机多卡到分布式各种后端实现的支持。并且因为高效的异步通信,使得我们可以在alexnet上面达到linearspeedup(注:并行的难度在于计算和通信的时间比,weight少更加复杂的网络反而更加容易线性加速,而alexnet是非常困难的例子)。经过团队里面大家不断地努力,cxxnet的V2终于可以和大家见面了。除了上述介绍的技术亮点之外,还有各种好玩的特性。现在把特点总结如下:1轻量而齐全的框架:我们尽力维持最小的依赖库实现最多的功能。推荐环境下仅需要CUDA,OpenCV,MKL或BLAS即可编译。2强大的统一的并行计算接口:基于mshadow-ps的并行计算接口采用了一份代码解决了多GPU,多机的异步同步。同步和计算重叠,在多份测试中均可以得到线性加速比。3易于扩展的代码结构:cxxnet计算核心由mshadow提供。Mshadow使用户可以编写numpy/matlab风格的代码,但仍具备手动优化cuda代码的灵活性。CPU和GPU共享同一份代码,在编译期间通过模板自动翻译成CUDA/MKL调用。另外一些特性包括:4CuDNN支持:Nvidia原生卷积支持,可加速计算30%!5及时更新的最新技术:我们将及时跟进学术界的动态,例如现在已经支持MSRA的ParametricRelu和Google的BatchNormalization6Caffe模型转换:支持将训练好的Caffe模型直接转化为cxxnet模型(本周内上线!)7方便的语言接口:在Python中直接进行训练,方便可视化。Matlab也将很快提供我们相信可以通过最简洁清晰的代码来完成高效的C++深度神经网络实现。我们也欢迎对于系统和机器学习有兴趣的同学加入到项目中来
给模型投喂投喂数据,需要读取数据,对数据进行预处理,然后将其传递给模型进行训练。
下面是一个使用Python将数据输入到Keras模型中进行训练的例子:
import numpy as np
from kerasmodels import Sequential
from keraslayers import Dense
# 生成随机数据
data = nprandomrandom((1000, 10))
labels = nprandomrandint(2, size=(1000, 1))
# 构建模型
model = Sequential()
modeladd(Dense(32, activation='relu', input_dim=10))
modeladd(Dense(1, activation='sigmoid'))
# 编译模型
modelcompile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# 训练模型
modelfit(data, labels, epochs=10, batch_size=32)
在这个例子中,我们首先生成了一个形状为(1000, 10)的随机数据数组和一个形状为(1000, 1)的随机标签数组,表示我们的训练集。然后,我们构建了一个简单的Keras模型,使用两个密集层,并编译了该模型,使用二元交叉熵作为损失函数和准确率作为指标。最后,我们使用模型的fit()方法将数据传递给模型进行训练。
通过类似的方法,我们就成功给这个模型投喂了数据。
m1保存的是模型图结构
m2保存的是训练后的模型参数和模型图结构
m3保存的是模型参数,没有保存图结构,加载的时候需要先构建模型结构。
1、保存了模型结构的权重文件才能直接使用 load_model 直接加载
2、只保存了权重参数的文件需要重新构建模型结构才能加载。
以上就是关于如何选择Keras的优化器全部的内容,包括:如何选择Keras的优化器、如何从零使用 Keras + TensorFlow 开发一个复杂深度学习模型、如何给模型投喂数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)