当前位置: 首页 > news >正文

【深度学习】基于MXNet的多层感知机的实现

多层感知机

结构组成

大致由三层组成:输入层-隐藏层-输出层,其中隐藏层大于等于一层

其中,隐藏层和输出层都是全连接

隐藏层的层数和神经元个数也是超参数

多层隐藏层,在本质上仍等价于单层神经网络(可从输出方程简单推得),
但是增加网络的深度可以更加有效地提高网络对深层抽象概念的理解,降低训练难度

激活函数

目前Sigmoid函数正在被逐渐淘汰,目前仅在二分类问题上仍有用武之地

目前最主流的激活函数是ReLU函数及其变种,它使模型更加简单高效,没有梯度消失问题,对输入的敏感程度更高,迭代速度更快

具体实现

  • 完整版本
import d2lzh as d2l
from mxnet import nd
from mxnet.gluon import loss as gloss

'''
基础准备工作
'''
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

num_inputs, num_outputs, num_hiddens = 784, 10, 256

W1 = nd.random.normal(scale=0.01, shape=(num_inputs, num_hiddens))      # 形状等于 输入*输出
b1 = nd.zeros(num_hiddens)
W2 = nd.random.normal(scale=0.01, shape=(num_hiddens, num_outputs))      # 形状等于 输入*输出
b2 = nd.zeros(num_outputs)
params = [W1, W2, b1, b2]
for param in params:
    param.attach_grad()     # 统一申请梯度空间
    
# 激活函数
def relu(X):
    return nd.maximum(X, 0)

# 模型
def net(X):
    # 一个图片样本正好转化成1*num_inputs的大小,不是巧合,就是要一次性把整张图片放进网络
    X = X.reshape((-1, num_inputs)) 
    H = relu(nd.dot(X, W1)+b1)      # 隐藏层需要应用激活函数
    return nd.dot(H, W2) + b2       # 输出层不需要用激活函数

# 损失
loss = gloss.SoftmaxCrossEntropyLoss()

'''
开始训练
'''
num_epochs, lr = 20, 0.2
d2l.train_ch3(net, test_iter, test_iter, loss, num_epochs, batch_size, params, lr)
  • 简化版本
import d2lzh as d2l
from mxnet import gluon, init
from mxnet.gluon import loss as gloss, nn

net = nn.Sequential()
# 添加一层256个节点的全连接层,并使用ReLU激活函数
# 再添加一层10个节点的全连接层,不使用激活函数(输出层)
net.add(nn.Dense(256, activation='relu'), 
		nn.Dense(10))
net.initialize(init.Normal(sigma=0.01))

batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

loss = gloss.SoftmaxCrossEntropyLoss()

trainer = gluon.Trainer(net.collect_params(), 'sgd', {"learning_rate": 0.2})
num_epochs = 20
d2l.train_ch3(net, test_iter, test_iter, loss, num_epochs, batch_size, None, None, trainer)

实际上只简化了训练器的构建,由此也可以发现,实现一个网络的训练是一件非常简单的事情,复杂的主要是训练前后的各种处理,训练只是手段,不是目的

注意事项

尝试将隐藏层的数量改成1024,再增加训练次数,此时可以发现,模型对训练集的误差一直在缩小,但是对测试集的误差不降反增,此时发生了过拟合

相关文章:

  • 【深度学习】如何一步步实现SGD随机梯度下降算法
  • 本地DeepSeek模型GGUF文件转换为PyTorch格式
  • ubuntu24 springboot jar设置宕机重启
  • App接入图表:MPAndroidChart,如何创建柱状图、双柱状图以及折线图
  • Python的顺序结构和循环结构
  • 个人博客测试报告
  • 金融小知识:股指期货交割日时间是每月几号?
  • LSTM-SVM故障诊断 | 基于长短期记忆神经网络-支持向量机多特征分类预测/故障诊断Matlab代码实现
  • python学opencv|读取图像(七十五)人脸识别:Fisherfaces算法和LBPH算法
  • SpringBoot 中封装 Cors 自动配置
  • cv2库的使用及图像预处理02
  • 如何快速在项目中集成AI功能:AI信箱工具使用
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_pool_t 类型
  • C++笔记之标准库中用于处理迭代器的`std::advance`和`std::distance`
  • Rust中的collections
  • DeepSeek在学术读写翻译中的独特优势
  • Spring容器扩展点
  • 无线网络数字孪生(Digital Twin for Wireless Networks)
  • Node.js中不支持require和import两种导入模块的混用
  • 进阶——第十六届蓝桥杯嵌入式熟练度练习(eeprom的读写)
  • 国际足联女子世界杯再次扩军,2031年起增至48支球队
  • 中方就乌克兰危机提出新倡议?外交部:中方立场没有变化
  • 国家出口管制工作协调机制办公室部署开展打击战略矿产走私出口专项行动
  • 雇来的“妈妈”:为入狱雇主无偿带娃4年,没做好准备说再见
  • 海关总署统计分析司司长:4月进出口增速较一季度加快4.3个百分点
  • 第一集|《刑警的日子》很生活,《执法者们》有班味