介绍
这篇文章主要介绍pytorch如何实现对输入超过三通道的数据进行训练,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
<强>案例背景:视频识别强>
假设每次输入是8秒的灰度视频,视频帧率为25 fps,则视频由200帧图像序列构成。每帧是一副单通道的灰度图像,通过pythonb里面的np.stack(深度拼接)可将200帧拼接成200通道的深度数据,进而送到网络里面去训练。
如果输入图像200年通道觉得多,可以对视频进行抽帧,针对具体场景可以随机抽帧或等间隔抽帧。比如这里等间隔抽取40帧,则最后输入视频相当于输入一个40通道的图像数据了。
<强> pytorch对超过三通道数据的加载:强>
读取视频每一帧,转格为阵列式,然后依次将每一帧进行深度拼接,最后得到一个40通道的数组格式的深度数据,保存到泡菜里。
对每个视频都进行上述操作,保存到泡菜里。
我这里将火的视频深度数据保存在一个.pkl文件中,一共2504个火的视频,即2504个火的深度数据。
将非火的视频深度数据保存在一个.pkl文件中,一共3985个非火的视频,即3985个非火的深度数据。
<>强数据加载强>
import torch 得到torch.utils import 数据 import 操作系统 得到PIL import 形象 import numpy  as np import 泡菜 , class Fire_Unfire (data.Dataset): def 才能__init__(自我、fire_path unfire_path): ,,,self.pickle_fire =,开放(fire_path & # 39; rb # 39;) ,,,self.pickle_unfire =,开放(unfire_path & # 39; rb # 39;) ,,,, def 才能__getitem__(自我,指数): ,,,if index & lt; 2504: ,,,,,fire =, pickle.load (self.pickle_fire) #高*宽*通道 ,,,,,fire =, fire.transpose(2 0 1) #通道*高*宽 ,,,,,data =, torch.from_numpy(火) ,,,,,label =1 ,,,,,return 数据标签 ,,,elif index>=2504,以及index<6489: ,,,,,unfire =, pickle.load (self.pickle_unfire) ,,,,,unfire =, unfire.transpose (2 0 1) ,,,,,data =, torch.from_numpy (unfire) ,,,,,label =0 ,,,,,return 数据标签 ,,,, def 才能__len__(自我): ,,,return 6489年
root_path =, & # 39;。/数据/火车# 39; 时间=dataset Fire_Unfire (root_path + & # 39;/fire_train.pkl& # 39;, root_path + & # 39;/unfire_train.pkl& # 39;) , #转换成pytorch网络输入的格式(批量大小,通道数,高、宽) 得到torch.utils.data import  DataLoader fire_dataloader =, DataLoader(数据集,batch_size=4,洗牌=True, drop_last =, True)
<强>模型训练强>
import 火炬 得到torch.utils import 数据 得到nets.mobilenet import  mobilenet 得到config.config import  default_config 得到torch.autograd import  Variable as V import numpy  as np import 系统 import 时间 , 时间=opt default_config () def 火车(): #模才能型定义 时间=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 拷贝范围(opt.max_epoch): ,,,,#训练数据 ,,,train_data =, Fire_Unfire (opt.root_path + & # 39;/fire_train.pkl& # 39;, opt.root_path + & # 39;/unfire_train.pkl& # 39;) ,,,train_dataloader =, data.DataLoader (train_data batch_size=opt.batch_size,洗牌=True, drop_last =,真的) ,,,loss_sum 0.0=, ,,,for 我,(数据、标签),拷贝列举(train_dataloader): ,,,,,#打印(我datas.size(),标签) ,,,,,#梯度清零 ,,,,,optimizer.zero_grad () ,,,,,#输入 ,,,,,input =, V (datas.cuda ()) .float () ,,,,,#目标 ,,,,,target =, V (labels.cuda ()) .long () ,,,,,#输出 ,,,,,score =,模型(输入).cuda () ,,,,,#损失 ,,,,,loss =,则(得分、目标) ,,,,,loss_sum +=,损失 ,,,,,#反向传播 ,,,,,loss.backward () ,,,,,#梯度更新 ,,,,,optimizer.step (),,,,,, null nullpytorch如何实现对输入超过三通道的数据进行训练