前言:
当你熟悉ubuntu16.04安装Anaconda和使用Anaconda创建对应python版本的虚拟环境,我们开始接下来的步骤。
1.安装typroch
去官网生成对应的typorch的pip或conda 命令行
打开终端input:
source activate learn #切换到自己创建的learn环境,不会请看前言的两个博客
conda install pytorch torchvision cpuonly -c pytorch #安装pytorch(根据提示来即可),若因某种原因出现段错误(核心已转储)的情况,重启虚拟机,再来一次即可。
完成后验证是否有错误
python
import torch
import torchvision
#若没有保存则安装成功
2.测试小demo:
# encoding: utf-8
import torch
import torch.nn as nn
import torch.nn.functional as F #加载nn中的功能函数
import torch.optim as optim #加载优化器有关包
import torch.utils.data as Data
from torchvision import datasets,transforms #加载计算机视觉有关包
from torch.autograd import Variable
BATCH_SIZE = 64
#加载torchvision包内内置的MNIST数据集 这里涉及到transform:将图片转化成torchtensor
train_dataset = datasets.MNIST(root='~/data/',train=True,transform=transforms.ToTensor(),download=True)
test_dataset = datasets.MNIST(root='~/data/',train=False,transform=transforms.ToTensor())
#加载小批次数据,即将MNIST数据集中的data分成每组batch_size的小块,shuffle指定是否随机读取
train_loader = Data.DataLoader(dataset=train_dataset,batch_size=BATCH_SIZE,shuffle=True)
test_loader = Data.DataLoader(dataset=test_dataset,batch_size=BATCH_SIZE,shuffle=False)
#定义网络模型亦即Net 这里定义一个简单的全连接层784->10
class Model(nn.Module):
def __init__(self):
super(Model,self).__init__()
self.linear1 = nn.Linear(784,10)
def forward(self,X):
return F.relu(self.linear1(X))
model = Model() #实例化全连接层
loss = nn.CrossEntropyLoss() #损失函数选择,交叉熵函数
optimizer = optim.SGD(model.parameters(),lr = 0.1)
num_epochs = 5
#以下四个列表是为了可视化(暂未实现)
losses = []
acces = []
eval_losses = []
eval_acces = []
for echo in range(num_epochs):
train_loss = 0 #定义训练损失
train_acc = 0 #定义训练准确度
model.train() #将网络转化为训练模式
for i,(X,label) in enumerate(train_loader): #使用枚举函数遍历train_loader
X = X.view(-1,784) #X:[64,1,28,28] -> [64,784]将X向量展平
X = Variable(X) #包装tensor用于自动求梯度
label = Variable(label)
out = model(X) #正向传播
lossvalue = loss(out,label) #求损失值
optimizer.zero_grad() #优化器梯度归零
lossvalue.backward() #反向转播,刷新梯度值
optimizer.step() #优化器运行一步,注意optimizer搜集的是model的参数
#计算损失
train_loss += float(lossvalue)
#计算精确度
_,pred = out.max(1)
num_correct = (pred == label).sum()
acc = float(num_correct) / X.shape[0]
train_acc += acc
losses.append(train_loss / len(train_loader))
acces.append(train_acc / len(train_loader))
print("echo:"+' ' +str(echo))
print("lose:" + ' ' + str(train_loss / len(train_loader)))
print("accuracy:" + ' '+str(train_acc / len(train_loader)))
eval_loss = 0
eval_acc = 0
model.eval() #模型转化为评估模式
for X,label in test_loader:
X = X.view(-1,784)
X = Variable(X)
label = Variable(label)
testout = model(X)
testloss = loss(testout,label)
eval_loss += float(testloss)
_,pred = testout.max(1)
num_correct = (pred == label).sum()
acc = float(num_correct) / X.shape[0]
eval_acc += acc
eval_losses.append(eval_loss / len(test_loader))
eval_acces.append(eval_acc / len(test_loader))
print("testlose: " + str(eval_loss/len(test_loader)))
print("testaccuracy:" + str(eval_acc/len(test_loader)) + '\n')
将test.py拉入自己所创建的learn环境中(放在哪都可以,我只是为了少写路径)在此处
打开终端input:
source activate learn #切换到自己创建的learn环境,不会请看前言的两个博客
python test.py
output: