深度学习实战模拟——softmax回归(图像识别并分类)

news2024/11/15 6:41:04

目录

1、数据集:

2、完整代码


1、数据集:

1.1 Fashion-MNIST是一个服装分类数据集,由10个类别的图像组成,分别为t-shirt(T恤)、trouser(裤子)、pullover(套衫)、dress(连衣裙)、coat(外套)、sandal(凉鞋)、shirt(衬衫)、sneaker(运动鞋)、bag(包)和ankle boot(短靴)。

1.2 Fashion‐MNIST由10个类别的图像组成,每个类别由训练数据集(train dataset)中的6000张图像和测试数据 集(test dataset)中的1000张图像组成。因此,训练集和测试集分别包含60000和10000张图像。测试数据集 不会用于训练,只用于评估模型性能。

以下函数用于在数字标签索引及其文本名称之间进行转换。

# 通过ToTensor实例将图像数据从PIL类型变换成32位浮点数格式,
# 并除以255使得所有像素的数值均在0~1之间
trans = transforms.ToTensor()
mnist_train = torchvision.datasets.FashionMNIST(
    root="../data", train=True, transform=trans, download=True)
mnist_test = torchvision.datasets.FashionMNIST(
    root="../data", train=False, transform=trans, download=True)

以下函数用于在数字标签索引及其文本名称之间进行转换。

def get_fashion_mnist_labels(labels):  #@save
    """返回Fashion-MNIST数据集的文本标签"""
    text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat',
                   'sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']
    return [text_labels[int(i)] for i in labels]

2、完整代码

import torch
import torchvision
import pylab
from torch.utils import data
from torchvision import transforms
import matplotlib.pyplot as plt
from d2l import torch as d2l
import time

batch_size = 256
num_inputs = 784
num_outputs = 10
W = torch.normal(0, 0.01, size=(num_inputs, num_outputs), requires_grad=True)
b = torch.zeros(num_outputs, requires_grad=True)
num_epochs = 5


class Accumulator:
    """在n个变量上累加"""
    def __init__(self, n):
        self.data = [0.0] * n

    def add(self, *args):
        self.data = [a + float(b) for a, b in zip(self.data, args)]

    def reset(self):
        self.data = [0.0] * len(self.data)

    def __getitem__(self, idx):
        return self.data[idx]


def accuracy(y_hat, y):  #@save
    """计算预测正确的数量"""
    if len(y_hat.shape) > 1 and y_hat.shape[1] > 1:
        y_hat = y_hat.argmax(axis=1)
    cmp = y_hat.type(y.dtype) == y
    return float(cmp.type(y.dtype).sum())


def cross_entropy(y_hat, y):
    return -torch.log(y_hat[range(len(y_hat)), y])


def softmax(X):
    X_exp = torch.exp(X)
    partition = X_exp.sum(1, keepdim=True)
    return X_exp/partition


def net(X):
    return softmax(torch.matmul(X.reshape((-1, W.shape[0])), W) + b)


def get_dataloader_workers():
    """使用一个进程来读取的数据"""
    return 1


def get_fashion_mnist_labels(labels):
    """返回Fashion-MNIST数据集的文本标签"""
    #共10个类别
    text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat', 'sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']
    return [text_labels[int(i)] for i in labels]


def show_images(imgs, num_rows, num_cols, titles=None, scale=1.5):
    """画一系列图片"""
    figsize = (num_cols * scale, num_rows * scale)
    _, axes = plt.subplots(num_rows, num_cols, figsize=figsize)
    for i, (img, label) in enumerate(zip(imgs, titles)):
        xloc, yloc = i//num_cols, i % num_cols
        if torch.is_tensor(img):
            # 图片张量
            axes[xloc, yloc].imshow(img.reshape((28, 28)).numpy())
        else:
            # PIL图片
            axes[xloc, yloc].imshow(img)
        # 设置标题并取消横纵坐标上的刻度
        axes[xloc, yloc].set_title(label)
        plt.xticks([], ())
        axes[xloc, yloc].set_axis_off()
    pylab.show()


def load_data_fashion_mnist(batch_size, resize=None):
    """下载Fashion-MNIST数据集,然后将其加载到内存中"""
    trans = transforms.ToTensor()
    if resize:
        trans.insert(0, transforms.Resize(resize))
    mnist_train = torchvision.datasets.FashionMNIST(root='../data', train=True, transform=trans, download=True)
    mnist_test = torchvision.datasets.FashionMNIST(root='../data', train=False, transform=trans, download=True)
    return (data.DataLoader(mnist_train, batch_size, shuffle=True, num_workers=get_dataloader_workers()),
            data.DataLoader(mnist_test, batch_size, shuffle=False, num_workers=get_dataloader_workers()))


def evaluate_accuracy(net, data_iter):
    """计算在指定数据集上模型的精度"""
    if isinstance(net, torch.nn.Module):
        net.eval()  # 将模型设置为评估模式
    metric = Accumulator(2)  # 正确预测数、预测总数
    with torch.no_grad():
        for X, y in data_iter:
            metric.add(accuracy(net(X), y), y.numel())
    return metric[0] / metric[1]


def updater(batch_size):
    lr = 0.1
    return d2l.sgd([W, b], lr, batch_size)


def train_epoch_ch3(net, train_iter, loss, updater):
    if isinstance(net, torch.nn.Module):
        net.train()
    metric = Accumulator(3)
    for X, y in train_iter:
        y_hat = net(X)
        lo = loss(y_hat, y)
        if isinstance(updater, torch.optim.Optimizer):
            updater.zero_grad()
            lo.backward()
            updater.step()
            metric.add(float(lo)*len(y), accuracy(y_hat, y), y.size().numel())
        else:
            lo.sum().backward()
            updater(X.shape[0])
        metric.add(float(lo.sum()), accuracy(y_hat, y), y.numel())
    return metric[0] / metric[2], metric[1] / metric[2]


class Animator:  #@save
    """绘制数据"""
    def __init__(self, legend=None):
        self.legend = legend
        self.X = [[], [], []]
        self.Y = [[], [], []]

    def add(self, x, y):
        # 向图表中添加多个数据点
        if not hasattr(y, "__len__"):
            y = [y]
        n = len(y)
        if not hasattr(x, "__len__"):
            x = [x] * n
        for i, (a, b) in enumerate(zip(x, y)):
            if a is not None and b is not None:
                self.X[i].append(a)
                self.Y[i].append(b)

    def show(self):
        plt.plot(self.X[0], self.Y[0], 'r--')
        plt.plot(self.X[1], self.Y[1], 'g--')
        plt.plot(self.X[2], self.Y[2], 'b--')
        plt.legend(self.legend)
        plt.xlabel('epoch')
        plt.ylabel('value')
        plt.title('Visual')
        plt.show()


def train_ch3(net, train_iter, test_iter, loss, num_epochs, updater):  #@save
    """训练模型"""
    animator = Animator(legend=['train loss', 'train acc', 'test acc'])
    for epoch in range(num_epochs):
        train_metrics = train_epoch_ch3(net, train_iter, loss, updater)
        train_loss, train_acc = train_metrics
        test_acc = evaluate_accuracy(net, test_iter)
        animator.add(epoch + 1, train_metrics + (test_acc,))
        print(f'epoch: {epoch+1},train_loss:{train_loss:.4f}, train_acc:{train_acc:.4f}, test_acc:{test_acc:.4f}')
    animator.show()


def predict_ch3(net, test_iter, n=12):
    """预测标签"""
    for X, y in test_iter:
        break
    trues = d2l.get_fashion_mnist_labels(y)
    preds = d2l.get_fashion_mnist_labels(net(X).argmax(axis=1))
    titles = [true +'\n' + pred for true, pred in zip(trues, preds)]
    show_images(
        X[0:n].reshape((n, 28, 28)), 2, int(n/2), titles=titles[0:n])


if __name__ == '__main__':
    train_iter, test_iter = load_data_fashion_mnist(batch_size)
    train_ch3(net, train_iter, test_iter, cross_entropy, num_epochs, updater)
    predict_ch3(net, test_iter)

分类效果:

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

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

相关文章

苹果计划与谷歌合作使用Gemini AI技术,提升iPhone功能,同时探索与OpenAI合作可能性

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

鸿蒙Harmony应用开发—ArkTS声明式开发(绘制组件:Shape)

绘制组件的父组件,父组件中会描述所有绘制组件均支持的通用属性。 1、绘制组件使用Shape作为父组件,实现类似SVG的效果。 2、绘制组件单独使用,用于在页面上绘制指定的图形。 说明: 该组件从API Version 7开始支持。后续版本如有…

录视频的软件推荐,助力视频内容创作

随着网络技术的发展和在线教育的兴起,录制视频教程的需求日益增加。无论是制作教学课程、分享办公技巧,还是录制游戏过程,一款好用的录屏软件都至关重要。本文将深入介绍三款录视频的软件,帮助读者了解它们的特点和操作步骤&#…

【测试开发学习历程】MySQL条件查询与通配符 + MySQL函数运算(上)

前言: 18日08:56,总要先写完明天的博客,才能安心准备今天或者明天的学习。 半夜爬起来写博客真的好辛苦!!!!!!!!! 回归…

超越标签的探索:K-means与DBSCAN在数据分析中的新视角

最近在苦恼为我的数据决定分组问题,在查找资料时,恰好看到机器学习中的无监督学习的聚类分析,正好适用于我的问题,但是我之前学机器学习时。正好没有学习无监督部分,因为我认为绝大多数问题都是有标签的监督学习&#…

robots协议详解:爬虫也要有边界感

随着互联网的迅猛发展,信息的获取变得越来越便捷,而网络爬虫(Spider)技术就是其中之一。网络爬虫是一种自动化程序,它能够遍历互联网上的网页,提取信息,用于各种用途,例如搜索引擎索引、数据挖掘、价格比较等。但是,爬虫技术虽然强大,但是也是一把双刃剑,在正当使用…

ChatGPT是什么,怎么使用,需要注意些什么?

一、ChatGPT 是什么? ChatGPT,全称聊天生成预训练转换器(Chat Generative Pre-trained Transformer),是 OpenAI 开发的人工智能(AI)聊天机器人程序,于2022年11月推出。该程序使用基于GPT-3.5、GPT-4架构的…

使用uniapp,uni-data-select组件时,内容长度没超过容器宽度时候虽然能显示全内容但是数据后边会出现三个点,逼死强迫症

项目场景: 微信小程序开发,使用uniapp,uni-data-select组件时,内容长度没超过容器宽度时候虽然能显示全内容但是数据后边会出现三个点,逼死强迫症 解决方案: 找到组件的源代码,然后删除那三个…

MeterSphere和Jmeter使用总结

一、MeterSphere 介绍 MeterSphere 是⼀站式开源持续测试平台,涵盖测试跟踪、接⼝测试、UI 测试和性能测试等,全 ⾯兼容 JMeter、Selenium 等主流开源标准,能够有效助⼒开发和测试团队在线共享协作,实现端到 端的测试管理跟踪…

日志 | 日志级别 | c/c++ | 终端显示不同的颜色

日志想必都知道 优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL日志参考1 #define RED "\x1B[31m" #define GRN "\x1B[32m" #define YEL "\x1B[33m" #define BLU "\x1B[34m" #define MAG "…

绝地求生:受到封禁三天的玩家,静待解封即可!官方暂未发布系误封公告

首先,评论区所说的误封解除公告为假! 3.17晚上无聊刷到黑盒里有几个人一直在发一张截图,说是官方发布了公告 “表示三天的封禁系误封,已在逐步解封。” 但是在细看这个图片的时候,会发现很大一部分人都是用的一张图片…

HTML5球体下落粒子爆炸特效

HTML5球体下落粒子爆炸特效,源码由HTMLCSSJS组成,双击html文件可以本地运行效果,也可以上传到服务器里面 下载地址 HTML5球体下落粒子爆炸特效

【Flink】Flink 中的时间和窗口之窗口API使用

1. 窗口的API概念 窗口的API使用分为按键分区和非按键分区,在定义窗口操作之前,首先就要确定好是基于按键分区Keyed的数据流KeyedStream来开窗还是基于没有按键分区的DataStream上开窗。 1.1 按键分区窗口(Keyed Windows) 按键…

二蛋赠书十八期:《一本书讲透Elasticsearch:原理、进阶与工程实践》

Elasticsearch 是一种强大的搜索和分析引擎,被广泛用于各种应用中,以其强大的全文搜索能力而著称。 不过,在日常管理 Elasticsearch 时,我们经常需要对索引进行保护,以防止数据被意外修改或删除,特别是在进…

20240318uniapp怎么引用组件

在script中增加 import index from "/pages/index/index.vue" 把index直接整个作为一个组件引入 然后注册组件 在export default中增加 components: {index:index }, 注册了index组件&#xff0c;内容为import的index 然后就可以在template里使用 <index&…

03|提示工程(下):用思维链和思维树提升模型思考质量

什么是 Chain of Thought CoT这个概念来源于学术界&#xff0c;是谷歌大脑的Jason Wei等人于2022年在论文《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models&#xff08;自我一致性提升了语言模型中的思维链推理能力&#xff09;》中提出来的概念。它…

双向队列广搜

适用情况 适用的情况&#xff1a;解决最短路径问题 当我们已起始点和终点时&#xff0c;我们可以采用双向队列广搜去解决问题。所谓的双向队列广搜&#xff0c;就是让起点向终点搜索&#xff0c;终点向起点搜索&#xff0c;二者同时开始&#xff0c;那么当它们第一次1相遇时&am…

RocketMQ - 一条消息写入CommitLog文件之后,如何实时更新索引文件?

Broker收到一条消息之后,其实就会直接把消息写入到CommitLog里去,但是它写入刚开始仅仅是写入到MappedFile映射的一块内存里去,后续是根据刷盘策略去决定是否立即把数据从内存刷入磁盘的。 实际上,Broker启动的时候会开启一个线程,ReputMessageService,他会把CommitLog更…

FreeRTOS教程7 事件组

目录 1、准备材料 2、学习目标 3、前提知识 3.1、什么是事件组&#xff1f; 3.1、事件组特征 3.1.1、事件组、事件标志和事件位 3.1.2、EventBits_t 数据类型 3.1.3、多个任务访问 3.2、创建事件组 3.3、操作事件组 3.4、xEventGroupWaitBits() API 函数 3.4.1、ux…

主机与windows虚拟机远程桌面实现方法

目录 一、虚拟机相关配置1. 配置虚拟机网络2. 打开虚拟机远程桌面功能3. 配置虚拟机用户与分组 二、主机相关配置 当无法通过共享文件夹实现主机与windows虚拟机文件共享时&#xff0c;可以通过主机与虚拟机远程桌面的方法实现文件的共享传输。本文主要介绍主机与虚拟机远程桌面…