以下のコードを実行しようとしたのですが、タイトルのエラーが発生しました。
調べたところ、https://stackoverflow.com/questions/10788734/arrays-in-my-class-is-giving-me-an-error-attributeerror-set-object-has-no
を参照してエラー修正を試みたのですが解決できなかったため、教示いただけると幸いです。よろしくお願いいたします。
python
1import time 2def train_model(net,dataloader_dict,criterion,optimizer,num_epoch): 3 ##ネットワークがGPU使えるかの確認 4 ##evice~=torch.device("cuda:0" if torch.cuda is _availavle() else "cpu") 5 ##print("使用デバイス:",device) 6 ##net.to(device) 7 torch.backends.cudnn.banthmark=True 8 iteration=1 9 epoch_train_loss=0.0 10 epoch_val_loss=0.0 11 logs=[] 12 for epoch in range(num_epoch+1): 13 t_epoch_start=time.time() 14 t_iter_start=time.time() 15 print("--------------") 16 print("Epoch{}/{}".format(epoch+1,num_epochs)) 17 print("--------------") 18 for phase in ["train","val"]: 19 if phase=="traein": 20 net.train() 21 print("(train)") 22 else : 23 continue 24 for images ,targets in dataloader_dict[phase]: 25 ##image=image.to(device) 26 ##targets=[ann.to(device) for ann in targets] 27 optimizer.zero_grad() 28 with torch.set_grad_enabled(phase=="train"): 29 output=net(images) 30 loss_l,loss_c=criterion(outputs,targets) 31 loss=loss_l+loss_c 32 if phase=="train": 33 loss.backends() 34 nn.utils.clip_grad_value_( 35 net.named_parameters(),clip_value=2.0) 36 optimizer.step() 37 if (iteration%10==0): 38 t_iter_finish=time.time() 39 duration=t_iter_finish-t_iter_start 40 print("イテレーション{}|| Loss :{:.4f}||10iter:{:.4f}sec.".format(iteration,loss_item(),duration)) 41 t_iter_start=time.time() 42 epoch_train_loss+= loss_item() 43 iteration+=1 44 else: 45 epoch_val_loss+=loss.item() 46 t_epch_finish=time.time() 47 print("---------------") 48 print("epoch{}||Epoch_TRAIN_Loss:{:.4f}||Epoch_VAL_Loss:{:.4f}".format(epoch+1,epoch_train_loss,poch_val_loss)) 49 print("timer:{:.4f sec.".format(t_epoch_finisht_epoch_start)) 50 t_epoch_start=time.time() 51 log_epoch={"epoch":epoch+1,"train_loss":epoch_train_loss,"val_loss":epoch_val_loss} 52 log_append(log_epoch) 53 df=pd.DataFrame(logs) 54 df.to_csv("log_output.csv") 55 epoch_train_loss=0.0 56 epoch_val_loss=0.0 57 if ((epoch+1)%10==0): 58 torch.save(net.state_dict(),"weights/ssd300_"+str(epoch+1)+".ptr") 59 60ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 61 62--------------------------------------------------------------------------- 63AttributeError Traceback (most recent call last) 64<ipython-input-211-e7f45b0bf37c> in <module>() 65 1 66 2 num_epochs=50 67----> 3 train_model(net,dataloader_dict,criterion,optimizer,num_epochs) 68 697 frames 70/content/drive/My Drive/Colab Notebooks/pytorch_advanced/2_objectdetection/utils/ssd_model.py in __call__(self, xml_path, width, height) 71 148 72 149 # アノテーションのクラス名のindexを取得して追加 73--> 150 label_idx = self.classes.index(name) 74 151 bndbox.append(label_idx) 75 152 76 77AttributeError: 'set' object has no attribute 'index' 78 79ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 80エラー部分 81class Anno_xml2lst(object): 82 def __init__(self,classes): 83 self.classes=classes 84 def __call__(self,xml_path,width,height): 85 ret=[] 86 xml=ET.parse(xml_path).getroot() 87 for obj in xml.iter("object"): 88 difficult=int(obj.find("difficult").text) 89 if difficult==1: 90 continue 91 bndbox=[] 92 name=obj.find("name").text.lower().strip() 93 bbox=obj.find("bndbox") 94 pts=["xmin","ymin","xmax","ymax"] 95 for pt in (pts): 96 cur_pixel=int(bbox.find(pt).text)-1 97 if pt=="xmin" or pt=="xmax": 98 cur_pixel/=width 99 else: 100 cur_pixel/=height 101 bndbox.append(cur_pixel) 102 label_idx=self.classes.index(name) 103 bndbox.append(label_idx) 104 ret +=[bndbox] 105 return np.array(ret) 106 107
エラーの発生元のコードを提示ください。
また、使っているコードの出典(書籍、URL)も提示ください。
エラー発生元は下記に記載しております。
また使ってる書籍は作りながら学ぶpytorchです。
エラー部分
class Anno_xml2lst(object):
def __init__(self,classes):
self.classes=classes
def __call__(self,xml_path,width,height):
ret=[]
xml=ET.parse(xml_path).getroot()
for obj in xml.iter("object"):
difficult=int(obj.find("difficult").text)
if difficult==1:
continue
bndbox=[]
name=obj.find("name").text.lower().strip()
bbox=obj.find("bndbox")
pts=["xmin","ymin","xmax","ymax"]
for pt in (pts):
cur_pixel=int(bbox.find(pt).text)-1
if pt=="xmin" or pt=="xmax":
cur_pixel/=width
else:
cur_pixel/=height
bndbox.append(cur_pixel)
label_idx=self.classes.index(name)
bndbox.append(label_idx)
ret +=[bndbox]
return np.array(ret)
エラーメッセージで表示されている「train_model(net,dataloader_dict,criterion,optimizer,num_epochs)」
の行です。提示コードには見当たらないようです。
すなわち呼び出し元とエラー発生している「label_idx = self.classes.index(name)」とのつながりがわかるコードを提示くださいとの依頼です。
いえ、なので上記記載通りですが、一応再度記載いたします。
エラー文は下記のとおりです。エラー箇所については上記のコメント部分になります
/content/drive/My Drive/Colab Notebooks/pytorch_advanced/2_objectdetection/utils/ssd_model.py in __call__(self, xml_path, width, height)
148
149 # アノテーションのクラス名のindexを取得して追加
--> 150 label_idx = self.classes.index(name)
151 bndbox.append(label_idx)
152
AttributeError: 'set' object has no attribute 'index'
エラー文だけではなく、その発生元のコードを提示ください。一部分だけでは原因はわかりませんので。
そのコードには
「train_model(net,dataloader_dict,criterion,optimizer,num_epochs)」が含まれていると思います。
もっと直截にいえば、実行できて現象の再現するコードを提示ください、ということです。
こちらでしょうか?
ipython-input-220-497eb1e0f8f3> in train_model(net, dataloader_dict, criterion, optimizer, num_epochs)
22 else :
23 continue
---> 24 for images ,targets in dataloader_dict[phase]:
25 ##image=image.to(device)
26 ##targets=[ann.to(device) for ann in targets]
/usr/local/lib/python3.6/dist-packages/torch/utils/data/dataloader.py in __next__(self)
343
344 def __next__(self):
--> 345 data = self._next_data()
346 self._num_yielded += 1
347 if self._dataset_kind == _DatasetKind.Iterable and \
/usr/local/lib/python3.6/dist-packages/torch/utils/data/dataloader.py in _next_data(self)
383 def _next_data(self):
384 index = self._next_index() # may raise StopIteration
--> 385 data = self._dataset_fetcher.fetch(index) # may raise StopIteration
386 if self._pin_memory:
387 data = _utils.pin_memory.pin_memory(data)
/usr/local/lib/python3.6/dist-packages/torch/utils/data/_utils/fetch.py in fetch(self, possibly_batched_index)
42 def fetch(self, possibly_batched_index):
43 if self.auto_collation:
---> 44 data = [self.dataset[idx] for idx in possibly_batched_index]
45 else:
46 data = self.dataset[possibly_batched_index]
/usr/local/lib/python3.6/dist-packages/torch/utils/data/_utils/fetch.py in <listcomp>(.0)
42 def fetch(self, possibly_batched_index):
43 if self.auto_collation:
---> 44 data = [self.dataset[idx] for idx in possibly_batched_index]
45 else:
46 data = self.dataset[possibly_batched_index]
/content/drive/My Drive/Colab Notebooks/pytorch_advanced/2_objectdetection/utils/ssd_model.py in __getitem__(self, index)
238 前処理をした画像のテンソル形式のデータとアノテーションを取得
239 '''
--> 240 im, gt, h, w = self.pull_item(index)
241 return im, gt
242
/content/drive/My Drive/Colab Notebooks/pytorch_advanced/2_objectdetection/utils/ssd_model.py in pull_item(self, index)
251 # 2. xml形式のアノテーション情報をリストに
252 anno_file_path = self.anno_list[index]
--> 253 anno_list = self.transform_anno(anno_file_path, width, height)
254
255 # 3. 前処理を実施
/content/drive/My Drive/Colab Notebooks/pytorch_advanced/2_objectdetection/utils/ssd_model.py in __call__(self, xml_path, width, height)
148
149 # アノテーションのクラス名のindexを取得して追加
--> 150 label_idx = self.classes.index(name)
151 bndbox.append(label_idx)
152
AttributeError: 'set' object has no attribute 'index'
コードではなくエラーメッセージの全文のように見えますが、違いますでしょうか?
エラーの原因は(質問者が書いた)ソースコードにあるはずですが、それが提示されないと原因を特定するのは非常に難しいです。
「実行できて現象の再現するコード」を提示されると回答得られやすくなります。
質問のコードはご自身で書かれたものですか? もし参照元がある場合は提示してください。
「実行できて現象の再現するコード」が分からないです。質問の一番最初に書いた関数で定義しているtrain_modelのコードとは別のコード部分でしょうか?
コードはpytorchによる発展ディープラーニングを元にコードを書きました
質問文には関数と暮らすの定義しか書いてないですよね。関数は呼び出さないと実行されません。
実行されないと提示されたエラーも出ないと思うのですが、いかがでしょうか?
つまり「train_model」の呼び出し部分のコードを提示くださいと依頼しています。
失礼いたしました。呼び出しているコードはこちらになります
num_epochs=50
train_model(net,dataloader_dict,criterion,optimizer,num_epochs)
--------------
Epoch1/50
--------------
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-287-e7f45b0bf37c> in <module>()
1
2 num_epochs=50
----> 3 train_model(net,dataloader_dict,criterion,optimizer,num_epochs)
7 frames
/content/drive/My Drive/Colab Notebooks/pytorch_advanced/2_objectdetection/utils/ssd_model.py in __call__(self, xml_path, width, height)
148
149 # アノテーションのクラス名のindexを取得して追加
--> 150 label_idx = self.classes.index(name)
151 bndbox.append(label_idx)
152
AttributeError: 'set' object has no attribute 'index'
>コードはpytorchによる発展ディープラーニングを元にコードを書きました
であれば、ご自身で追記・改変された部分があやしいかと思います。元のコードを知らないので的外れかもしれませんが。
>label_idx=self.classes.index(name)
でのAttributeErrorであればインスタンスの初期化時のself.classes=classesで想定外のオブジェクトを渡しているのではないでしょうか?
># アノテーションのクラス名のindexを取得して追加
から推測するとリストに対するindex()の操作をしたいのでしょうか? であればsetではなくlistオブジェクトを指定すれば良さそうです。
すみません。こちらやはりわからないです。
set型は使用していませんがエラーが発生します。
setを仮に使用したらもっと早い段階でエラーが出ます。
<set型にしたとき>
class Anno_xml2list(object):
def __init__(self, classes):
self.classes = set(classes) ←変更点
def __call__(self,xml_path,width,height):
ret=[]
xml=ET.parse(xml_path).getroot()
for obj in xml.iter("object"):
difficult=int(obj.find("difficult").text)
if difficult==1:
continue
bndbox=[]
name = obj.find("name").text.lower().strip()
bbox=obj.find("bndbox")
pts=["xmin","ymin","xmax","ymax"]
for pt in (pts):
cur_pixel=int(bbox.find(pt).text)-1
if pt=="xmin" or pt=="xmax":
cur_pixel/=width
else:
cur_pixel/=height
bndbox.append(cur_pixel)
label_idx=self.classes.index(name)
bndbox.append(label_idx)
ret +=[bndbox]
return np.array(ret)
で以下を実行すると
voc_classes=["aeroplane","bycycle","bird","boat","bottle","bus","car","cat","chair","cow","diningtable","dog","horse","motorbike","person","pottedplant","sheep","sofa","train","tvmonitor"]
transform_anno=Anno_xml2list(voc_classes)
ind=1
image_file_path=val_img_list[ind]
img=cv2.imread(image_file_path)
height,width,channels=img.shape
transform_anno(val_anno_list[ind],width,height)
AttributeError: 'set' object has no attribute 'index'が発生します。
しかし、教材には
self.classes = classes
と記載されておりその後のtransform_annoも表示されます
transform_anno(val_anno_list[ind],width,height))でエラーは出ないのにepochでエラーが出るのが分かりません
Anno_xml2lstの初期化時に「self.classes=classes」の部分で何をself.classesに代入しているのか、質問のコードからは分かりません。
エラーメッセー「label_idx = self.classes.index(name)」の「AttributeError: 'set' object has no attribute 'index'」によると初期化時のclassesに問題があるのではないかと推測できます。
質問の情報からはこれ以上は分かりません。
あなたの回答
tips
プレビュー