Pytorch

一、加载预训练模型

#-*- coding: utf-8 -*-
# Pytorch 加载预训练模型
import torch
import torch.nn as nn

import torchvision.models as models
 
 
## 1. 直接加载预训练模型
net = SNet()
net.load_state_dict(torch.load("model_1599.pkl"))

# 这种方式是针对于之前保存模型时以保存参数的格式使用的:
torch.save(net.state_dict(), "model/model_1599.pkl")
# pytorch官网更推荐上述模型保存方法,也据说这种方式比下一种更快一点。


# 下面介绍第二种模型保存和加载的方式:
net = SNet()
torch.save(net, "model_1599.pkl")

snet = torch.load("model_1599.pkl")
#这种方式会将整个网络保存下来,数据量会更大,会消耗更多的时间,占用内存也更高。

 

 
## 加载部分预训练模型
# 其实大多数时候我们需要根据我们的任务调节我们的模型,所以很难保证模型和公开的模型完全一样,
# 但是预训练模型的参数确实有助于提高训练的准确率,为了结合二者的优点,就需要我们加载部分预训练模型。

# 加载model,model是自己定义好的模型
resnet50 = models.resnet50(pretrained=True) 
model =Net(...) 
 
# 读取参数 
pretrained_dict =resnet50.state_dict() 
model_dict = model.state_dict() 
 
# 将pretrained_dict里不属于model_dict的键剔除掉 
pretrained_dict =  {k: v for k, v in pretrained_dict.items() if k in model_dict} 
 
# 更新现有的model_dict 
model_dict.update(pretrained_dict) 
 
# 加载我们真正需要的state_dict 
model.load_state_dict(model_dict)  

二、全连接神经网络

1. 分类

#-*- coding: utf-8 -*-
from __future__ import division
from __future__ import print_function

import torch 
from torch.autograd import Variable 
import torch.nn.functional as F 
import matplotlib.pyplot as plt 
 
# 生成数据 
# 分别生成2组各100个数据点,增加正态噪声,后标记以y0=0 y1=1两类标签,最后cat连接到一起 
n_data = torch.ones(100,2) 
# torch.normal(means, std=1.0, out=None) 
x0 = torch.normal(2*n_data, 1) # 以tensor的形式给出输出tensor各元素的均值,共享标准差 
y0 = torch.zeros(100) 
x1 = torch.normal(-2*n_data, 1) 
y1 = torch.ones(100) 
 
x = torch.cat((x0, x1), 0).type(torch.FloatTensor) # 组装(连接) 
y = torch.cat((y0, y1), 0).type(torch.LongTensor) 
 
# 置入Variable中 
x, y = Variable(x), Variable(y) 
 
class Net(torch.nn.Module): 
  def __init__(self, n_feature, n_hidden, n_output): 
    super(Net, self).__init__() 
    self.hidden = torch.nn.Linear(n_feature, n_hidden) 
    self.out = torch.nn.Linear(n_hidden, n_output) 
 
  def forward(self, x): 
    x = F.relu(self.hidden(x)) 
    x = self.out(x) 
    return x 
 
net = Net(n_feature=2, n_hidden=10, n_output=2) 
print(net) 
 
optimizer = torch.optim.SGD(net.parameters(), lr=0.012) 
loss_func = torch.nn.CrossEntropyLoss() 
 
plt.ion() 
plt.show() 
 
for t in range(100): 
  out = net(x) 
  loss = loss_func(out, y) # loss是定义为神经网络的输出与样本标签y的差别,故取softmax前的值 
 
  optimizer.zero_grad() 
  loss.backward() 
  optimizer.step() 
 
  if t % 2 == 0: 
    plt.cla() 
    # 过了一道 softmax 的激励函数后的最大概率才是预测值 
    # torch.max既返回某个维度上的最大值,同时返回该最大值的索引值 
    prediction = torch.max(F.softmax(out), 1)[1] # 在第1维度取最大值并返回索引值 
    pred_y = prediction.data.numpy().squeeze() 
    target_y = y.data.numpy() 
    plt.scatter(x.data.numpy()[:, 0], x.data.numpy()[:, 1], c=pred_y, s=100, lw=0, cmap='RdYlGn') 
    accuracy = sum(pred_y == target_y)/200 # 预测中有多少和真实值一样 
    plt.text(1.5, -4, 'Accu=%.2f' % accuracy, fontdict={'size': 20, 'color': 'red'}) 
    plt.pause(0.1) 
 
plt.ioff() 
plt.show() 

2. 回归

#-*- coding: utf-8 -*
# 参考: https://www.jb51.net/article/139098.htm
import os
import sys
from torchsummary import summary

import torch 
from torch.autograd import Variable 
import torch.nn.functional as F 
import matplotlib.pyplot as plt 


save_folder = './'

# 将1维的数据转换为2维数据 https://blog.csdn.net/xiexu911/article/details/80820028
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1) 
print (x.size())
b = torch.rand(x.size()) 
print(b.size())
y = x.pow(2) + 0.2 
  
# 将tensor置入Variable中 
x, y = Variable(x), Variable(y) 
x, y = x.cuda(), y.cuda()
#plt.scatter(x.data.numpy(), y.data.numpy()) 
#plt.show() 
  
# 定义一个构建神经网络的类 
class Net(torch.nn.Module): # 继承torch.nn.Module类 
  def __init__(self, n_feature, n_hidden, n_output): 
    super(Net, self).__init__() # 获得Net类的超类(父类)的构造方法 
    # 定义神经网络的每层结构形式 
    # 各个层的信息都是Net类对象的属性 
    self.hidden = torch.nn.Linear(n_feature, n_hidden) # 隐藏层线性输出 
    self.predict = torch.nn.Linear(n_hidden, n_output) # 输出层线性输出 
  
  # 将各层的神经元搭建成完整的神经网络的前向通路 
  def forward(self, x): 
    x = F.relu(self.hidden(x)) # 对隐藏层的输出进行relu激活 
    x = self.predict(x) 
    return x 
  
# 定义神经网络 
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # PyTorch v0.4.0
net = Net(1, 20, 1).to(device)
print(net) # 打印输出net的结构 

# 定义优化器和损失函数 
optimizer = torch.optim.SGD(net.parameters(), lr=0.5) # 传入网络参数和学习率 
loss_function = torch.nn.MSELoss() # 最小均方误差 

# Print model architecture.
summary(net, (100, 1))
f = open(os.path.join(save_folder, 'arch.txt'), 'w')
sys.stdout = f
summary(net, (100, 1))
sys.stdout = sys.__stdout__
f.close()


# 神经网络训练过程 
plt.ion()  # 动态学习过程展示 
plt.show() 
  
for t in range(600): 
  y_pred = net(x) # 把数据x喂给net,输出预测值 
  loss = loss_function(y_pred, y) # 计算两者的误差,要注意两个参数的顺序 
  optimizer.zero_grad() # 清空上一步的更新参数值 
  loss.backward() # 误差反相传播,计算新的更新参数值 
  optimizer.step() # 将计算得到的更新值赋给net.parameters() 


  # 可视化训练过程 
  if (t+1) % 10 == 0: 
    plt.cla() 
    plt.scatter(x.data.cpu().numpy(), y.data.cpu().numpy()) 
    plt.plot(x.data.cpu().numpy(), y_pred.data.cpu().numpy(), 'r-', lw=5) 
    plt.text(-0.2, 1.1, 'L=%.4f' % loss.item(), fontdict={'size': 20, 'color': 'red'}) 
    plt.ylabel("y")
    plt.xlabel("x")
    plt.pause(0.1)
    
'''
plt 相关函数说明
1. plt.scatter(x, y, s, c ,marker, alpha)  散点图
    x,y: x轴与y轴的数据
    s: 点的面积
    c: 点的颜色
    marker: 点的形状
    alpha: 透明度
 
2. plt.plot   
   参考:https://blog.csdn.net/u014539580/article/details/78207537
'''
// An highlighted block
var foo = 'bar';
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值