构建深度学习模型:LSTM序列分类与MNIST异常检测
立即解锁
发布时间: 2025-08-18 02:29:44 订阅数: 2 

### 构建深度学习模型:LSTM序列分类与MNIST异常检测
#### 1. 构建LSTM神经网络进行序列分类
##### 1.1 训练数据归一化
数据转换可能不足以提高神经网络的效率,同一数据集中存在大小不同的值范围可能导致过拟合。为避免这种情况,我们对数据集进行归一化,DL4J有多种实现方式。归一化过程将原始时间序列数据转换并拟合到一个确定的值范围,如(0, 1),这有助于神经网络以更少的计算量处理数据,同时减少训练时对特定标签的偏好。
- **操作步骤**:
1. 创建标准归一化器并拟合数据:
```java
DataNormalization normalization = new NormalizerStandardize();
normalization.fit(trainIterator);
```
2. 调用`setPreprocessor()`方法实时归一化数据:
```java
trainIterator.setPreProcessor(normalization);
testIterator.setPreProcessor(normalization);
```
- **工作原理**:使用`NormalizerStandardize`将数据集归一化,使数据的均值为0,标准差为1,即所有值都在(0, 1)范围内。注意,不需要对测试数据调用`fit()`,因为使用训练时学习的缩放参数来缩放测试数据。
##### 1.2 构建网络输入层
层配置是神经网络配置的重要步骤,我们需要创建输入层来接收从磁盘加载的单变量时间序列数据,并添加LSTM层作为隐藏层。可以使用计算图或常规多层网络来构建网络配置,这里使用计算图。
- **操作步骤**:
1. 使用默认配置配置神经网络:
```java
NeuralNetConfiguration.Builder neuralNetConfigBuilder = new NeuralNetConfiguration.Builder();
neuralNetConfigBuilder.seed(123);
neuralNetConfigBuilder.weightInit(WeightInit.XAVIER);
neuralNetConfigBuilder.updater(new Nadam());
neuralNetConfigBuilder.gradientNormalization(GradientNormalization.ClipElementWiseAbsoluteValue);
neuralNetConfigBuilder.gradientNormalizationThreshold(0.5);
```
2. 通过调用`addInputs()`指定输入层标签:
```java
ComputationGraphConfiguration.GraphBuilder compGraphBuilder = neuralNetConfigBuilder.graphBuilder();
compGraphBuilder.addInputs("trainFeatures");
```
3. 使用`addLayer()`方法添加LSTM层:
```java
compGraphBuilder.addLayer("L1", new LSTM.Builder().activation(Activation.TANH).nIn(1).nOut(10).build(), "trainFeatures");
```
- **工作原理**:在步骤1中,指定默认种子值、初始权重、权重更新器等,并设置梯度归一化策略为`ClipElementWiseAbsoluteValue`,梯度阈值为0.5。在步骤3中,`trainFeatures`是输入层标签,LSTM层名称(如`L1`)将在配置输出层时使用,确保层之间连接正确。
##### 1.3 构建网络输出层
输入/隐藏层设计完成后,接下来是输出层设计。输出层应反映神经网络的期望输出,根据用例可能需要分类器或回归模型,因此需要合理配置激活函数和误差函数。
- **操作步骤**:
1. 使用`setOutputs()`设置输出标签:
```java
compGraphBuilder.setOutputs("predictSequence");
```
2. 使用`addLayer()`方法和`RnnOutputLayer`构建输出层:
```java
compGraphBuilder.addLayer("predictSequence", new RnnOutputLayer.Builder(LossFunctions.LossFunction.MCXENT).activation(Activation.SOFTMAX).nIn(10).nOut(numOfClasses).build(), "L1");
```
- **工作原理**:在步骤1中添加`predictSequence`作为输出层标签,在步骤2中指定输入层引用为`L1`,避免LSTM层和输出层断开连接。使用`RnnOutputLayer`构建输出层,适用于涉及循环神经网络的用例,功能上与多层感知机中的`OutputLayer`相同,但会自动处理输出和标签的重塑。
##### 1.4 评估LSTM网络分类输出
配置好神经网络后,接下来是启动训练实例并进行评估。评估阶段对训练实例非常重要,神经网络会尝试优化梯度以获得最佳结果,一个优化的神经网络应具有良好且稳定的评估指标。
- **操作步骤**:
1. 使用`init()`方法初始化计算图模型配置:
```java
ComputationGraphConfiguration configuration = compGraphBuilder.build();
ComputationGraph model = new ComputationGraph(configuration);
model.init();
```
2. 设置得分监听器以监控训练过程:
```java
model.setListeners(new ScoreIterationListener(20), new EvaluativeListener(testIterator, 1, InvocationType.EPOCH_END));
```
3. 调用`fit()`方法启动训练实例:
```java
model.fit(trainIterator,numOfEpochs);
```
4. 调用`evaluate()`计算评估指标:
```java
Evaluation evaluation = model.evaluate(testIterator);
System.out.println(evaluation.stats());
```
- **工作原理**:使用计算图配置神经网络结构,计算图是循环神经网络的最佳选择,相比常规多层感知机,能获得更好的结果。在步骤2中设置监听器,在每个测试迭代结束时调用得分迭代器。在步骤4中,将测试数据集以迭代器的形式传递给`evaluate()`方法,并使用`stats()`方法显示结果。
#### 2. 对无监督数据进行异常检测
##### 2.1 技术要求
代码可在[此处](https://github.com/PacktPublishing/Java-Deep-Learning-Cookbook/blob/master/08_Performing_Anomaly_detection_on_unsupervised%20data/sourceCode/cookbook-app/src/main/java/MnistAnomalyDetectionExample.java)找到,JFrame特定实现可在[此处](https://github.com/PacktPublishing/Java-Deep-Learning-Cookbook/blob/master/08_Performing_Anomaly_detection_on_unsupervised%20data/sourceCode/cookbook-app/src/main/java/MnistAnomalyDetectionExample.java#L134)找到。克隆GitHub仓库后,
0
0
复制全文
相关推荐









