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

  介绍

这篇文章主要介绍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   null

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