动手学深度学习(二)——多层感知机(从零开始)

文章作者:Tyan
博客:noahsnail.com  |  CSDN  |  简书

注:本文为李沐大神的《动手学深度学习》的课程笔记!

# 导入mxnet
import mxnet as mx

# 设置随机种子
mx.random.seed(2)

from mxnet import gluon
from mxnet import ndarray as nd
from mxnet import autograd
from mxnet import image
from utils import load_data_fashion_mnist, accuracy, evaluate_accuracy, SGD

数据获取

# 批数据大小
batch_size = 256

# 获取训练数据和测试数据
train_data, test_data = load_data_fashion_mnist(batch_size)

多层感知机

# 输入数据大小
num_inputs = 28 * 28
# 输出数据大小, 分为10类
num_outputs = 10

# 隐藏单元个数
num_hidden = 256

# 正态分布的标准差
weight_scale = 0.01

# 随机初始化输入层权重
W1 = nd.random_normal(shape=(num_inputs, num_hidden), scale=weight_scale)
b1 = nd.zeros(num_hidden)

# 随机初始化隐藏层权重
W2 = nd.random_normal(shape=(num_hidden, num_outputs), scale=weight_scale)
b2 = nd.zeros(num_outputs)

# 参数数组
params = [W1, b1, W2, b2]

# 需要计算梯度, 添加自动求导
for param in params:
    param.attach_grad()

激活函数

# 激活函数使用ReLU, relu(x)=max(x,0)
def relu(X):
    return nd.maximum(X, 0)

定义模型

def net(X):
    # 输入数据重排
    X = X.reshape((-1, num_inputs))
    # 计算激活值
    h1 = relu(nd.dot(X, W1) + b1)
    # 计算输出
    output = nd.dot(h1, W2) + b2
    return output

Softmax和交叉熵损失函数

# 定义交叉熵损失
softmax_cross_entropy = gluon.loss.SoftmaxCrossEntropyLoss()

训练

# 定义迭代周期
epochs = 5

## 定义学习率
learning_rate = 0.1

# 训练
for epoch in range(epochs):
    # 训练损失
    train_loss = 0.0
    # 训练集准确率
    train_acc = 0.0
    # 迭代训练
    for data, label in train_data:
        # 记录梯度
        with autograd.record():
            # 计算输出
            output = net(data)
            # 计算损失
            loss = softmax_cross_entropy(output, label)
        # 反向传播求梯度
        loss.backward()
        # 梯度下降
        SGD(params, learning_rate/batch_size)
        # 总的训练损失
        train_loss += nd.mean(loss).asscalar()
        # 总的训练准确率
        train_acc += accuracy(output, label)

    # 测试集的准确率
    test_acc = evaluate_accuracy(test_data, net)

    print("Epoch %d. Loss: %f, Train acc %f, Test acc %f" % (
        epoch, train_loss / len(train_data), train_acc / len(train_data), test_acc))
Epoch 0. Loss: 1.042064, Train acc 0.630976, Test acc 0.776142
Epoch 1. Loss: 0.601578, Train acc 0.788862, Test acc 0.815204
Epoch 2. Loss: 0.525148, Train acc 0.816556, Test acc 0.835136
Epoch 3. Loss: 0.486619, Train acc 0.829427, Test acc 0.833033
Epoch 4. Loss: 0.459395, Train acc 0.836104, Test acc 0.835136
动手深度学习感知机从零开始的步骤如下: 1. 导入所需的包或模块,包括torch、numpy和d2lzh_pytorch等。 2. 获取和读取数据,可以使用Fashion-MNIST图像分类数据集作为训练和测试数据集。 3. 初始化模型参数,包括输入层维度、隐藏层维度和输出层维度等。这些参数可以根据具体情况进行设置。 4. 定义激活函数,可以使用ReLU等常见的激活函数。 5. 定义模型结构,包括输入层、隐藏层和输出层等。在每一层之间都可以加上激活函数。 6. 定义损失函数,可以使用交叉熵损失函数等。 7. 训练模型,可以使用梯度下降等优化算法进行模型参数的更新。训练过程中可以设置迭代周期数和习率等超参数。 8. 输出结果,可以使用准确率等指标来评估模型的性能。 9. 使用预测函数进行预测,将输入数据输入模型,得到对应的预测结果。 以上是从零开始实现多层感知机的步骤。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【动手深度学习多层感知机从零开始实现(含源代码)](https://blog.csdn.net/wzk4869/article/details/127984842)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【从零开始深度学习】10.自己动手从零开始实现一个多层感知机](https://blog.csdn.net/qq_42589613/article/details/128187230)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值