004_动手实现MLP(pytorch)

news2024/11/14 22:04:14
import torch
from torch import nn
from torch.nn import init
import numpy as np
import sys
import d2lzh_pytorch as d2l
# 1.数据预处理
mnist_train = torchvision.datasets.FashionMNIST(
    root='/Users/w/PycharmProjects/DeepLearning_with_LiMu/datasets/FashionMnist', train=True, download=True,
    transform=transforms.ToTensor())
mnist_test = torchvision.datasets.FashionMNIST(
    root='/Users/w/PycharmProjects/DeepLearning_with_LiMu/datasets/FashionMnist', train=False, download=True,
    transform=transforms.ToTensor())
# 1.2 数据集的预处理
batch_size = 256
if sys.platform.startswith('win'):
    num_worker = 0
else:
    num_worker = 4
train_iter = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True, num_workers=num_worker)
test_iter  = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=False, num_workers=num_worker)

# 封装自定义的结构转换函数
class FlattenLayer(nn.Module):
    def __init__(self):
        super(FlattenLayer, self).__init__()
    def forward(self, x): # x shape: (batch, *, *, ...)
        return x.view(x.shape[0], -1)
#定义网络结构
num_inputs, num_outputs, num_hiddens = 784, 10, 256
net = nn.Sequential(
    FlattenLayer(),
    nn.Linear(num_inputs,num_hiddens),
    nn.ReLU(),
    nn.Linear(num_hiddens,num_outputs)
)
for param in net.parameters():
    print(param.shape)
# 在 PyTorch 中,init.normal_ 是一个初始化方法,用于直接将张量中的元素初始化为来自正态分布(高斯分布)随机生成的值。它属于 torch.nn.init 模块,通常在神经网络的权重初始化中使用。
for params in net.parameters():
    init.normal_(params, mean=0, std=0.01)
# print 结果 torch.Size([256, 784])
#torch.Size([256])
#torch.Size([10, 256])
#torch.Size([10])

batch_size = 256
loss = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(net.parameters(), lr=0.5)
num_epochs = 5

def train(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))




train(net, train_iter, test_iter, loss, num_epochs, batch_size, None, None, optimizer)






在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2160495.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

水印与标志检测系统源码分享

水印与标志检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

深度解读数字化转型实施中的常见挑战与解决方案

为何深入理解数字化转型中的挑战至关重要? 数字化转型不仅仅是技术升级的过程,更是企业在面对市场变化、客户需求以及内部效率提升等多方面压力时,进行的系统性变革。然而,数字化转型并非一蹴而就,且在实际实施过程中…

app store预览和截屏最新要求6.9寸截屏,没真机的解决方案

IOS又升级了,最新的iphone 16,新出的iphone 16 pro max是6.9英寸的。 而app store的上架流程也随机更新了,不再需要之前的5.5寸屏截图,改为需要6.9寸屏的截图了 5.5寸那些老古董终于退出历史舞台 但是问题来了,现在…

电源设计的艺术:从底层逻辑到工程实践

在电子工程的世界里,电源设计是核心中的核心。它不仅是电子设备的能量源泉,更是整个系统稳定运行的基石。随着科技的不断进步,电源设计的要求也越来越高,从效率、稳定性到体积、成本,每一个维度都是工程师们不断追求的…

Linux相关概念和重要知识点(7)(git、冯诺依曼体系结构)

1.git (1)版本控制和版本控制器 当我们修改一个项目的时候,一般都会先留下一个备份再修改,并将修改的文件命名为第一次修改、第二次修改......当需要途中的任何版本,或是需要回退到之前的版本时,都能够找…

远程连接服务器时出现“这可能是由于CredSSP加密数据库修正”的错误提示的解决办法

现象: 当远程连接服务器时,有时候会出现以下提示,从而导致无法成功连接服务,如下所述: 原因: 远程桌面使用的是“凭据安全支持提供程序协议 (CredSSP) ”,这个协议在未修补的版本中是存在漏…

焊接缺陷检测系统源码分享

焊接缺陷检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

实现高效物联网通信:MQTT协议深入解析

MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,最初由IBM于1999年开发,目的是为了监控远程设备的传感器和嵌入式系统之间的通信。它的目标是提供一种简单、高效、可靠的消息传递机制,以满足低…

1.5 计算机网络的性能指标

参考:📕深入浅出计算机网络 目录 速率 带宽 吞吐量 时延 时延带宽积 往返时间 利用率 丢包率 速率 速率是指数据的传送速率(即每秒传送多少个比特),也称为数据率(Data Rate)或比特率&am…

【React与Vue】如何在页签中监听 LocalStorage 变化?这些方法你都试过吗?

在开发中,你是否会碰到过这样的需求:需要监听 LocalStorage 的变化。这在不同浏览器页签间是相对简单的,因为浏览器提供了内置的 storage 事件。但在同一个浏览器页签下,却没有直接的方式实现。今天,我们探讨下有几种高…

中电金信多模态鉴伪技术抵御AI造假威胁

AI换脸技术,属于深度伪造最常见方式之一,是一种利用人工智能生成逼真的虚假人脸图片或视频的技术。基于深度学习算法,可以将一个人的面部特征映射到另一个人的面部,创造出看似真实的伪造内容。近年来,以AI换脸为代表的…

关于Cursor使用的小白第一视角

最近看破局感觉洋哥总是提到cursor,感觉好火,所以打算学习一下怎么用Cursor,如果可以希望能做一个我自己的网站。 之前从来没用过Cursor。所以,这是一篇小白视角的Cursor使用教程。 如果你也是一个小白,并且对Cursor…

【Python】Spyder:科学 Python 开发环境

在数据科学和科学计算领域,Python 已经成为了一个不可或缺的工具。为了提高开发效率和改善编程体验,一个功能强大且用户友好的开发环境是必需的。Spyder(Scientific Python Development Environment)正是这样一个为科学计算和数据…

Redhat 7,8,9系(复刻系列) 一键部署Oracle19c rpm

Oracle19c前言 Oracle 19c 是甲骨文公司推出的一款企业级关系数据库管理系统,它带来了许多新的功能和改进,使得数据库管理更加高效、安全和可靠。以下是关于 Oracle 19c 的详细介绍: 主要新特性 多租户架构:支持多租户架构,允许多个独立的数据库实例在同一个物理服务器上…

网络PPP协议802.11协议以太网协议IPV4协议在思科模拟器的实现

1)PPP协议 1. 选择2620系列交换机,添加WIC-2t模块,具有两个serial串行接口; 2.Router>enable:进入特权模式 Router#configure terminal:全局配置模式 Enter configuration commands, one per line. End with CNTL…

配置win10开电脑时显示可登录账号策略

有1台公用的windows10电脑,电脑上有N多用户,使用人员登录时选择相应的账号登录即可。但在某次使用脚本加固后,发现之前显示的用户都不能显示了。检查加固脚本,是脚本启用了“交互式登录:不显示上次登录”策略。因此&am…

基于SpringBoot+Vue的垃圾分类回收管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…

RHCSA认证-Linux(RHel9)-Linux入门

文章目录 概要一、创建、查看和编辑⽂本1.1 输出重定向1.2 vim编辑器1.3 shell 变量1.5 获取帮助 二、管理本地用户和组2.1 描述用户2.2 切换用户和赋权2.3 用户管理2.4 用户组管理2.5 密码策略 三、控制文件访问3.1 列出文件和文件权限3.2 更改文件权限和拥有者3.3 控制默认权…

【中级通信工程师】终端与业务(二):终端产品

【零基础3天通关中级通信工程师】 终端与业务(二):终端产品 本文是中级通信工程师考试《终端与业务》科目第二章《终端产品》的复习资料和真题汇总。终端与业务是通信考试里最简单的科目,有效复习通过率可达90%以上,本文结合了高频考点和近几…

JUC并发编程_阻塞队列 BlockingQueue

JUC并发编程_阻塞队列 BlockingQueue 一、基本概念二、主要特性三、常用方法四、实现类ArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueueSynchronousQueue 五、使用场景六、注意事项 一、基本概念 阻塞队列是一种特殊的队列,它除了支持普通队列的插入&…