pytorch实现对输入超过三通道的数据进行训练


Posted in Python onJanuary 15, 2020

案例背景:视频识别

假设每次输入是8s的灰度视频,视频帧率为25fps,则视频由200帧图像序列构成.每帧是一副单通道的灰度图像,通过pythonb里面的np.stack(深度拼接)可将200帧拼接成200通道的深度数据.进而送到网络里面去训练.

如果输入图像200通道觉得多,可以对视频进行抽帧,针对具体场景可以随机抽帧或等间隔抽帧.比如这里等间隔抽取40帧.则最后输入视频相当于输入一个40通道的图像数据了.

pytorch对超过三通道数据的加载:

读取视频每一帧,转为array格式,然后依次将每一帧进行深度拼接,最后得到一个40通道的array格式的深度数据,保存到pickle里.

对每个视频都进行上述操作,保存到pickle里.

我这里将火的视频深度数据保存在一个.pkl文件中,一共2504个火的视频,即2504个火的深度数据.

将非火的视频深度数据保存在一个.pkl文件中,一共3985个非火的视频,即3985个非火的深度数据.

数据加载

import torch 
from torch.utils import data
import os
from PIL import Image
import numpy as np
import pickle
 
class Fire_Unfire(data.Dataset):
  def __init__(self,fire_path,unfire_path):
    self.pickle_fire = open(fire_path,'rb')
    self.pickle_unfire = open(unfire_path,'rb')
    
  def __getitem__(self,index):
    if index <2504:
      fire = pickle.load(self.pickle_fire)#高*宽*通道
      fire = fire.transpose(2,0,1)#通道*高*宽
      data = torch.from_numpy(fire)
      label = 1
      return data,label
    elif index>=2504 and index<6489:
      unfire = pickle.load(self.pickle_unfire)
      unfire = unfire.transpose(2,0,1)
      data = torch.from_numpy(unfire)
      label = 0
      return data,label
    
  def __len__(self):
    return 6489
root_path = './datasets/train'
dataset = Fire_Unfire(root_path +'/fire_train.pkl',root_path +'/unfire_train.pkl')
 
#转换成pytorch网络输入的格式(批量大小,通道数,高,宽)
from torch.utils.data import DataLoader
fire_dataloader = DataLoader(dataset,batch_size=4,shuffle=True,drop_last = True)

模型训练

import torch
from torch.utils import data
from nets.mobilenet import mobilenet
from config.config import default_config
from torch.autograd import Variable as V
import numpy as np
import sys
import time
 
opt = default_config()
def train():
  #模型定义
  model = mobilenet().cuda()
  if opt.pretrain_model:
    model.load_state_dict(torch.load(opt.pretrain_model))
  
  #损失函数
  criterion = torch.nn.CrossEntropyLoss().cuda()
  
  #学习率
  lr = opt.lr
  
  #优化器
  optimizer = torch.optim.SGD(model.parameters(),lr = lr,weight_decay=opt.weight_decay)
  
  
  pre_loss = 0.0
  #训练
  for epoch in range(opt.max_epoch):
     #训练数据
    train_data = Fire_Unfire(opt.root_path +'/fire_train.pkl',opt.root_path +'/unfire_train.pkl')
    train_dataloader = data.DataLoader(train_data,batch_size=opt.batch_size,shuffle=True,drop_last = True)
    loss_sum = 0.0
    for i,(datas,labels) in enumerate(train_dataloader):
      #print(i,datas.size(),labels)
      #梯度清零
      optimizer.zero_grad()
      #输入
      input = V(datas.cuda()).float()
      #目标
      target = V(labels.cuda()).long()
      #输出
      score = model(input).cuda()
      #损失
      loss = criterion(score,target)
      loss_sum += loss
      #反向传播
      loss.backward()
      #梯度更新
      optimizer.step()      
    print('{}{}{}{}{}'.format('epoch:',epoch,',','loss:',loss))
    torch.save(model.state_dict(),'models/mobilenet_%d.pth'%(epoch+370))

RuntimeError: Expected object of scalar type Long but got scalar type Float for argument #2 'target'

解决方案:target = target.long()

以上这篇pytorch实现对输入超过三通道的数据进行训练就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python Web框架Flask下网站开发入门实例
Feb 08 Python
初步理解Python进程的信号通讯
Apr 09 Python
使用Python写个小监控
Jan 27 Python
python抓取并保存html页面时乱码问题的解决方法
Jul 01 Python
Python文本相似性计算之编辑距离详解
Nov 28 Python
pycharm的console输入实现换行的方法
Jan 16 Python
Python实现图片转字符画的代码实例
Feb 22 Python
python实现nao机器人手臂动作控制
Apr 29 Python
python清空命令行方式
Jan 13 Python
Pycharm plot独立窗口显示的操作
Dec 11 Python
详细介绍python类及类的用法
May 31 Python
python使用PySimpleGUI设置进度条及控件使用
Jun 10 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
Jan 15 #Python
pytorch构建多模型实例
Jan 15 #Python
利用Pytorch实现简单的线性回归算法
Jan 15 #Python
pytorch实现线性拟合方式
Jan 15 #Python
Python 支持向量机分类器的实现
Jan 15 #Python
pytorch-神经网络拟合曲线实例
Jan 15 #Python
Pytorch中的VGG实现修改最后一层FC
Jan 15 #Python
You might like
用php获取远程图片并把它保存到本地的代码
2008/04/07 PHP
php at(@)符号的用法简介
2009/07/11 PHP
8个PHP程序员常用的功能汇总
2014/12/18 PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
2017/07/03 PHP
PHP字典树(Trie树)定义与实现方法示例
2017/10/09 PHP
php实现等比例压缩图片
2018/07/26 PHP
PHP常见的几种攻击方式实例小结
2019/04/29 PHP
浅析jquery的js图表组件highcharts
2014/03/06 Javascript
js 去除字符串第一位逗号的方法
2014/06/07 Javascript
nodejs中使用多线程编程的方法实例
2015/03/24 NodeJs
JavaScript获取两个数组交集的方法
2015/06/09 Javascript
浅谈JavaScript中的Math.atan()方法的使用
2015/06/14 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
2015/12/15 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
2016/02/16 Javascript
Bootstrap CSS布局之列表
2016/12/15 Javascript
微信小程序  checkbox组件详解及简单实例
2017/01/10 Javascript
详解Node.js开发中的express-session
2017/05/19 Javascript
webpack学习教程之publicPath路径问题详解
2017/06/17 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
JS中实现隐藏部分姓名或者电话号码的代码
2018/07/17 Javascript
Node+OCR实现图像文字识别功能
2018/11/26 Javascript
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[55:26]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第一场 2月23日
2021/03/11 DOTA
python基础教程之获取本机ip数据包示例
2014/02/10 Python
python使用marshal模块序列化实例
2014/09/25 Python
十个Python程序员易犯的错误
2015/12/15 Python
python_opencv用线段画封闭矩形的实例
2018/12/05 Python
matplotlib实现热成像图colorbar和极坐标图的方法
2018/12/13 Python
python爬虫添加请求头代码实例
2019/12/28 Python
Holiday Inn中国官网:IHG旗下假日酒店预订
2018/04/08 全球购物
医学护理系毕业生求职信
2013/10/01 职场文书
大学生个人简历中的自我评价
2013/12/27 职场文书
函授教育个人学习的自我评价
2013/12/31 职场文书
入学生会自荐书范文
2014/02/05 职场文书
预备党员入党自我评价范文
2014/03/10 职场文书
房屋转让协议书(标准范本)
2016/03/21 职场文书