Mnist分类与气温预测任务

目录

  • 传统机器学习与深度学习的特征工程
  • 特征向量
  • pytorch实现minist代码解析
  • 归一化
  • 损失函数
  • 计算图
  • Mnist分类
    • 获取Mnist数据集,预处理,输出一张图像
    • 面向工具包编程
    • 使用TensorDataset和DataLoader来简化数据预处理
    • 计算验证集准确率
  • 气温预测
    • 回归
    • 构建神经网络
    • 调包
    • 预测训练结果
    • 画图对比

传统机器学习与深度学习的特征工程

在这里插入图片描述
在这里插入图片描述
卷积层:原始输入中间提取有用的一个局部特征
激活函数:用于增加模型的一些非线性,可以让模型学习更加复杂模式
池化层:用于减少数据的维度

特征向量

在这里插入图片描述

pytorch实现minist代码解析

在这里插入图片描述

首先继承nn.Module类的一个子类ConvNetsuper方法就是在调用nn.Module的一个__init__方法,确保__init__方法中定义的属性和方法都可以在ConvNet中使用

归一化

在这里插入图片描述
在这里插入图片描述

损失函数

在这里插入图片描述

计算图

在这里插入图片描述

Mnist分类

获取Mnist数据集,预处理,输出一张图像

import torch
print(torch.__version__)
#win用户
DEVICE=torch.device('cuda' if torch.cuda.is_available() else 'cpu')
#mac用户
DEVICE=torch.device('mps' if torch.backends.mps.is_available() else 'cpu')
print('当前设备',DEVICE)

在这里插入图片描述

#将图像嵌入输出的单元格
%matplotlib inline
from pathlib import Path # 处理文件路径
import requestsDATA_PATH = Path("data") 
PATH = DATA_PATH / "mnist"
PATH.mkdir(parents=True, exist_ok=True)URL = "http://deeplearning.net/data/mnist/"
FILENAME = "mnist.pkl.gz"if not (PATH / FILENAME).exists():content = requests.get(URL + FILENAME).content(PATH / FILENAME).open("wb").write(content)
import pickle
import gzipwith gzip.open((PATH / FILENAME).as_posix(), "rb") as f:((x_train, y_train), (x_valid, y_valid), (x_test, y_test)) = pickle.load(f, encoding="latin-1")
print("x_train: ", type(x_train), x_train.dtype, x_train.size, x_train.shape, "; y_train: ", y_train.shape)

在这里插入图片描述

print("x_valid: ", type(x_valid), x_valid.dtype, x_valid.size, x_valid.shape, "; y_valid: ", y_valid.shape)

在这里插入图片描述

from matplotlib import pyplotpyplot.imshow(x_train[2].reshape((28, 28)), cmap="gray")

在这里插入图片描述

y_train[:10]

在这里插入图片描述

x_train, y_train, x_valid, y_valid = map(lambda x: torch.tensor(x, device=DEVICE),(x_train, y_train, x_valid, y_valid)
)
print("x_train: ", x_train, "; y_train: ", y_train)
x_train[0]
import torch.nn.functional as Floss_func = F.cross_entropy # 损失函数,传入预测、真实值的标签def model(xb):xb = xb.to(DEVICE)return xb.mm(weights) + bias  # x*w+b
bs = 64xb = x_train[0:bs] # 64, 784yb = y_train[0:bs] # 真实标签weights = torch.randn([784, 10], dtype = torch.float, requires_grad = True)bias = torch.zeros(10, requires_grad = True)weights = weights.to(DEVICE)
bias = bias.to(DEVICE)print(loss_func(model(xb), yb))

在这里插入图片描述

补充:关于map函数的例子

def square(x):return x**2
numbers=[1,2,3,4,5]
squares=map(square,numbers)
print(list(squares))

在这里插入图片描述
也就是map函数第一个参数是函数,第二个参数是数值,将函数作用于数值

面向工具包编程

from torch import nn # 提供神经网网络的类和函数 ,nn.Moduleclass Mnist_NN(nn.Module):def __init__(self): # 设计房屋图纸super(Mnist_NN, self).__init__()self.hidden1 = nn.Linear(784, 256) # 784-输入层,256-隐藏层1self.hidden2 = nn.Linear(256, 128)self.out = nn.Linear(128, 10)def forward(self, x): # 实际造房子x2 = F.relu(self.hidden1(x)) # x: [bs, 784], w1: [784, 256], b1: [256] -> x2:[bs,256]x3 = F.relu(self.hidden2(x2)) # x2: [bs, 256], w2:[256, 128], b2[128] -> x3[bs, 128]x_out = self.out(x3) # x3: [bs, 128], w3: [128, 10], b3[10] -> x_out: [bs, 10]return x_out
net = Mnist_NN().to(DEVICE)
print(net)

在这里插入图片描述

print(net.hidden1.weight)

在这里插入图片描述

for name, parameter in net.named_parameters():print(name, parameter)

使用TensorDataset和DataLoader来简化数据预处理

from torch.utils.data import TensorDatasetfrom torch.utils.data import DataLoadertrain_ds = TensorDataset(x_train, y_train) #torch.utils.data.Dataset
train_dl = DataLoader(train_ds, batch_size=64, shuffle=True)valid_ds = TensorDataset(x_valid, y_valid)
valid_dl = DataLoader(valid_ds, batch_size=bs)
data_iter = iter(train_dl)batch_x, batch_y = next(data_iter)
print(batch_x.shape, batch_y.shape)
print(batch_y)

在这里插入图片描述

batch_x, batch_y = next(data_iter)
print(batch_x.shape, batch_y.shape)
print(batch_y)

在这里插入图片描述

def get_data(train_bs, valid_bs, bs): # 创建数据加载器return (DataLoader(train_ds, batch_size=bs, shuffle=True),DataLoader(valid_ds, batch_size=bs))
from torch import optim
def get_model():model = Mnist_NN().to(DEVICE)optimizer = optim.SGD(model.parameters(), lr=0.01) # model.parameters()包含了所有的权重和偏执参数return model, optimizer

注:adam相比于SGD是引入了一个惯性,相当于一个平行四边形的一个合成法则
在这里插入图片描述

def loss_batch(model, loss_func, xb, yb, opt=None):loss = loss_func(model(xb), yb)if opt is not None: # 此时是训练集opt.zero_grad()loss.backward()opt.step()return loss.item(), len(xb)

opt为True是训练集测试损失,opt为None是验证集测试损失

def loss_batch(model, loss_func, xb, yb, opt=None):loss = loss_func(model(xb), yb)if opt is not None: # 此时是训练集opt.zero_grad()loss.backward()opt.step()return loss.item(), len(xb)
import numpy as npdef fit(epoch, model, loss_func, opt, train_dl, valid_dl):for step in range(epoch):model.train()for xb, yb in train_dl:loss_batch(model, loss_func, xb, yb, opt)model.eval() # 考试with torch.no_grad():losses, nums = zip(*[loss_batch(model, loss_func, xb, yb) for xb, yb in valid_dl] # "*"——解包/解开)# print(f"losses: {losses}")# print(f"nums: {nums}")val_loss = np.sum(np.multiply(losses, nums)) / np.sum(nums) # 加权平均损失print('当前step: '+str(step), '验证集损失: '+str(val_loss))
train_dl, valid_dl = get_data(train_ds, valid_ds, bs=64)
model, optimizer = get_model()
fit(30, model, loss_func, optimizer, train_dl, valid_dl)

在这里插入图片描述

计算验证集准确率

torch.set_printoptions(precision=4, sci_mode=False)
for xb, yb in valid_dl:output = model(xb)print(output)print(output.shape)break
for xb, yb in valid_dl:output = model(xb)probs = torch.softmax(output, dim=1)print(probs)print(probs.shape)break
for xb, yb in valid_dl:output = model(xb)probs = torch.softmax(output, dim=1)preds = torch.argmax(probs, dim=1)print(preds)print(preds.shape)break
correct_predict = 0 # 计数正确预测图片的数目
total_quantity = 0 # 计数验证集总数for xb, yb in valid_dl:output = model(xb)probs = torch.softmax(output, dim=1)preds = torch.argmax(probs, dim=1)total_quantity += yb.size(0)# print(yb.size(0))# print((preds == yb).sum())# print((preds == yb).sum().item())correct_predict += (preds == yb).sum().item()print(f"验证集的准确率是: {100 * correct_predict / total_quantity} % ")

在这里插入图片描述

气温预测

回归

import numpy as np # 矩阵运算
import pandas as pd
import matplotlib.pyplot as plt
import torch
import torch.optim as optimimport warnings
warnings.filterwarnings("ignore")%matplotlib inline
features = pd.read_csv('temps.csv')features.head()

在这里插入图片描述

print("数据维度: ", features.shape)

在这里插入图片描述

# 处理时间数据
import datetimeyears = features['year']
months = features['month']
days = features['day']dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)]
dates[:5]

在这里插入图片描述

dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)]
dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in dates]
dates[:5]

在这里插入图片描述

plt.style.use('fivethirtyeight')fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, figsize = (10, 10))
fig.autofmt_xdate(rotation=45) #x轴翻转45度# 标签值
ax1.plot(dates, features['actual'])
ax1.set_xlabel(''); ax1.set_ylabel('Temoerature'); ax1.set_title('Actual Max Temp')# 昨天温度
ax2.plot(dates, features['temp_1'])
ax2.set_xlabel(''); ax2.set_ylabel('Temoerature'); ax2.set_title('Previous Max Temp')# 前天温度
ax3.plot(dates, features['temp_2'])
ax3.set_xlabel('Date'); ax3.set_ylabel('Temoerature'); ax3.set_title('Two Days Prior Max Temp')# 朋友预测温度
ax4.plot(dates, features['friend'])
ax4.set_xlabel('Date'); ax4.set_ylabel('Temoerature'); ax4.set_title('Friend Max Temp')

在这里插入图片描述
在这里插入图片描述

features = pd.get_dummies(features)
features.head()

在这里插入图片描述

labels = np.array(features['actual'])# 在特征中去掉标签
features = features.drop('actual', axis=1)feature_list = list(features.columns)features = np.array(features)
features.shape

在这里插入图片描述

from sklearn import preprocessing
input_features = preprocessing.StandardScaler().fit_transform(features)
input_features[:5]

构建神经网络

x = torch.tensor(input_features, dtype = float)
y = torch.tensor(labels, dtype=float)
print(x.shape, y.shape)
# 权重初始化
weights = torch.randn((14, 128), dtype = float, requires_grad = True) 
biases = torch.randn(128, dtype = float, requires_grad = True) 
weights2 = torch.randn((128, 1), dtype = float, requires_grad = True) 
biases2 = torch.randn(1, dtype = float, requires_grad = True) learning_rate = 0.001
losses = []for i in range(1000):hidden = x.mm(weights) + biaseshidden = torch.relu(hidden)predictions = hidden.mm(weights2) + biases2loss = torch.mean((predictions - y)**2)losses.append(loss.item())if i % 100 == 0:print(f"loss: {loss}")# 反向传播loss.backward()# 更新,相当于optim.step()weights.data.add_(- learning_rate * weights.grad.data)  biases.data.add_(- learning_rate * biases.grad.data)weights2.data.add_(- learning_rate * weights2.grad.data)biases2.data.add_(- learning_rate * biases2.grad.data)# 清空梯度,optim.zero_grad()weights.grad.data.zero_()biases.grad.data.zero_()weights2.grad.data.zero_()biases2.grad.data.zero_()

在这里插入图片描述

调包

import torch.optim as optim# 数据准备
# 将数据都转化为tensor张量
x = torch.tensor(input_features, dtype = torch.float)
y = torch.tensor(labels, dtype=torch.float).view(-1, 1) # 改成(n, 1)
print(x.shape, y.shape)
model = torch.nn.Sequential(torch.nn.Linear(14, 128),torch.nn.ReLU(),torch.nn.Linear(128, 1)
)# 均方误差MSE
criterion = torch.nn.MSELoss(reduction='mean')optimizer = optim.Adam(model.parameters(), lr=0.001)losses = [] # 存储每一次迭代的损失for i in range(3000):predictions = model(x) # [348, 1]loss = criterion(predictions, y)losses.append(loss.item())if i % 200 == 0:print(f"loss: {loss.item()}")optimizer.zero_grad()loss.backward()optimizer.step()

在这里插入图片描述

预测训练结果

x = torch.tensor(input_features, dtype = torch.float)
predict = model(x).data.numpy()
dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)]
dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in dates]# 创建一个表格来存日期和对应的真实标签
true_data = pd.DataFrame(data = {'date': dates, 'actual': labels})# 创建一个表格来存日期和对应的预测值
predictions_data = pd.DataFrame(data = {'date': dates, 'prediction': predict.reshape(-1)})
predict.shape, predict.reshape(-1).shape

在这里插入图片描述

true_data[:5]

在这里插入图片描述

predictions_data[:5]

在这里插入图片描述

画图对比

# 真实值
plt.plot(true_data['date'], true_data['actual'], 'b-', label = "actual")# 预测值
plt.plot(predictions_data['date'], predictions_data['prediction'], 'ro', label = "prediction")plt.xticks(rotation = 60)plt.legend()

在这里插入图片描述

# 真实值
plt.plot(true_data['date'], true_data['actual'], 'b-', label = "actual")# 预测值
plt.plot(predictions_data['date'], predictions_data['prediction'], 'ro', label = "prediction")plt.xticks(rotation = 60)plt.legend()plt.xlabel('Date'); plt.ylabel('Maximum Tempurate(F)'); plt.title('Actual and Predicted Values')

在这里插入图片描述

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

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

相关文章

java商城系统和php商城系统对比

java商城系统和php商城系统是两种常见的电子商务平台,它们都具有一定的优势和劣势。那么,java商城系统和php商城系统又有哪些差异呢? 一、开发难度 Java商城系统和PHP商城系统在开发难度方面存在一定的差异。Java商城系统需要使用Java语言进…

数据结构 | 基本数据结构——栈

目录 一、线性数据结构 二、栈 2.1 何谓栈 2.2 栈抽象数据类型 2.3 用Python实现栈 2.4 匹配括号 2.5 普通情况:匹配符号 2.6 将十进制数转换成二进制数 3.7 前序、中序和后序表达式 3.7.1 从中序到后序的通用转换法 3.7.2 计算后序表达式 一、线性数据结…

[内网渗透]SUID提权

文章目录 [内网渗透]SUID提权0x01.什么是SUID?0x02.如何设置SUID?0x03.查找属主为root的SUID文件0x04.进行SUID提权1.find提权2.vim/vi/vim.tiny 以root权限修改文件3.bash提权4.less/more执行系统命令5.nano以root权限修改文件6.awk执行系统命令7.cp以r…

开源计算机视觉库OpenCV详解

目录 1、概述 2、OpenCV详细介绍 2.1、OpenCV的起源 2.2、OpenCV开发语言 2.3、OpenCV的应用领域 3、OpenCV模块划分 4、OpenCV源码文件结构 4.1、根目录介绍 4.2、常用模块介绍 4.3、CUDA加速模块 5、OpenCV配置以及Visual Studio使用OpenCV 6、关于Lena图片 7、…

LLM-Blender:大语言模型也可以进行集成学习

最近在看arxiv的时候发现了一个有意思的框架:LLM-Blender,它可以使用Ensemble 的方法来对大语言模型进行集成。 官方介绍如下:LLM-Blender是一个集成框架,可以通过利用多个开源大型语言模型(llm)的不同优势来获得始终如一的卓越性…

TCP如何保证服务的可靠性

TCP如何保证服务的可靠性 确认应答超时重传流量控制滑动窗口机制概述发送窗口和接收窗口的工作原理几种滑动窗口协议1比特滑动窗口协议(停等协议)后退n协议选择重传协议 采用滑动窗口的问题(死锁可能,糊涂窗口综合征)死…

ESP32 官方AT固件编译(从零开始环境搭建到编译完成全过程)

1、下载VMware免费版 https://download3.vmware.com/software/WKST-PLAYER-1702/VMware-player-full-17.0.2-21581411.exe 2、下载Ubuntu (ubuntu-22.04.2-desktop-amd64.iso)** https://releases.ubuntu.com/jammy/ubuntu-22.04.2-desktop-amd64.iso…

IDE/mingw下动态库(.dll和.a文件)的生成和部署使用(对比MSVC下.dll和.lib)

文章目录 概述问题的产生基于mingw的DLL动态库基于mingw的EXE可执行程序Makefile文件中使用Qt库的\*.a文件mingw下的*.a 文件 和 *.dll 到底谁起作用小插曲 mingw 生成的 \*.a文件到底是什么为啥mingw的dll可用以编译链接过程转换为lib引导文件 概述 本文介绍了 QtCreator mi…

AI编程常用工具 Jupyter Notebook

点击上方蓝色字体,选择“设为星标” 回复”云原生“获取基础架构实践 深度学习编程常用工具 我们先来看 4 个常用的编程工具:Sublime Text、Vim、Jupyter。虽然我介绍的是 Jupyter,但并不是要求你必须使用它,你也可以根据自己的喜…

PostgreSQL PG16 逻辑复制在STANDBY 上工作 (译)

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…

Mybatis-plus从入门到精通

1、什么是MyBatis-Plus MyBatis-Plus(简称MP)是一个基于MyBatis的增强工具,在MyBatis的基础上对其进行扩展,用于简化MyBatis操作,提高开发效率。它继承了MyBatis原生的所有特性,并且添加了一些额外的功能&…

前端随笔:HTML/CSS/JavaScript和Vue

前端随笔 1:HTML、JavaScript和Vue 最近因为工作需要,需要接触一些前端的东西。之前虽然大体上了解过HTML、CSS和JavaScript,也知道HTML定义了内容、CSS定义了样式、JavaScript定义了行为,但是却没有详细的学习过前端三件套的细节…

微服务入门---SpringCloud(一)

微服务入门---SpringCloud(一) 1.认识微服务1.0.学习目标1.1.单体架构1.2.分布式架构1.3.微服务1.4.SpringCloud1.5.总结 2.服务拆分和远程调用2.1.服务拆分原则2.2.服务拆分示例2.2.1.导入Sql语句2.2.2.导入demo工程 2.3.实现远程调用案例2.3.1.案例需求…

CoTracker跟踪器 - CoTracker: It is Better to Track Together

论文地址:https://arxiv.org/pdf/2307.07635v1.pdf 官方地址:https://co-tracker.github.io/ github地址:https://github.com/facebookresearch/co-tracker/tree/main 引言 在计算机视觉领域,光流估计是历史最久远的问题之一&a…

利用VBA制作一个转盘游戏之五:最终的游戏过程

【分享成果,随喜正能量】真正厉害的人,从来不说难听的话,因为人心不需要听真话,只需要听好听的话,所以学着做一个有温度且睿智的人。不相为谋,但我照样能心平气和,冷眼相待,我依旧可…

BGP的介绍

目录 BGP基础 BGP的发展历史 BGP在企业中的应用 距离矢量型协议和路径矢量型协议的区别 BGP的特征 1.可控性 2.可靠性 3.AS-BY-AS BGP的对等关系 BGP的数据包 1.open报文 2.Keepalive报文 3.Update报文 4.Notification 报文 5.Route-refresh报文 BGP的状态机 …

【暑期每日一练】 day7

目录 选择题 (1) 解析: (2) 解析: (3) 解析: (4) 解析: (5) 解析: 编程题 题一…

【深度学习中常见的优化器总结】SGD+Adagrad+RMSprop+Adam优化算法总结及代码实现

文章目录 一、SGD,随机梯度下降1.1、算法详解1)MBSGD(Mini-batch Stochastic Gradient Descent)2)动量法:momentum3)NAG(Nesterov accelerated gradient)4)权重衰减项(we…

使用 ChatGPT 进行研究的先进技术

在这篇文章中,您将探索改进您研究的先进技术。尤其, 分析和解释研究数据进行文献综述并找出研究差距废话不多说直接开始吧!!! 分析和解释研究数据 一家小企业主希望分析客户满意度数据以改善客户服务。他们使用包含 10…

【Lua学习笔记】Lua入门

文章目录 Lua变量数据类型变量声明其他表示 Lua语法判断逻辑判断(Lua很特殊,这个比较重要)短路判断 ifif else 循环whileforrepeat 迭代器泛型for迭代器无状态迭代器多状态的迭代器 Lua函数select方法 数组字符索引_G (不是教程&a…