BigDL入门 (1)
在BigDL中,完成一次完整的深度学习过程共需要如下几步:
1. 构建数据集:
将训练数据转换成模型可以处理的类型,在Spark环境下即为Sample类型的RDD。
2. 编写模型
使用内置的类Keras接口编写深度模型。
3. 模型训练
选择合适的损失函数和优化方法(SGD,ADAM等等),对模型进行训练。
4. 模型Serving (可选)
加载训练好的模型,供业务使用。
一个完整的例子:
例子使用iris数据集,该数据集收集了150条鸢尾花卉的数据,每条记录包含4个属性,分别为包含花萼长度、花萼宽度、花瓣长度和花瓣宽度,目标在于预测鸢尾花卉属于三个类别中的哪一类。在下面的例子中,将展示如何通过BigDL构建一个简单的神经网络用来完成这项任务。
首先,需要在项目中引入BigDL的依赖,以Maven为例:
<dependency>
<groupId>com.intel.analytics.bigdl</groupId>
<artifactId>bigdl-SPARK_2.2</artifactId>
<version>0.7.2</version>
</dependency>
然后,需要对运行时进行初始化。对于Spark应用而言,主要是SparkContext的初始化:
val sparkConf = new SparkConf()
.setMaster("local[2]")
.setAppName("IrisExample")
val sc = new SparkContext(Engine.createSparkConf(sparkConf))
Engine.init
接下来,加载需要的数据,然后构建模型。在本例子中,使用BigDL内置的Keras风格接口来定义模型:
val sampleRDD = sc.textFile("data/iris.data", 1).filter(!"".equals(_)).map(line => {
val subs = line.split(",")
val feature=Tensor(subs.slice(0, 4).map(_.toFloat), Array(4))
val getLabel:String => Float = {
case "Iris-setosa" => 1.0f
case "Iris-versicolor" => 2.0f
case "Iris-virginica" => 3.0f
}
Sample[Float](feature, Tensor(Array(getLabel(subs(4))), Array(1)))}
)
val Array(trainingRDD, valRDD)=sampleRDD.randomSplit(Array(0.9, 0.1))
val model = Sequential[Float]()
model.add(Dense(40, inputShape = Shape(4), activation = "relu"))
model.add(Dense(20, activation = "relu"))
model.add(Dense(3, activation = "softmax"))
model.compile("adam", "sparse_categorical_crossentropy", Array("accuracy"))
最后,对模型进行评估和训练,仍然使用Keras风格接口:
model.fit(trainingRDD, batchSize=50, nbEpoch=50, validationData = valRDD)
相关代码可以在github中找到,不妨动手一试。