您的位置 首页 java

Java程序员学深度学习 DJL上手3 创建神经网络

Java程序员学深度学习 DJL上手3 创建神经网络

本文目的是创建一个图像分类模型 。由于本系列文章主要关注的是Java编写深度学习应用,而且我本人对深度学习原理也不熟悉,所以本系列文章不过多讲解深度学习的原理。

一、 准备环境

  • windows
  • 安装 idea
  • 安装 maven

本文使用 MNIST 手写字体数据集,数据集包含0-9的黑白手写数字,每个图像大小28*28。使用 MNIST 的手写字体数据集对神经网络进行训练和预测,可以认为是深度神经网络的“Hello World”入门程序。

本文并没有实现完整的训练、识别,只是建了一个神经网络层。

Java程序员学深度学习 DJL上手3 创建神经网络

二、 多层感知器的简单概念

本文将要创建的神经网络称为 MLP ,它是最简单的神经网络,而其它一些神经网络,如:误差反向传播(BP)、概率神经网络、卷积神经网络(CNN,适用于图像识别)、时间神经网络( LSTM ,适用于语音识别)等,都可以认为是MLP的变种。

MLP是分层来处理数据,第一层是包含要输入数据的输入层,最后一层是产生结果的输出层。当中的层称为隐藏层。

下面是一个MLP示例,包含大小为3的输入层、大小3的单个隐藏层和大小为2的输出层。

Java程序员学深度学习 DJL上手3 创建神经网络


一个MLP的隐藏层数据、大小通常要经过试验测试来确定。每对层之间都有一个线性操作(称为全连接操作,是个 矩阵乘法 运算);每个线性操作后面还要有非线性的激活功能。

三、确定输入和输出大小

MLP模型 使用一维矢量作为输入和输出。比如本文将要使用的MNIST数据集里,图像大小是28*28,每个像素点用0和1即可表示出来,下面定义的变量:

 long inputSize = 28*28;
long outputSize = 10;  

输出变量10表示 有每个图像有10个可能的分类。

四、创建顺序块(SequentialBlock)

1. NDArray和NDList

NDArray是深度学习的核心数据类型。NDArray与Numpy里的多维数组有点像,代表多维、固定大小的均匀阵列。
NDList是一个NDArrays的列表,可以有不同的大小和数据类型。

2. 块(block)

DJL中由块来组成单个操作或神经网络,它可以表示单个操作、或g作为神经网络的一部分,甚至用来拼成整个神经网络。
这里调用API 创建一个顺序块。

 SequentialBlock block = new SequentialBlock();  

五、将块添加到顺序块

MLP 分为多个层,每个层由线性块和非线性的激活函数组成。这里使用常见的 ReLU 激活函数。

第一层和最后一层有固定的大小,中间层则取决于试验和经验。

 block.add(Blocks.batchFlattenBlock(inputSize));
block.add(Linear.builder().setUnits(128).build());
block.add(Activation::relu);
block.add(Linear.builder().setUnits(64).build());
block.add(Activation::relu);
block.add(Linear.builder().setUnits(outputSize).build());
log.info(block.ToString());  

通过设置的断点,可以查看block的结构:

Java程序员学深度学习 DJL上手3 创建神经网络

六、 源代码

pom.xml

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="#34;
         xmlns:xsi="#34;
         xsi:schemaLocation=" #34;>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.xundh</groupId>
    <artifactId>djl</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <djl.version>0.9.0</djl.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>ai.djl</groupId>
            <artifactId>api</artifactId>
            <version>${djl.version}</version>
        </dependency>
        <dependency>
            <groupId>ai.djl.pytorch</groupId>
            <artifactId>pytorch-model-zoo</artifactId>
            <version>${djl.version}</version>
        </dependency>
        <dependency>
            <groupId>ai.djl.pytorch</groupId>
            <artifactId>pytorch-engine</artifactId>
            <version>${djl.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>ai.djl.pytorch</groupId>
            <artifactId>pytorch-native-auto</artifactId>
            <version>1.8.1</version>
        </dependency>
        <!--  -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
            <scope>provided</scope>
        </dependency>

    </dependencies>
</project>

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849  

learn1.java

 package com.jcg.djl;

import ai.djl.nn.Activation;
import ai.djl.nn.Blocks;
import ai.djl.nn.SequentialBlock;
import ai.djl.nn.core.Linear;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Learn1 {
    public static void main(String[] args){
        long inputSize = 28*28;
        long outputSize = 10;

        SequentialBlock block = new SequentialBlock();

        block.add(Blocks.batchFlattenBlock(inputSize));
        block.add(Linear.builder().setUnits(128).build());
        block.add(Activation::relu);
        block.add(Linear.builder().setUnits(64).build());
        block.add(Activation::relu);
        block.add(Linear.builder().setUnits(outputSize).build());

        log.info(block.toString());
    }
}
  

文章来源:智云一二三科技

文章标题:Java程序员学深度学习 DJL上手3 创建神经网络

文章地址:https://www.zhihuclub.com/182186.shtml

关于作者: 智云科技

热门文章

网站地图