PyTorch深度学习实践——多分类问题
多分类问题
课程来源:PyTorch深度学习实践——河北工业大学
《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibili
Softmax
这一讲介绍使用softmax分类器实现多分类问题。
上一节课计算的是二分类问题,也就是输出的label可以分类为0,1两类。只要计算出\(P(y=1)\)的概率,那么\(P(y=0)=1-P(y=1)\);所以只需要计算一种类型的概率即可,也就是只要一个参数。
而在使用MINIST对手写数字进行分类的时候一共是有10个分类的(数字0-9)。
处理方式:视为10个二分类问题(一个label和其他9个label),计算每一个label的概率。如下图所示,但是问题在于
- 每一个二分类问题的结果是独立的,不能保证10个结果加起来等于1,且无法解决互相抑制的问题。
- 每一个结果不能保证大于0。

我们希望输出是有竞争关系的,也就是如果有一项很大那么其他项要相对比较小。为了解决上述问题,提出softmax函数,使用结构如下:

Softmax计算公式如下:
\]
Softmax函数计算简单示例如下:

接下来考虑多分类问题中的损失函数如何定义:和上述BCE基本一致,同样使用交叉熵作为损失函数,定义式如下:
\]
上面这种计算方式也就是NLLLoss,这种损失函数的结构如下:

而NLLLoss损失函数加上Softmax就是交叉熵损失,对应PyTorch中的nn.CrossEntropyLoss(),也就是最后一层的非线性变化不需要进行,直接交给上述损失函数即可。如下图所示:

在Minist数据集上实现多分类问题
Minsit 数据介绍:每一个手写图片都可以看做是一个28x28的矩阵,如下图所示:

总体构建模型并训练还是如上四步,在最后一步加上测试过程。
注:1.在视觉处理中,灰度图可以看做单通道图像,而彩色图像事实上就是RGB三通道的矩阵,在PyTorch中要把构造成通道数量的C放在第一维的三维向量。
2.神经网络训练中尽量将图像矩阵转换为0-1分布的数据
模型结构简图:

代码如下:
import torch
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F
import torch.optim as optim
# prepare dataset
batch_size = 64
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]) # 归一化
train_dataset = datasets.MNIST(root='../dataset/mnist/', train=True, download=True, transform=transform)
train_loader = DataLoader(train_dataset, shuffle=True, batch_size=batch_size)
test_dataset = datasets.MNIST(root='../dataset/mnist/', train=False, download=True, transform=transform)
test_loader = DataLoader(test_dataset, shuffle=False, batch_size=batch_size)
# 定义模型
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
self.l1 = torch.nn.Linear(784, 512)
self.l2 = torch.nn.Linear(512, 256)
self.l3 = torch.nn.Linear(256, 128)
self.l4 = torch.nn.Linear(128, 64)
self.l5 = torch.nn.Linear(64, 10)
def forward(self, x):
x = x.view(-1, 784)
x = F.relu(self.l1(x))
x = F.relu(self.l2(x))
x = F.relu(self.l3(x))
x = F.relu(self.l4(x))
return self.l5(x) # 最后一层不做激活,不进行非线性变换
model = Net()
# construct loss and optimizer
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)
# training cycle forward, backward, update
def train(epoch):
running_loss = 0.0
for batch_idx, data in enumerate(train_loader, 0):
inputs, target = data
optimizer.zero_grad()
# 预测结果
outputs = model(inputs)
# 交叉熵
loss = criterion(outputs, target)
loss.backward()
optimizer.step()
running_loss += loss.item()
if batch_idx % 300 == 299:
print('[%d, %5d] loss: %.3f' % (epoch+1, batch_idx+1, running_loss/300))
running_loss = 0.0
def test():
correct = 0
total = 0
with torch.no_grad():
for data in test_loader:
images, labels = data
outputs = model(images)
_, predicted = torch.max(outputs.data, dim=1) # dim = 1 列是第0个维度,行是第1个维度
total += labels.size(0)
correct += (predicted == labels).sum().item() # 张量之间的比较运算
print('accuracy on test set: %d %% ' % (100*correct/total))
if __name__ == '__main__':
for epoch in range(10):
train(epoch)
test()
作业
Pytorch详解NLLLoss和CrossEntropyLoss 详见如下网址:https://blog.csdn.net/weixin_43593330/article/details/108622747
Otto Group Product Classification Challenge
import torch
import torch.nn as nn
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
from torch.utils.data import Dataset
import torch.optim as optim
##str转数值类型
def label2id(labels):
id=[]
target_labels=['Class_1', 'Class_2', 'Class_3', 'Class_4', 'Class_5', 'Class_6', 'Class_7', 'Class_8', 'Class_9']
for label in labels:
id.append(target_labels.index(label))
return id
class MyDataset(Dataset):
def __init__(self,filepath):
data=pd.read_csv(filepath)
labels=data['target']
self.x_data=torch.from_numpy(np.array(data)[:,1:-1].astype(np.float32))
self.y_data=label2id(labels)
self.len=data.shape[0]
def __getitem__(self,index):
return self.x_data[index],self.y_data[index]
def __len__(self):
return self.len
class Module(nn.Module):
def __init__(self):
super(Module,self).__init__()
self.linear1=nn.Linear(93,64)
self.linear2 = nn.Linear(64, 32)
self.linear3 = nn.Linear(32, 16)
self.linear4 = nn.Linear(16, 9)
self.activate=nn.ReLU()
def forward(self,x):
x = self.activate(self.linear1(x))
x = self.activate(self.linear2(x))
x = self.activate(self.linear3(x))
x=self.linear4(x)
return x
def train(epoch):
running_loss=0.0
for batch_idx,data in enumerate(train_loader,1):
x,y=data
y_pred=model(x)
loss=critetion(y_pred,y)
running_loss+=loss.item()
optimizer.zero_grad()
loss.backward()
optimizer.step()
loss_list.append(loss.item())
if batch_idx %100 ==0:
print('[%d, %5d] loss = %.3f' % (epoch + 1, batch_idx, running_loss / 100))
running_loss=0.0
if __name__=="__main__":
train_data = MyDataset('train.csv')
train_loader = DataLoader(dataset=train_data, batch_size=64, shuffle=True, num_workers=0)
model=Module()
critetion=nn.CrossEntropyLoss()
optimizer=optim.SGD(model.parameters(),lr=0.01,momentum=0.5)
loss_list=[]
for epoch in range(30):
train(epoch)
plt.plot(range(len(loss_list)), loss_list)
plt.xlabel('step')
plt.ylabel('loss')
plt.show()
def test():
test_data=pd.read_csv('test.csv')
x_test=torch.from_numpy(np.array(test_data)[:,1:].astype(np.float32))
y_pred=model(x_test)
_,pred=torch.max(y_pred,dim=1)
out=pd.get_dummies(pred)#获取one-hot,其实就是0-8
labels=['Class_1', 'Class_2', 'Class_3', 'Class_4', 'Class_5', 'Class_6', 'Class_7', 'Class_8', 'Class_9']
out.columns=labels
out.insert(0,'id',test_data['id'])
result=pd.DataFrame(out)
result.to_csv('otto-group-product_predictions.csv', index=False)
test()
loss可视化:

结果:

PyTorch深度学习实践——多分类问题的更多相关文章
- PyTorch深度学习实践——处理多维特征的输入
处理多维特征的输入 课程来源:PyTorch深度学习实践--河北工业大学 <PyTorch深度学习实践>完结合集_哔哩哔哩_bilibili 这一讲介绍输入为多维数据时的分类. 一个数据集 ...
- PyTorch深度学习实践——反向传播
反向传播 课程来源:PyTorch深度学习实践--河北工业大学 <PyTorch深度学习实践>完结合集_哔哩哔哩_bilibili 目录 反向传播 笔记 作业 笔记 在之前课程中介绍的线性 ...
- PyTorch深度学习实践-Overview
Overview 1.PyTorch简介 PyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序.它主要由Facebookd的人工智能小组开发,不仅能够 实现强 ...
- 万字总结Keras深度学习中文文本分类
摘要:文章将详细讲解Keras实现经典的深度学习文本分类算法,包括LSTM.BiLSTM.BiLSTM+Attention和CNN.TextCNN. 本文分享自华为云社区<Keras深度学习中文 ...
- 深度学习实践系列(2)- 搭建notMNIST的深度神经网络
如果你希望系统性的了解神经网络,请参考零基础入门深度学习系列,下面我会粗略的介绍一下本文中实现神经网络需要了解的知识. 什么是深度神经网络? 神经网络包含三层:输入层(X).隐藏层和输出层:f(x) ...
- 深度学习实践系列(3)- 使用Keras搭建notMNIST的神经网络
前期回顾: 深度学习实践系列(1)- 从零搭建notMNIST逻辑回归模型 深度学习实践系列(2)- 搭建notMNIST的深度神经网络 在第二篇系列中,我们使用了TensorFlow搭建了第一个深度 ...
- 对比学习:《深度学习之Pytorch》《PyTorch深度学习实战》+代码
PyTorch是一个基于Python的深度学习平台,该平台简单易用上手快,从计算机视觉.自然语言处理再到强化学习,PyTorch的功能强大,支持PyTorch的工具包有用于自然语言处理的Allen N ...
- 医学图像 | 使用深度学习实现乳腺癌分类(附python演练)
乳腺癌是全球第二常见的女性癌症.2012年,它占所有新癌症病例的12%,占所有女性癌症病例的25%. 当乳腺细胞生长失控时,乳腺癌就开始了.这些细胞通常形成一个肿瘤,通常可以在x光片上直接看到或感觉到 ...
- 深度学习实践系列(1)- 从零搭建notMNIST逻辑回归模型
MNIST 被喻为深度学习中的Hello World示例,由Yann LeCun等大神组织收集的一个手写数字的数据集,有60000个训练集和10000个验证集,是个非常适合初学者入门的训练集.这个网站 ...
随机推荐
- 多线程创建的方式一(继承Thread类)
1 package multithread; 2 3 /* 4 * 如何创建一个线程呢? 5 * 6 * 创建线程方式一:继承Thread类. 7 * 8 * 步骤: 9 * 1,定义一个类继承Thr ...
- RefactoringGuru 代码异味和重构技巧总结
整理自 RefactoringGuru 代码异味 --什么?代码如何"闻味道"?? --它没有鼻子...但它肯定会发臭! 代码膨胀 [代码膨胀]是代码.方法和类,它们的规模已经增加 ...
- 封装jar问题java.lang.SecurityException: Invalid signature file digest for Manifest main attributes以及maven依赖重提解决
1.jar包封装完成后,其他项目引用jar,启动时报错java.lang.SecurityException: Invalid signature file digest for Manifest m ...
- JVM学习二:JVM之GC算法和种类
我们前面说到了JVM的常用的配置参数,其中就涉及了GC相关的知识,趁热打铁,我们今天就学习下GC的算法有哪些,种类又有哪些,让我们进一步的认识GC这个神奇的东西,帮助我们解决了C 一直挺头疼的内存回收 ...
- root登陆530 Permission denied、530 Login incorrect解决
感谢大佬:https://blog.51cto.com/3241766/2316986?source=dra 背景:由于云平台上22端口不对外放开,sftp使用不了,故选择ftp服务 操作系统版本: ...
- ubuntu关机重启命令介绍
转载请注明来源:https://www.cnblogs.com/hookjc/ 重启命令: 1.reboot 2.shutdown -r now 立刻重启(root用户使用) 3.shut ...
- MySQL数据库授权与索引
MySQL数据库授权与索引 目录 MySQL数据库授权与索引 一.数据库用户授权 1. 授予权限 2. 查看权限 3. 删除权限 4. 全部权限(all privileges) 二.MySQL索引 1 ...
- python基础语法_9-2函数式编程
https://www.imooc.com/learn/317 大纲 1-函数式编程简介 2-高阶函数 3-把函数作为参数 4-map()函数 5-reduce()函数 6-filter()函数 7- ...
- 如何在Kubernetes 里添加自定义的 API 对象(一)
环境: golang 1.15 依赖包采用go module 实例:现在往 Kubernetes 添加一个名叫 Network 的 API 资源类型.它的作用是,一旦用户创建一个 Network 对象 ...
- [技术干货-算子使用] mindspore.scipy 入门使用指导
1. MindSpore框架的SciPy模块 SciPy 是基于NumPy实现的科学计算库,主要用于数学.物理学.生物学等科学以及工程学领域.诸如高阶迭代,线性代数求解等都会需要用到SicPy.Sci ...