deeplearning4j例程(一) CSVExample

        这个例程比较简单,写这篇博客主要时为了做一些简单的记录,以防止后面遇到浪费不必要的时间。

这个例程包含读入CSV数据,对数据进行归一化处理,然后创建简单的神经网络,训练然后预测。 

package org.deeplearning4j.examples.dataExamples;

import org.datavec.api.records.reader.RecordReader;
import org.datavec.api.records.reader.impl.csv.CSVRecordReader;
import org.datavec.api.split.FileSplit;
import org.datavec.api.util.ClassPathResource;
import org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator;
import org.deeplearning4j.eval.Evaluation;
import org.deeplearning4j.nn.conf.MultiLayerConfiguration;
import org.deeplearning4j.nn.conf.NeuralNetConfiguration;
import org.deeplearning4j.nn.conf.layers.DenseLayer;
import org.deeplearning4j.nn.conf.layers.OutputLayer;
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
import org.deeplearning4j.nn.weights.WeightInit;
import org.deeplearning4j.optimize.listeners.ScoreIterationListener;
import org.nd4j.linalg.activations.Activation;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.dataset.DataSet;
import org.nd4j.linalg.dataset.SplitTestAndTrain;
import org.nd4j.linalg.dataset.api.iterator.DataSetIterator;
import org.nd4j.linalg.dataset.api.preprocessor.DataNormalization;
import org.nd4j.linalg.dataset.api.preprocessor.NormalizerStandardize;
import org.nd4j.linalg.lossfunctions.LossFunctions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author Adam Gibson
 */
public class CSVExample {

    private static Logger log = LoggerFactory.getLogger(CSVExample.class); 创建log,便于打印日志

    public static void main(String[] args) throws  Exception {

        //First: get the dataset using the record reader. CSVRecordReader handles loading/parsing
        int numLinesToSkip = 0;  有些文件具有表头,有些没有。即读取文件时需要跳过的行数
        String delimiter = ",";       数据之间的分隔符
        RecordReader recordReader = new CSVRecordReader(numLinesToSkip,delimiter);    文件读取器
        recordReader.initialize(new FileSplit(new ClassPathResource("iris.txt").getFile()));      从磁盘读取文件

        //Second: the RecordReaderDataSetIterator handles conversion to DataSet objects, ready for use in neural network       
        //5 values in each row of the iris.txt CSV: 4 input features followed by an integer label (class) index. Labels are the 5th value (index 4) in each row
  int labelIndex = 4; //label所在的位置,
        //3 classes (types of iris flowers) in the iris data set. Classes have integer values 0, 1 or 2
int numClasses = 3; 分多少类
        //Iris data set: 150 examples total. We are loading all of them into one DataSet (not recommended for large data sets)
int batchSize = 150;数据共有多少条?还是要批处理的数量? //将数据存入迭代器,参数分别为:读取器 批处理的量 label的位置 分多少类 DataSetIterator iterator = new RecordReaderDataSetIterator(recordReader,batchSize,labelIndex,numClasses); DataSet allData = iterator.next(); 将数据转为DataSet格式 allData.shuffle(); 混洗,打乱数据 //分成训练集和测试集 SplitTestAndTrain testAndTrain = allData.splitTestAndTrain(0.65); //Use 65% of data for training DataSet trainingData = testAndTrain.getTrain(); 获得训练集 DataSet testData = testAndTrain.getTest(); 获得测试集 System.out.println("allData = "+allData.numExamples()+" train = "+trainingData.numExamples()); //We need to normalize our data. We'll use NormalizeStandardize (which gives us mean 0, unit variance): DataNormalization normalizer = new NormalizerStandardize(); 对数据进行归一化
        //Collect the statistics (mean/stdev) from the training data. This does not modify the input data
normalizer.fit(trainingData); 计算训练集的均值和方差
normalizer.transform(trainingData); 对训练集进行归一化
normalizer.transform(testData); 利用训练集的数据对测试集进行归一化
final int numInputs = 4; 输入数据的维度
int outputNum = 3; 分类的个数
 int iterations = 1000; 迭代次数
long seed = 6; 随机数
log.info("Build model...."); 配置网络结构
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
.seed(seed) .iterations(iterations) .activation(Activation.TANH) 激活函数为双曲正切
.weightInit(WeightInit.XAVIER) 权重初始化
.learningRate(0.1) 学习率
.regularization(true).l2(1e-4) l2正则化
.list() .layer(0, new DenseLayer.Builder().nIn(numInputs).nOut(3) 第一层输入为4个节点,输出为3个
.build()) .layer(1, new DenseLayer.Builder().nIn(3).nOut(3) 输入为3个输出为3个
.build()) .layer(2, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD) .activation(Activation.SOFTMAX) 激活函数为softmax
.nIn(3).nOut(outputNum).build()) .backprop(true).pretrain(false) 反向传播
.build();
//run the model MultiLayerNetwork model = new MultiLayerNetwork(conf); model.init();
model.setListeners(new ScoreIterationListener(100)); 每迭代100次,输出一次日志
model.fit(trainingData); 开始训练 //evaluate the model on the test set
Evaluation eval = new Evaluation(3);
INDArray output = model.output(testData.getFeatureMatrix()); 获得输入数据的特征值,并计算预测值
eval.eval(testData.getLabels(), output); 评估原始label与预测的predict
log.info(eval.stats()); 打印日志 }}







结果如下:



如有问题,请批评指正。谢谢

deeplearning4j是基于java的深度学习库,当然,它有许多特点,但暂时还没学那么深入,所以就不做介绍了 需要学习dl4j,无从下手,就想着先看看官网的examples,于是,下载了examples程序,结果无法运行,总是出错,如下: 查看一周的错误,也没有成功,马上就要放弃了,结果今天在论坛一大牛指导下,终于成功跑起,下面,将心酸的环境配置过程记录如下,以备自己以后查阅,同时,也希望各种高手可以指点,毕竟,本人还是菜鸟一枚 1.安装JAVA运行环境 该部分,网上有许多教程,这里不再赘述,首先,就是安装一个JDK,然后,再安装一个自己喜欢的IED,这里,以eclispe为例 好了,java的运行环境配置好了,接下来,开始配置dl4j的运行环境,它的官网上给了好复杂的设置步骤,照着做看一些后,发现根本无法进行,结果发现,不需要全部设置完成,就可以运行它的例子了,所以,本人并没有按照官网的教程全部设置,只是设置到了可以运行官网的examples为止,可能存在隐患吧,但本人能力有限,实在无从下手,还期待高手指定 2.按照Maven 按照教程安装Maven,该教程讲述非常详细 (1)下载Maven3,3,3,以win7 64位为例 下载地址:https://maven.apache.org/download.cgi (2)将Maven解压到某个文件夹中,这里以“C:\Program Files\apache-maven-3.3.3”为例 (3)配置环境变量:将maven中的bin的路径添加到system variables的PATH中 (4)测试maven是否安装成功 在命令行中输入mvn -version 如果如下下图所示结果,证明配置正确 3. 下载dl4j的examples,网址为: https://github.com/deeplearning4j/dl4j-0.4-examples 4.打开eclipse,导入刚刚下载的dl4j的examples,具体地: 打开eclipse后->File->import->Maven Existing Maven Projects,在Root Directory中选择examples的文件夹 然后,Finish 这样,examples被成功导入 当然,由于Maven会自动导入程序所需的jar文件(在配置文件pom.xml中所提及),所以,会花费一些时间自动下载这些文件 点击运行,出现如下错误: 这个问题困扰了本人一周,终于解决,是因为系统缺少dll文件所致 5. 下载dll文件,地址为https://www.dropbox.com/s/6p8yn3fcf230rxy/ND4J_Win64_OpenBLAS-v0.2.14.zip?dl=1 下载后,将该文件随意放入一个文件夹中,这里以“C:/BLAS”为例 将所有下载得到的dll文件放入该文件夹,并且,将该路径添加至环境变量Path中 6.此时,再运行刚刚的examples,发现程序终于可以正常运行了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值