动手深度学习10- pytorch多层感知机从零实现

  • 多层感知机

    • 定义模型的参数
    • 定义激活函数
    • 定义模型
    • 定义损失函数
    • 训练模型
  • 小结

多层感知机

import torch
import numpy as np
import sys
sys.path.append('..')
import d2lzh_pytorch as d2l

我们仍然使用Fashion_MNIST数据集,使用多层感知机对图像进行分类

batch_size = 256
train_iter,test_iter = d2l.get_fahsion_mnist(batch_size)
定义模型的参数

Fashion_MNIST数据集汇总的图形的形状为28x28,类别数为10,本节我们依然使用长度为28x28=784的向量表示一张图像,因此输入个数为784,输出个数为10。设置超参数隐藏单元个数为256。

num_inputs, num_outputs,num_hiddens = 784,10,256
W1 = torch.tensor(np.random.normal(0,0.01,(num_inputs,num_hiddens)),dtype=torch.float32
                 )
b1 = torch.zeros(num_hiddens,dtype=torch.float32)
W2 = torch.tensor(np.random.normal(0,0.01,(num_hiddens,num_outputs)),dtype=torch.float32
                 )
b2 = torch.zeros(num_outputs,dtype=torch.float32)
params = [W1,b1,W2,b2]
for param in params:
    param.requires_grad_(requires_grad=True)
    
定义激活函数

我们使用max函数来实现ReLU,不是直接调用relu函数

def relu(X):
    return torch.max(input=X, other=torch.tensor(0.0))
定义模型

同softmax回归一样,我们通过view函数将每张原始的图像改成长度为num_inputs的向量。然后我们将实现上一节中多层感知机的计算表达式

def net(X):
    X = X.view((-1, num_inputs))
    H = relu(torch.matmul(X, W1) + b1)
    return torch.matmul(H, W2) + b2
定义损失函数
def sgd(params,lr,batch_size):
    for param in params:
#         param.data -=lr* param.grad/batch_size
        param.data-= lr* param.grad   # 计算loss使用的是pytorch的交叉熵
# 这个梯度可以不用除以batch_size,pytorch 在计算loss的时候已经除过一次了,
'''
mxnet中的softmaxCrossEntropyLoss在反向传播的时候相对于延batch维度求和,
而pytorch默认的是求平均,所以用pytorch计算得到的loss也比mxnet小很多
大概得到的mxnet计算得到的1/batch_sie这个量级的,所以反向传播得到的梯度也小得多
为了得到跟原书差不多的效果,应该吧学习率调成batch_size倍,原书的学习率为0.5,
设置是100,
pytorch在计算loss的时候已经除过一次了,这里个的sgd不用除了
'''
loss = torch.nn.CrossEntropyLoss()
训练模型
def evaluate_accuracy(data_iter, net):
    acc_sum, n = 0.0, 0
    for X, y in data_iter:
        acc_sum += (net(X).argmax(dim=1) == y).float().sum().item()
        n += y.shape[0]
    return acc_sum / n
def train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size,
              params=None, lr=None, optimizer=None):
    for epoch in range(num_epochs):
        train_l_sum, train_acc_sum, n = 0.0, 0.0, 0
        for X, y in train_iter:
            y_hat = net(X)
            l = loss(y_hat, y).sum()

            # 梯度清零
            if optimizer is not None:
                optimizer.zero_grad()
            elif params is not None and params[0].grad is not None:
                for param in params:
                    param.grad.data.zero_()

            l.backward()
            if optimizer is None:
                sgd(params, lr, batch_size)
            else:
                optimizer.step()  # “softmax回归的简洁实现”一节将用到

            train_l_sum += l.item()
            train_acc_sum += (y_hat.argmax(dim=1) == y).sum().item()
            n += y.shape[0]
        test_acc = evaluate_accuracy(test_iter, net)
        print('epoch %d, loss %.4f, train acc %.3f, test acc %.3f'
              % (epoch + 1, train_l_sum / n, train_acc_sum / n, test_acc))

num_epochs, lr = 5, 0.5
train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, params, lr)
epoch 1, loss 0.0031, train acc 0.702, test acc 0.775
epoch 2, loss 0.0019, train acc 0.821, test acc 0.807
epoch 3, loss 0.0016, train acc 0.843, test acc 0.831
epoch 4, loss 0.0015, train acc 0.855, test acc 0.818
epoch 5, loss 0.0014, train acc 0.863, test acc 0.816

小结

  • 可以通过手动实现定义模型以及其参数来实现简单的多层感知机
  • 多层感知机的层数较多时,这种代码的实现就会明细的繁琐,尤其是在定义模型参数的时候

原文地址:https://www.cnblogs.com/onemorepoint/p/11811339.html

时间: 2024-10-24 12:13:12

动手深度学习10- pytorch多层感知机从零实现的相关文章

对比学习:《深度学习之Pytorch》《PyTorch深度学习实战》+代码

PyTorch是一个基于Python的深度学习平台,该平台简单易用上手快,从计算机视觉.自然语言处理再到强化学习,PyTorch的功能强大,支持PyTorch的工具包有用于自然语言处理的Allen NLP,用于概率图模型的Pyro,扩展了PyTorch的功能.通过学习<深度学习入门之PyTorch>,可以从机器学习和深度学习的基础理论入手,从零开始学习 PyTorch,了解 PyTorch 基础,以及如何用 PyTorch 框架搭建模型.学到机器学习中的线性回归和 Logistic 回归.深度

深度学习框架pytorch入门与实践(一):torch的基本使用

主要内容: 1.tensor的定义 2.tensor与numpy的相互转换 3.tensor使用cuda加速 4.tensor封装成Variable后的使用 # -*- coding: utf-8 -*- """ Created on Thu Aug 8 16:40:47 2019 pytorch快速入门教程 参考书籍:<深度学习框架pytorch:入门与实践> @author: zhaoqidong """ import torch

一线开发者在Reddit上讨论深度学习框架:PyTorch和TensorFlow到底哪个更好?

本文标签:   机器学习 TensorFlow Google深度学习框架 分布式机器学习 PyTorch   近日,Reddit用户 cjmcmurtrie 发了一个主题为「PyTorch vs. TensorFlow」的讨论帖,想要了解这两大流行的框架之间各自有什么优势. 原帖地址:https://redd.it/5w3q74 帖子一楼写道: 我还没有从 Torch7 迁移到 TensorFlow.我玩过 TensorFlow,但我发现 Torch7 更加直观(也许是我玩得不够?).我也尝试了

分享《深度学习之PyTorch实战计算机视觉》PDF

下载:https://pan.baidu.com/s/1Yhf2Pv0gy63VgiMQTglgXA 更多资料:http://blog.51cto.com/3215120 <深度学习之PyTorch实战计算机视觉>两个版本的高清PDF,287页,带书签目录,文字可以复制. 如图: 原文地址:http://blog.51cto.com/3215120/2316431

分享《深度学习之Pytorch(廖星宇著)》+《PyTorch深度学习实战(侯宜军 著)》+源代码

下载:https://pan.baidu.com/s/1ewm1x3UeMe283PQVbDVIoA 更多资料分享:https://www.cnblogs.com/javapythonstudy/ <深度学习之Pytorch(廖星宇著)>PDF,232页,带书签,文字可以复制粘贴.<PyTorch深度学习实战(侯宜军 著)>PDF,121页,带书签,文字可以复制粘贴.配套源代码. 如图: 原文地址:https://www.cnblogs.com/javapythonstudy/p/

《深度学习与计算机视觉算法原理框架应用》PDF+《深度学习之PyTorch实战计算机视觉》PDF

下载:https://pan.baidu.com/s/12-s95JrHek82tLRk3UQO_w <深度学习与计算机视觉 算法原理.框架应用>PDF,带书签,347页.<大数据架构详解:从数据获取到深度学习>PDF,带书签,373页.配套源代码. 下载:https://pan.baidu.com/s/1P0-o29x0ZrXp8WotN7GzcA<深度学习之PyTorch实战计算机视觉> 更多分享:https://pan.baidu.com/s/1g4hv05UZ_

参考《深度学习之PyTorch实战计算机视觉》PDF

计算机视觉.自然语言处理和语音识别是目前深度学习领域很热门的三大应用方向. 计算机视觉学习,推荐阅读<深度学习之PyTorch实战计算机视觉>.学到人工智能的基础概念及Python 编程技能,掌握PyTorch 的使用方法,学到深度学习相关的理论知识,比如卷积神经网络.循环神经网络.自动编码器,等等.在掌握深度学习理论和编程技能之后,还会学到如何基于PyTorch 深度学习框架实战计算机视觉.<深度学习之PyTorch实战计算机视觉>中的大量实例在循序渐进地学习的同时,不断地获得成

学习笔记TF026:多层感知机

隐含层,指除输入.输出层外,的中间层.输入.输出层对外可见.隐含层对外不可见.理论上,只要隐含层节点足够多,只有一个隐含层,神经网络可以拟合任意函数.隐含层越多,越容易拟合复杂函数.拟合复杂函数,所需隐含节点数,随隐含层数量增多指数下降. 过拟合,模型预测准确率在训练集上升,在测试集下降.泛化性不好,模型记忆当前数据特征,不具备推广能力.参数太多.Hinton教授团队,Dropout.随便丢弃部分输出数据节点.创造新随机样本,增大样本量,减少特征数量,防止过拟合.bagging方法,对特征新种采

萌新深度学习与Pytorch入门记录(一):Win10下环境安装

深度学习从入门到入土,安装软件及配置环境踩了不少坑,过程中参考了多处博主给的解决方法,遂整合一下自己的采坑记录. (若遇到不一样的错误,请参考其他博主答案解决) 笔者电脑系统为win10系统,在此环境下安装 Pycharm 5.0.3 Anaconda  3 Python 3.6.9 cuda 10.1 Pytorch 1.3.1 1.安装Pycharm 5.0.3,顺带下载地址: PyCharm5.0(32/64)位下载地址: 链接:https://pan.baidu.com/s/1eTYTy