我有一个已经预处理过的数据集,但这个错误仍然出现。 我已经尝试过来自多个社区的 if__name___=='main_': 方法,但如果使用不正确,我会不断收到错误。
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "D:\anaconda\envs\mj\lib\multiprocessing\spawn.py", line 116, in spawn_main
exitcode = _main(fd, parent_sentinel)
File "D:\anaconda\envs\mj\lib\multiprocessing\spawn.py", line 126, in _main
self = reduction.pickle.load(from_parent)
AttributeError: Can't get attribute 'video_dataset' on <module '__main__' (built-in)>
这就是它的定义方式。
class video_dataset(Dataset):
def __init__(self,frame_list,sequence_length = 16,transform = None):
self.frame_list = frame_list
self.transform = transform
self.sequence_length = sequence_length
def __len__(self):
return len(self.frame_list)
def __getitem__(self,idx):
label,path = self.frame_list[idx]
img = cv2.imread(path)
seq_img = list()
for i in range(16):
img1 = img[:,128*i:128*(i+1),:]
if(self.transform):
img1 = self.transform(img1)
seq_img.append(img1)
seq_image = torch.stack(seq_img)
seq_image = seq_image.reshape(3,16,im_size,im_size)
return seq_image,decoder[label]
import torchvision
import torch
from torch import nn
import torch.nn.functional as F
import torchvision.models as models
import torch.optim as optim
import copy
import os
from tqdm.autonotebook import tqdm
import matplotlib.pyplot as plt
from torch.utils.data import Dataset
from torchvision import transforms
from torch.utils.data import DataLoader
import numpy as np
from torch.utils.data.sampler import SubsetRandomSampler
import cv2
import sys
import import_ipynb
这就是最终错误发生的地方。
from torch.autograd import Variable
iteration = 0
acc_all = list()
loss_all = list()
for epoch in range(num_epochs):
print('')
print(f"--- Epoch {epoch} ---")
phase1 = dataloaders.keys()
for phase in phase1:
print('')
print(f"--- Phase {phase} ---")
epoch_metrics = {"loss": [], "acc": []}
for batch_i, (X, y) in enumerate(dataloaders[phase]):
#iteration = iteration+1
image_sequences = Variable(X.to(device), requires_grad=True)
labels = Variable(y.to(device), requires_grad=False)
optimizer.zero_grad()
#model.lstm.reset_hidden_state()
predictions = model(image_sequences)
loss = cls_criterion(predictions, labels)
acc = 100 * (predictions.detach().argmax(1) == labels).cpu().numpy().mean()
loss.backward()
optimizer.step()
epoch_metrics["loss"].append(loss.item())
epoch_metrics["acc"].append(acc)
if(phase=='train'):
lr,mom = onecyc.calc()
update_lr(optimizer, lr)
update_mom(optimizer, mom)
batches_done = epoch * len(dataloaders[phase]) + batch_i
batches_left = num_epochs * len(dataloaders[phase]) - batches_done
sys.stdout.write(
"\r[Epoch %d/%d] [Batch %d/%d] [Loss: %f (%f), Acc: %.2f%% (%.2f%%)]"
% (
epoch,
num_epochs,
batch_i,
len(dataloaders[phase]),
loss.item(),
np.mean(epoch_metrics["loss"]),
acc,
np.mean(epoch_metrics["acc"]),
)
)
# Empty cache
if torch.cuda.is_available():
torch.cuda.empty_cache()
print('')
print('{} , acc: {}'.format(phase,np.mean(epoch_metrics["acc"])))
torch.save(model.state_dict(),'weights_crime/c3d_{}.h5'.format(epoch))
if(phase=='train'):
acc_all.append(np.mean(epoch_metrics["acc"]))
loss_all.append(np.mean(epoch_metrics["loss"]))
原始代码在这里 https://github.com/sanchit2843/Videoclassification/blob/master/train.ipynb
我也遇到过一次。
我试图在新脚本中调用数据集,并且该数据集是使用 class 自定义的并保存在磁盘上。
我修复了它,将我用于创建数据集的class添加到他们调用数据集的脚本中。
在你的情况下,我建议只复制课程:
class video_dataset(Dataset):
def __init__(self,frame_list,sequence_length = 16,transform = None):
self.frame_list = frame_list
self.transform = transform
self.sequence_length = sequence_length
def __len__(self):
return len(self.frame_list)
def __getitem__(self,idx):
label,path = self.frame_list[idx]
img = cv2.imread(path)
seq_img = list()
for i in range(16):
img1 = img[:,128*i:128*(i+1),:]
if(self.transform):
img1 = self.transform(img1)
seq_img.append(img1)
seq_image = torch.stack(seq_img)
seq_image = seq_image.reshape(3,16,im_size,im_size)
return seq_image,decoder[label]
然后将其添加到发生此错误的脚本中。
GL
我遇到了同样的问题 AttributeError: Can't get attribute XYZ on
这样做可以立即为我解决问题,希望它可以帮助任何遇到类似问题的人。