You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求提供DL4J中Autoencoder含数据处理流程的完整示例

DL4J Autoencoder 完整端到端示例(基于MNIST数据集)

我完全懂你的困扰——DL4J官方文档里关于Autoencoder的完整示例确实比较零散,大多只给配置片段,缺少从数据到预测的全流程。下面我给你一个基于MNIST手写数字数据集的完整Autoencoder示例,涵盖数据加载、预处理、模型构建、训练、重构预测所有环节,你可以直接参考运行:

必要依赖(Maven)

首先确保你的项目里包含这些核心依赖:

<dependencies>
    <dependency>
        <groupId>org.deeplearning4j</groupId>
        <artifactId>deeplearning4j-core</artifactId>
        <version>1.0.0-M2.1</version>
    </dependency>
    <dependency>
        <groupId>org.deeplearning4j</groupId>
        <artifactId>deeplearning4j-datasets</artifactId>
        <version>1.0.0-M2.1</version>
    </dependency>
    <dependency>
        <groupId>org.nd4j</groupId>
        <artifactId>nd4j-native-platform</artifactId>
        <version>1.0.0-M2.1</version>
    </dependency>
</dependencies>

完整Java代码示例

import org.deeplearning4j.datasets.iterator.impl.MnistDataSetIterator;
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.nd4j.linalg.activations.Activation;
import org.nd4j.linalg.dataset.DataSet;
import org.nd4j.linalg.dataset.api.iterator.DataSetIterator;
import org.nd4j.linalg.lossfunctions.LossFunctions;

public class AutoencoderFullExample {
    public static void main(String[] args) throws Exception {
        // 1. 加载并预处理MNIST数据集
        int batchSize = 64;
        DataSetIterator trainIterator = new MnistDataSetIterator(batchSize, true, 12345);
        DataSetIterator testIterator = new MnistDataSetIterator(batchSize, false, 12345);

        // 归一化输入到0-1范围(Autoencoder用Sigmoid激活时,输入范围匹配很重要)
        trainIterator.setPreProcessor((dataSet) -> dataSet.normalize(0, 1));
        testIterator.setPreProcessor((dataSet) -> dataSet.normalize(0, 1));

        // 2. 构建Autoencoder配置
        int inputSize = 784; // MNIST图像是28*28=784像素
        int hiddenSize = 256; // 隐藏层维度,即编码后的特征维度

        MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
                .seed(12345)
                .weightInit(WeightInit.XAVIER)
                .updater(new org.deeplearning4j.nn.conf.Updater.Adam(0.001))
                .list()
                // 编码层:输入->隐藏层
                .layer(new DenseLayer.Builder()
                        .nIn(inputSize)
                        .nOut(hiddenSize)
                        .activation(Activation.SIGMOID)
                        .build())
                // 解码层:隐藏层->输出(和输入维度一致,用于重构)
                .layer(new OutputLayer.Builder(LossFunctions.LossFunction.MSE)
                        .nIn(hiddenSize)
                        .nOut(inputSize)
                        .activation(Activation.SIGMOID)
                        .build())
                .build();

        // 3. 初始化模型并训练
        MultiLayerNetwork model = new MultiLayerNetwork(conf);
        model.init();

        System.out.println("开始训练Autoencoder...");
        for (int epoch = 0; epoch < 10; epoch++) {
            model.fit(trainIterator);
            trainIterator.reset(); // 重置迭代器,下一轮重新遍历训练数据
            System.out.println("完成第 " + (epoch+1) + " 轮训练");
        }

        // 4. 测试重构效果:取一个测试样本,对比原始和重构结果
        System.out.println("\n测试样本重构效果:");
        DataSet testDataSet = testIterator.next(1); // 取1个测试样本
        // 原始输入
        double[] originalInput = testDataSet.getFeatures().toDoubleVector();
        // 重构输出
        double[] reconstructedOutput = model.output(testDataSet.getFeatures()).toDoubleVector();

        // 打印前10个像素值对比(可以扩展为可视化,比如用JavaFX显示图像)
        System.out.println("原始像素值(前10个):");
        for (int i = 0; i < 10; i++) {
            System.out.printf("%.4f ", originalInput[i]);
        }
        System.out.println("\n重构像素值(前10个):");
        for (int i = 0; i < 10; i++) {
            System.out.printf("%.4f ", reconstructedOutput[i]);
        }
    }
}

代码说明

  • 数据预处理:MNIST数据归一化到0-1,和输出层的Sigmoid激活范围匹配,保证重构效果更好。
  • 模型结构:典型的单隐藏层Autoencoder,编码层将784维输入压缩为256维特征,解码层再重构回784维。
  • 训练逻辑:用Adam优化器,损失函数选MSE(均方误差),因为是重构任务,目标是让输出尽可能接近输入。
  • 重构测试:取单个测试样本,对比原始输入和模型输出的像素值,验证重构效果。

适配Movielens数据集的思路

如果你想基于Movielens做Autoencoder(用于推荐系统的评分预测/用户特征提取),可以这样调整:

  1. 数据加载:解析Movielens的CSV文件,转为用户-物品评分矩阵(稀疏矩阵),也可以用DL4J的推荐系统相关迭代器处理。
  2. 预处理:将稀疏矩阵转为稠密向量(或使用支持稀疏输入的层),把1-5分的评分归一化到0-1范围。
  3. 模型调整:输入层维度等于物品总数,隐藏层根据需求设置,输出层和输入层维度一致,损失函数依然用MSE,目标是重构用户的评分向量,补全缺失的评分。

内容的提问来源于stack exchange,提问作者me._

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:20:00