计算机系统应用教程网站

网站首页 > 技术文章 正文

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

btikc 2024-10-23 09:20:44 技术文章 8 ℃ 0 评论

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

一、 准备环境

  • windows
  • 安装idea
  • 安装maven

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

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

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

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

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

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


一个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的结构:



六、源代码

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <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>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <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());
    }
}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表