pytochは3チャンネル以上のデータを入力する訓練を実現します。


実例背景:ビデオ認識
入力するたびに8 sの階調映像、ビデオフレームレートが25 fpsであると仮定すると、ビデオは200フレームの画像シーケンスから構成されています。各フレームはサブシングルチャネルの階調画像であり、pythonbの中のnp.stackによって200フレームを200チャンネルの深さデータにスティッチングすることができます。
入力画像200のチャンネルが多いと、ビデオはフレームを引き出してもよく、特定のシーンに対してランダムにフレームを引き出したり、間隔を空けて40フレームを抽出したりすることができます。最後の入力映像は40チャンネルの画像データを入力するのと同じです。
pytoch対の3チャネルを超えるデータのロード:
ビデオの各フレームを読み取って、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 oject of scalar type Long but got scalar type Float for argment
解決策:target=target.long()
以上のpytouchは3チャンネル以上のデータを入力して訓練することを実現しました。つまり、小編集は皆さんに全部の内容を共有しています。参考にしてもらいたいです。どうぞよろしくお願いします。