了解神经网络的基本原理,包括输入层、隐含层、输出层、超参数等;掌握神经网络函数语法,使用torch和sklearn实现多层感知机;加载数据集,并对数据集进行分析;划分数据集的规模和方式;训练模

一、实验目的

  1. 了解神经网络的基本原理,包括输入层、隐含层、输出层、超参数等;
  2. 掌握神经网络函数语法,使用torchsklearn实现多层感知机;
  3. 加载数据集,并对数据集进行分析;
  4. 划分数据集的规模和方式;
  5. 训练模型;
  6. 验证模型,计算精确率、召回率和准确率,并绘制混淆矩阵;
  7. 对模型进行评价,说明模型的泛化能力。

二、实验环境

Pycharm

三、实验内容

1、神经网络原理

神经网络是一种机器学习算法,它的核心思想是通过模仿人类大脑的神经元的连接方式,将多个输入数据经过多层处理后得到预测输出结果。

神经网络主要由三层组成,分别是输入层、隐含层和输出层。其中,输入层是神经网络的第一层,用于将数据输入神经网络。隐含层是神经网络的中间层,最终的预测结果是在该层得出的。输出层是神经网络的最后一层,用于输出预测结果。

神经网络的超参数包括学习率、迭代次数、隐藏层节点数量等,这些参数可以影响模型的拟合效果。前向传播和后向传播是神经网络的两个核心过程,前向传播是将输入数据通过神经网络得到输出结果的过程,而后向传播是根据输出结果反向计算参数梯度的过程,用于更新模型参数。

神经网络函数语法

  1. torch实现多层感知机(MLP)

import torch

import torch.nn as nn

import torch.optim as optim

from torchvision import datasets, transforms

from torch.utils.data import DataLoader


# 定义MLP模型

class MLP(nn.Module):

   
def __init__(self, input_size, hidden_size, output_size):
       
super(MLP, self).__init__()

       
self.fc1 = nn.Linear(input_size, hidden_size)

       
self.relu = nn.ReLU()

       
self.fc2 = nn.Linear(hidden_size, output_size)

   
def forward(self, x):
        out =
self.fc1(x)

        out =
self.relu(out)

        out =
self.fc2(out)

       
return out


# 超参数设置

input_size = 784  # MNIST数据集的特征维度为28*28,因此输入大小为784

hidden_size = 500  # 隐藏层大小为500个神经元

output_size = 10  # MNIST数据集有10个类别,因此输出大小为10个类别的索引值之和

learning_rate = 0.01  # 学习率为0.01

num_epochs = 10  # 训练轮数为10

batch_size = 64  # 每批次样本数为64

device = torch.device("cuda" if torch.cuda.is_available() else "cpu"# 如果有GPU可用则使用GPU进行计算,否则使用CPU进行计算

model = MLP(input_size, hidden_size, output_size).to(device)  # 将模型转移到指定设备上进行计算

criterion = nn.CrossEntropyLoss().to(device)  # 将损失函数转移到指定设备上进行计算

optimizer = optim.Adam(model.parameters(), lr=learning_rate)  # 将优化器转移到指定设备上进行计算

第二种实现是基于sklearn的多层感知机,可以使用以下语句创建一个两层的神经网络:

from sklearn.neural_network import MLPClassifier

clf = MLPClassifier(hidden_layer_sizes=(5,),

                    activation='relu', solver='adam',

                    max_iter=500)

3、加载数据集

本次实验使用的是MNIST手写数字数据集,该数据集包含60,000个训练样本和10,000个测试样本。每个样本是一个28x28像素的灰度图像,标签是0~9中的一个数字。

这些数据使用numpy格式存储,并分为训练集和测试集两部分,数据形状为60000x784(训练集)和10000x784(测试集)。

4、划分数据集

为了进行模型训练和验证,我们将训练集划分为80%的训练集和20%的验证集。

5、训练模型

我们使用上述两种方式实现的神经网络模型对MNIST数据集进行训练,采用交叉熵作为损失函数,使用SGD(随机梯度下降)算法进行参数优化。

6、验证模型

我们使用精确率、召回率和准确率等指标来评估模型的表现。其中,精确率定义为TP/(TP+FP),召回率定义为TP/(TP+FN),准确率定义为(TP+TN)/(TP+TN+FP+FN),TP表示真正例,FP表示假正例,TN表示真反例,FN表示假反例。我们同时绘制混淆矩阵,用于直观展示模型的分类表现。

7、模型评价

根据模型在训练集和验证集上的表现,我们可以评估模型的泛化能力。如果出现欠拟合,我们可以考虑增加模型复杂度或者调整模型超参数。如果出现过拟合,我们可以尝试使用正则化方法(如L1、L2正则化)或者采用更多数据进行训练。

五、实验总结

通过本次实验,我们了解了神经网络的基本原理和函数语法,并使用torchsklearn实现了多层感知机。同时,我们还学习了如何加载数据集、划分数据集规模和方式、训练模型以及验证模型。

在实验过程中,我们首先简述了神经网络的原理,包括输入层、隐含层、输出层、超参数等;接着介绍了神经网络函数语法,使用torchsklearn实现了多层感知机;然后加载了MNIST数据集,并对数据进行了分析;接着划分了数据集的规模和方式,并进行了训练;最后对模型进行了验证和评价。

在实验中,我们使用了精确率(precision)、召回率(recall)和准确率(accuracy)三个指标来评估模型的性能,并绘制了混淆矩阵。通过实验结果可以看出,我们的多层感知机模型在训练集上取得了较高的准确率和召回率,但在测试集上表现稍有欠佳,说明模型存在一定的泛化能力不足的问题。

为了提高模型的泛化能力,我们可以考虑增加隐藏层的神经元数量、调整学习率、增加正则化项等方法进行修正。此外,我们还可以尝试使用其他的神经网络结构或深度学习框架来进行改进。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值