package com.alatus.djl.web;

import ai.djl.Model;
import ai.djl.ndarray.NDArray;
import ai.djl.ndarray.NDManager;
import ai.djl.ndarray.types.Shape;
import ai.djl.nn.Activation;
import ai.djl.nn.Blocks;
import ai.djl.nn.SequentialBlock;
import ai.djl.nn.core.Linear;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * author: Alatus
 * date: 2025/2/2
 * email: alatuslee@qq.com
 * description:使用DJL训练大模型
 */
@RestController
public class DJL {
//    机器学习最基本的,我们要把我们需要处理的数据给转为一个N维向量
//    只有转为一个向量了,才能继续向下处理
    @GetMapping("/test01")
    public String test01() {
        try(NDManager manager = NDManager.newBaseManager()){
//            我们通过这个manager创建向量
//            这里的Shape就是N维数组的形状
//            我们这里创建的是一个2乘以3的矩阵(N维向量)
//            这里的ones指的是内容都是1填充的
//            输出的1.代表这是一个1的float值
            NDArray ones = manager.ones(new Shape(2, 3));
            System.out.println(ones);
//            这里,我们同样可以自己创建一个矩阵
//            通过创建对应的数组和给予我们需要的形状来创建一个矩阵
            NDArray array = manager.create(new float[]{1.14F, 5.14F, 1.9F, 1.9F, 8.10F, 1.14f}, new Shape(2, 3));
            System.out.println(array);
//            矩阵计算
//            如矩阵转质,这里我们的矩阵二乘三的矩阵就变成了三乘二
            NDArray transpose = array.transpose();
            System.out.println(transpose);
            return "矩阵"+ones+"和"+array+"的转置为"+transpose;
        }
    }
//    我们这里的这些矩阵你可以模拟为从数据集中加载的
//    数据集是用于训练机器学习模型的数据集合
//    机器学习通常使用三个数据集,训练集,验证集和测试集

//    训练集是我们用来训练的实际数据集,模型从这些数据中学习权重和参数

//    验证集用来在训练过程中评估给定模型,它帮助机器学习工程师在模型开发阶段微调超参数
//    模型不从验证数据集学习,验证数据集是可选的

//    测试数据集提供了用于评估模型性能的黄金标准,它只在模型完全训练完成后使用
//    测试数据集应该更准确的评估模型将如何在新数据上执行

//    当我们有了数据集以后
//    数据集加载为N维向量,我们需要通过Translator来转换数据集
    @GetMapping("/test02")
    public String test02() {
//        输入的图片像素
        long inputSize = 28 * 28;
//        输出的图片类型
        long outputSize = 10;
//        整一个批量扁平块,把二维图像输入转为一维特征向量
        SequentialBlock block = new SequentialBlock();
//        添加扁平块
        block.add(Blocks.batchFlattenBlock(inputSize));
//        添加一个隐藏层,线性变化大小为128
        block.add(Linear.builder().setUnits(128).build());
//        添加相应的激活函数
        block.add(Activation::relu);

//        第二个隐藏层的激活函数,这一层是大小为64的变化
        block.add(Linear.builder().setUnits(64).build());
        block.add(Activation::relu);

//        我试着添加一个32的隐藏层激活函数
        block.add(Linear.builder().setUnits(32).build());
        block.add(Activation::relu);

//        最后输出10大小的特征向量
        block.add(Linear.builder().setUnits(outputSize).build());

//        这些大小是在实验过程中选择的
//        围绕块,可以构建我们的模型,添加一些重要的元数据,如可以在训练和推理时使用的超参数
        Model model = Model.newInstance("mlp");
        model.setBlock(block);
//        现在就拥有了块和模型了,剩下的就是如何进行训练的部分
        return "构建块和模型";
    }
}
package com.alatus.djl.web;

import ai.djl.Model;
import ai.djl.ndarray.NDArray;
import ai.djl.ndarray.NDManager;
import ai.djl.ndarray.types.Shape;
import ai.djl.nn.Activation;
import ai.djl.nn.Blocks;
import ai.djl.nn.SequentialBlock;
import ai.djl.nn.core.Linear;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * author: Alatus
 * date: 2025/2/2
 * email: alatuslee@qq.com
 * description:使用DJL训练大模型
 */
@RestController
public class DJL {
//    机器学习最基本的,我们要把我们需要处理的数据给转为一个N维向量
//    只有转为一个向量了,才能继续向下处理
    @GetMapping("/test01")
    public String test01() {
        try(NDManager manager = NDManager.newBaseManager()){
//            我们通过这个manager创建向量
//            这里的Shape就是N维数组的形状
//            我们这里创建的是一个2乘以3的矩阵(N维向量)
//            这里的ones指的是内容都是1填充的
//            输出的1.代表这是一个1的float值
            NDArray ones = manager.ones(new Shape(2, 3));
            System.out.println(ones);
//            这里,我们同样可以自己创建一个矩阵
//            通过创建对应的数组和给予我们需要的形状来创建一个矩阵
            NDArray array = manager.create(new float[]{1.14F, 5.14F, 1.9F, 1.9F, 8.10F, 1.14f}, new Shape(2, 3));
            System.out.println(array);
//            矩阵计算
//            如矩阵转质,这里我们的矩阵二乘三的矩阵就变成了三乘二
            NDArray transpose = array.transpose();
            System.out.println(transpose);
            return "矩阵"+ones+"和"+array+"的转置为"+transpose;
        }
    }
//    我们这里的这些矩阵你可以模拟为从数据集中加载的
//    数据集是用于训练机器学习模型的数据集合
//    机器学习通常使用三个数据集,训练集,验证集和测试集

//    训练集是我们用来训练的实际数据集,模型从这些数据中学习权重和参数

//    验证集用来在训练过程中评估给定模型,它帮助机器学习工程师在模型开发阶段微调超参数
//    模型不从验证数据集学习,验证数据集是可选的

//    测试数据集提供了用于评估模型性能的黄金标准,它只在模型完全训练完成后使用
//    测试数据集应该更准确的评估模型将如何在新数据上执行

//    当我们有了数据集以后
//    数据集加载为N维向量,我们需要通过Translator来转换数据集
    @GetMapping("/test02")
    public String test02() {
//        输入的图片像素
        long inputSize = 28 * 28;
//        输出的图片类型
        long outputSize = 10;
//        整一个批量扁平块,把二维图像输入转为一维特征向量
        SequentialBlock block = new SequentialBlock();
//        添加扁平块
        block.add(Blocks.batchFlattenBlock(inputSize));
//        添加一个隐藏层,线性变化大小为128
        block.add(Linear.builder().setUnits(128).build());
//        添加相应的激活函数
        block.add(Activation::relu);

//        第二个隐藏层的激活函数,这一层是大小为64的变化
        block.add(Linear.builder().setUnits(64).build());
        block.add(Activation::relu);

//        我试着添加一个32的隐藏层激活函数
        block.add(Linear.builder().setUnits(32).build());
        block.add(Activation::relu);

//        最后输出10大小的特征向量
        block.add(Linear.builder().setUnits(outputSize).build());

//        这些大小是在实验过程中选择的
//        围绕块,可以构建我们的模型,添加一些重要的元数据,如可以在训练和推理时使用的超参数
        Model model = Model.newInstance("mlp");
        model.setBlock(block);
//        现在就拥有了块和模型了,剩下的就是如何进行训练的部分
        return "构建块和模型";
    }
}
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐