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個の非火の深さデータです。
データロード
解決策:target=target.long()
以上のpytouchは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チャンネル以上のデータを入力して訓練することを実現しました。つまり、小編集は皆さんに全部の内容を共有しています。参考にしてもらいたいです。どうぞよろしくお願いします。