最近在学习Pytorch v1.3最新版和Tensorflow2.0。

我学习Pytorch的主要途径:莫烦PythonPytorch 1.3官方文档 ,Pytorch v1.3跟之前的Pytorch不太一样,比如1.3中,Variable类已经被弃用了(目前还可以用,但不推荐),tensor可以直接调用backward方法进行反向求导,不需要再像之前的版本一样必须包装成Variable对象之后再backward。

Tensorflow2.0的学习可以参考北大学生写的教程:https://tf.wiki/zh/basic/basic.html ,TensorFlow2.0与之前的版本也有很大不同,TF 1.x的很多写法已经不适用了,2.0把大量keras的内容包括了进去,使用之前的TF方便,但我总感觉混在一起,那还不如直接学Keras,另外跟Pytorch相比,为了实现相同的功能,TF2.0的代码还是太多了,不够简洁。

为了对比两者的速度,今天自己第一次尝试用Pytorch实现了用于图片分类的最简单的全连接神经网络。代码包括了神经网络的定义、使用DataLoader批训练、效果的准确性评估,模型使用方法、输出转换为label型等内容。

 import time
import torch.nn as nn
from torchvision.datasets import FashionMNIST
import torch
import numpy as np
from torch.utils.data import DataLoader
import torch.utils.data as Data '''数据集为FashionMNIST'''
data=FashionMNIST('../pycharm_workspace/data/') def train_test_split(data,test_pct=0.3):
test_len=int(data.data.size(0)*test_pct)
x_test=data.data[0:test_len].type(torch.float)
x_train=data.data[test_len:].type(torch.float) y_test=data.targets[0:test_len]
y_train=data.targets[test_len:] return x_train,y_train,x_test,y_test '''自定义神经网络1'''
class MLP(nn.Module):
def __init__(self,input_size,hidden_size,output_size):
super().__init__()
self.linear1=nn.Linear(input_size,hidden_size)
self.linear2=nn.Linear(hidden_size,output_size) def forward(self,x):
out=self.linear1(x)
out=torch.relu(out)
out=self.linear2(out)
return out
#out=torch.softmax() def train_1():
'''创建模型对象'''
input_size=784#训练数据的维度
hidden_size=64#隐藏层的神经元数量,这个数量越大,神经网络越复杂,训练后网络的准确度越高,但训练耗时也越长
ouput_size=10#输出层的神经元数量
mlp=MLP(input_size,hidden_size,ouput_size)
'''定义损失函数'''
loss_func=torch.nn.CrossEntropyLoss()
'''定义优化器'''
#optimizer=torch.optim.RMSprop(mlp.parameters(),lr=0.001,alpha=0.9)
#optimizer=torch.optim.Adam(mlp.parameters(),lr=0.01)
optimizer=torch.optim.Adam(mlp.parameters(),lr=0.001)
x_train,y_train,x_test,y_test=train_test_split(data,0.2)
start=time.time()
for i in range(200):
x=x_train.view(x_train.shape[0],-1)
prediction=mlp(x)
loss=loss_func(prediction,y_train)
print('Batch No.%s,loss:%s'%(i,loss.data.numpy()))
optimizer.zero_grad()
loss.backward()
optimizer.step()
end=time.time()
print('runnig time:%.3f sec.'%(end-start)) '''评估模型效果'''
samples=10000
'''取一定数量的样本,用于评估'''
x_input=x_test[:samples]
'''模型输入必须为tensor形式,且维度为(784,)'''
x_input=x_input.view(x_input.shape[0],-1)
y_pred=mlp(x_input)
'''把模型输出(向量)转为label形式'''
y_pred_=list(map(lambda x:np.argmax(x),y_pred.data.numpy()))
'''计算准确率'''
acc=sum(y_pred_==y_test.numpy()[:samples])/samples
print('Accuracy:',acc)
     ###输出:Accuracy:0.8153 '''自定义神经网络2'''
class MyNet(nn.Module):
def __init__(self,in_size,hidden_size,out_size):
super().__init__()
self.linear1=nn.Linear(in_size,hidden_size)
self.linear2=nn.Linear(hidden_size,out_size) def forward(self,x):
x=x.view(x.size(0),-1)
out=self.linear1(x)
out=torch.relu(out)
out=self.linear2(out)
return out def train_2():
num_epoch=20
#t_data=data.data.type(torch.float)
x_train,y_train,x_test,y_test=train_test_split(data,0.2)
'''使用DataLoader批量输入训练数据'''
dl_train=DataLoader(Data.TensorDataset(x_train,y_train),batch_size=100,shuffle=True)
'''创建模型对象'''
model=MyNet(784,512,10)
'''定义损失函数'''
loss_func=torch.nn.CrossEntropyLoss()
'''定义优化器'''
optimizer=torch.optim.Adam(model.parameters(),lr=0.001)
start=time.time()
for i in range(num_epoch):
for index,(x_data,y_data) in enumerate(dl_train):
prediction=model(x_data)
loss=loss_func(prediction,y_data)
print('No.%s,loss=%.3f'%(index,loss.data.numpy()))
optimizer.zero_grad()
loss.backward()
optimizer.step()
print('No.%s,loss=%.3f'%(i,loss.data.numpy()))
end=time.time()
print('runnig time:%.3f sec.'%(end-start)) '''评估模型的Accuracy'''
samples=10000
'''取一定数量的样本,用于评估'''
y_pred=model(x_test[:samples])
'''把模型输出(向量)转为label形式'''
y_pred_=list(map(lambda x:np.argmax(x),y_pred.data.numpy()))
'''计算准确率'''
acc=sum(y_pred_==y_test.numpy()[:samples])/samples
print('Accuracy:',acc)
###输出:Accuracy:0.8622

题外话,用相同的数据集、相同的神经网络结构、相同的优化器、相同的参数,把Pytorch跟TensorFlow2.0对比,发现pytorch对cpu的占用更小,TF 2.0跑起来Mac pro呼呼地响,Pytorch跑的时候安静很多。

Pytorch分类和准确性评估--基于FashionMNIST数据集的更多相关文章

  1. 基于MNIST数据集使用TensorFlow训练一个没有隐含层的浅层神经网络

    基础 在参考①中我们详细介绍了没有隐含层的神经网络结构,该神经网络只有输入层和输出层,并且输入层和输出层是通过全连接方式进行连接的.具体结构如下: 我们用此网络结构基于MNIST数据集(参考②)进行训 ...

  2. 神经网络中的Heloo,World,基于MINST数据集的LeNet

    前言 最近刚开始接触机器学习,记录下目前的一些理解,以及看到的一些好文章mark一下 1.MINST数据集 MNIST 数据集来自美国国家标准与技术研究所, National Institute of ...

  3. 【实践】如何利用tensorflow的object_detection api开源框架训练基于自己数据集的模型(Windows10系统)

    如何利用tensorflow的object_detection api开源框架训练基于自己数据集的模型(Windows10系统) 一.环境配置 1. Python3.7.x(注:我用的是3.7.3.安 ...

  4. 基于COCO数据集验证的目标检测算法天梯排行榜

    基于COCO数据集验证的目标检测算法天梯排行榜 AP50 Rank Model box AP AP50 Paper Code Result Year Tags 1 SwinV2-G (HTC++) 6 ...

  5. 基于titanic数据集预测titanic号旅客生还率

    数据清洗及可视化 实验内容 数据清洗是数据分析中非常重要的一部分,也最繁琐,做好这一步需要大量的经验和耐心.这门课程中,我将和大家一起,一步步完成这项工作.大家可以从这门课程中学习数据清洗的基本思路以 ...

  6. 第二十二节,TensorFlow中的图片分类模型库slim的使用、数据集处理

    Google在TensorFlow1.0,之后推出了一个叫slim的库,TF-slim是TensorFlow的一个新的轻量级的高级API接口.这个模块是在16年新推出的,其主要目的是来做所谓的“代码瘦 ...

  7. scikit-learn - 分类模型的评估 (classification_report)

    使用说明 参数 sklearn.metrics.classification_report(y_true, y_pred, labels=None, target_names=None, sample ...

  8. 分类问题(一)MINST数据集与二元分类器

    分类问题 在机器学习中,主要有两大类问题,分别是分类和回归.下面我们先主讲分类问题. MINST 这里我们会用MINST数据集,也就是众所周知的手写数字集,机器学习中的 Hello World.sk- ...

  9. 第四十七篇 入门机器学习——分类的准确性(Accuracy)

    No.1. 通常情况下,直接将训练得到的模型应用于真实环境中,可能会存在很多问题 No.2. 比较好的解决方法是,将原始数据中的大部分用于训练数据,而留出少部分数据用于测试,即,将数据集切分成训练数据 ...

随机推荐

  1. UML笔记之类图

    1.类与类之间关系在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合( ...

  2. nginx代理vue项目

    很多项目的前端都使用vue编写的,在项目上线部署的时候,有些项目要求把前端页面和后台服务部署在不同的服务器,这就要求使用nginx代理,本文就来讲讲vue项目怎么使用nginx代理. 项目github ...

  3. linux关于suid提权笔记

    suid全称是Set owner User ID up on execution.这是Linux给可执行文件的一个属性,上述情况下,普通用户之所以也可以使用ping命令,原因就在我们给ping这个可执 ...

  4. vue-infinite-scroll------vue的无线滚动插件

    vue-infinite-scroll------vue的无线滚动插件 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 V ...

  5. B. Math Show 暴力 C - Four Segments

    B. Math Show 这个题目直接暴力,还是有点难想,我没有想出来,有点思维. #include <cstdio> #include <cstdlib> #include ...

  6. JAVA基础篇 之 finalize()方法的作用

    ​ 我们知道java有垃圾回收器负责回收无用对象占据的内存资源,但也有特殊情况:假设你的对象(并非使用new)获得了一块特殊的内存区域,由于垃圾回收器只知道回收那些经由new分配的内存,所以它不知道如 ...

  7. Coursera课程笔记----C程序设计进阶----Week 5

    指针(二) (Week 5) 字符串与指针 指向数组的指针 int a[10]; int *p; p = a; 指向字符串的指针 指向字符串的指针变量 char a[10]; char *p; p = ...

  8. 【Spark】RDD的依赖关系和缓存相关知识点

    文章目录 RDD的依赖关系 宽依赖 窄依赖 血统 RDD缓存 概述 缓存方式 RDD的依赖关系 RDD和它依赖的父RDD的关系有两种不同的类型,即窄依赖(narrow dependency) 和宽依赖 ...

  9. JS实现手机号码中间4位变星号

    这个问题,我们可以用截取字符串解决,以下我列出2种方法,小伙伴们可以根据自己的需要选择哦: ● 1,substring()方法用于提取字符串中介于两个指定下标之间的字符. '; //该号码是乱打出来的 ...

  10. OpenStack黄金十年:我与OpenStack的故事

    导读:从2010年到2020年,OpenStack项目整整走过了十个春夏秋冬.不管是OpenStack基金会,还是积极参与OpenStack社区的厂商.企业乃至开发者,想必都有肺腑之言想对OpenSt ...