前提・実現したいこと
画像機械学習の写経をやってみました。
モデル作成後、未知データに対しての推論を行う過程が上手くいっていません。
学習済みモデルで未知データ推論時にerror発生。
どなたか詳しい方、解決策を教えて下さい。
発生している問題・エラーメッセージ
[FileNotFoundError: [Errno 2] No such file or directory: './test_data/filename]
該当のソースコード
python
1#推論用データセット作成【transforms】 2# ライブラリのインポート 3from torchvision import transforms 4 5# 推論用のtransforms作成 6test_transforms = transforms.Compose([ 7 transforms.Resize(256), 8 transforms.ToTensor(), 9 transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), 10 ]) 11 12 13 14 15#推論用データセット作成【Dataset】 16# dataset作成 17class Test_Datasets(Dataset): 18 19 def __init__(self, data_transform): 20 21 self.df = pd.read_csv('./df_test.csv',names=['filename','target']) 22 self.data_transform = data_transform 23 24 def __len__(self): 25 return len(self.df) 26 27 def __getitem__(self, index): 28 29 file = self.df['filename'][index] 30 image = Image.open('./test_data/' + file) <-----ここで上手くpathが作れていない? 31 image = self.data_transform(image) 32 33 return file,image 34 35 36 37#推論用データセット作成【DataLoader】 38# datasetのインスタンス作成 39#推論用データのアノテーションを行っている。 40test_dataset = Test_Datasets(data_transform=test_transforms) 41 42# dataloader作成 43test_dataloader = torch.utils.data.DataLoader(dataset=test_dataset, 44 batch_size= 1 , 45 shuffle= False , 46 num_workers= 0 , 47 drop_last= True ) 48 49 50 51#学習済みモデルのロード 52DEVICE= "cpu" 53def get_model(target_num,isPretrained=False): 54 model_ft = models.resnet18(pretrained=isPretrained) 55 model_ft.fc = nn.Linear(512, target_num) 56 model_ft = model_ft.to(DEVICE) 57 return model_ft 58 59best_model = get_model(target_num=2) 60 61# モデルを保存する 62filename = './original_model_39.pth' 63pickle.dump(best_model, open(filename, 'wb')) 64 65# 保存したモデルをロードする 66loaded_model = pickle.load(open(filename, 'rb')) 67 68 69 70 71#学習済みモデルでの未知データに対しての推論 <-----------このブロック実行時にerror 72pred = [] 73# データの取り出し 74for i,(inputs, labels) in enumerate(test_dataloader): 75 inputs = inputs.to(DEVICE) 76 # 学習済みモデルを推論モードに設定 77 loaded_model.eval() 78 # 学習済みモデルにデータをインプットし、推論をさせる 79 outputs = loaded_model(inputs) 80 # アウトプットから推定されたラベルを取得 81 _, preds = torch.max(outputs, 1) 82 # 事前に用意したリストに推論結果(0 or 1)を格納 83 pred.append(preds.item()) 84df_test['pred'] = pred 85
エラーメッセージが「[FileNotFoundError: [Errno 2] No such file or directory: './test_data/filename]」とのことですが、「./test_data/filename」は存在しているのでしょうか?
確認したところ存在していませんでした。
filename
0 1009937.jpeg
1 109996.jpeg
2 119892.jpeg
3 129893.jpeg
4 139981.jpeg
... ...
95 969983.jpeg
96 979891.jpeg
97 989921.jpeg
98 99851.jpeg
99 999921.jpeg
test_dataには上記のように画像データが入っています。
filenemeの部分を999921などに(各画像データのファイル名)したいです。
def __getitem__(self, index):
file = self.df['filename'][index]
image = Image.open('./test_data/' + file) <-----ここで上手くpathが作れていない?
image = self.data_transform(image)
return file,image
上記の部分をどのように修正すればよろしいでしょうか?
ファイル名は「self.df['filename'][index]」で設定されてますよね?
データフレームの中身および元のファイル'./df_test.csv'は確認されましたか?
'./df_test.csv'の中身は下記のようになっています。
filename
1009937.jpeg
109996.jpeg
119892.jpeg
129893.jpeg
.....
#学習済みモデルでの未知データに対しての推論
のブロックを実行したときに出るerorr全体です。
file = self.df['filename'][index] の部分に問題があると考えていますが...
------------------------------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-256-2060317a50ca> in <module>
2
3 # データの取り出し
----> 4 for i,(inputs, labels) in enumerate(test_dataloader):
5
6 inputs = inputs.to(DEVICE)
C:\Anaconda\lib\site-packages\torch\utils\data\dataloader.py in __next__(self)
519 if self._sampler_iter is None:
520 self._reset()
--> 521 data = self._next_data()
522 self._num_yielded += 1
523 if self._dataset_kind == _DatasetKind.Iterable and \
C:\Anaconda\lib\site-packages\torch\utils\data\dataloader.py in _next_data(self)
559 def _next_data(self):
560 index = self._next_index() # may raise StopIteration
--> 561 data = self._dataset_fetcher.fetch(index) # may raise StopIteration
562 if self._pin_memory:
563 data = _utils.pin_memory.pin_memory(data)
C:\Anaconda\lib\site-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]
C:\Anaconda\lib\site-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]
<ipython-input-254-db3ba497ceb4> in __getitem__(self, index)
28
29 file = self.df['filename'][index]
---> 30 image = Image.open('./test_data/' + file)
31 image = self.data_transform(image)
32
C:\Anaconda\lib\site-packages\PIL\Image.py in open(fp, mode, formats)
2910
2911 if filename:
-> 2912 fp = builtins.open(filename, "rb")
2913 exclusive_fp = True
2914
FileNotFoundError: [Errno 2] No such file or directory: './test_data/filename'
おそらくですが、「self.df = pd.read_csv('./df_test.csv',names=['filename','target'])」の「names=['filename','target']」の部分とcsvファイルのヘッダー部分とが重複しているのが原因だと思います。
ご丁寧に教えていただきありがたいのですが、知識がないもので
今回の場合はどのようにコード修正すべきか教えていただけないでしょうか...
csvのヘッダ部分(fnameに変更)と,names=[filename]の部分を書き換えても同じerrorとなってしまいました...
csvファイルを変更しても良いのであれば、ヘッダ行(filename)を削除すれば良いと思います。
#カラム削除
df_test = df_test.rename(columns={0: ''})
df_test
# dataset作成変更
class Test_Datasets(Dataset):
def __init__(self, data_transform):
#csvファイルの指定カラムを読み取ってDataFrameに変換
#self.df = pd.read_csv('./df_test.csv',names=['filename'])
self.df = pd.read_csv('./df_test.csv')
self.data_transform = data_transform
def __len__(self):
return len(self.df)
def __getitem__(self, index):
#file = self.df['filename'][index]
file = self.df[index]
image = Image.open('./test_data/')
image = self.data_transform(image)
return file,image
下記のようなerrorに変わりました...
----------------------------------------------------------------------------------------------
KeyError Traceback (most recent call last)
C:\Anaconda\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
3079 try:
-> 3080 return self._engine.get_loc(casted_key)
3081 except KeyError as err:
pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
KeyError: 0
The above exception was the direct cause of the following exception:
KeyError Traceback (most recent call last)
<ipython-input-316-2060317a50ca> in <module>
2
3 # データの取り出し
----> 4 for i,(inputs, labels) in enumerate(test_dataloader):
5
6 inputs = inputs.to(DEVICE)
C:\Anaconda\lib\site-packages\torch\utils\data\dataloader.py in __next__(self)
519 if self._sampler_iter is None:
520 self._reset()
--> 521 data = self._next_data()
522 self._num_yielded += 1
523 if self._dataset_kind == _DatasetKind.Iterable and \
C:\Anaconda\lib\site-packages\torch\utils\data\dataloader.py in _next_data(self)
559 def _next_data(self):
560 index = self._next_index() # may raise StopIteration
--> 561 data = self._dataset_fetcher.fetch(index) # may raise StopIteration
562 if self._pin_memory:
563 data = _utils.pin_memory.pin_memory(data)
C:\Anaconda\lib\site-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]
C:\Anaconda\lib\site-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]
<ipython-input-313-aad542a6f168> in __getitem__(self, index)
23
24 #file = self.df['filename'][index]
---> 25 file = self.df[index]
26 image = Image.open('./test_data/')
27 image = self.data_transform(image)
C:\Anaconda\lib\site-packages\pandas\core\frame.py in __getitem__(self, key)
3022 if self.columns.nlevels > 1:
3023 return self._getitem_multilevel(key)
-> 3024 indexer = self.columns.get_loc(key)
3025 if is_integer(indexer):
3026 indexer = [indexer]
C:\Anaconda\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
3080 return self._engine.get_loc(casted_key)
3081 except KeyError as err:
-> 3082 raise KeyError(key) from err
3083
3084 if tolerance is not None:
KeyError: 0
無事に解決しました。
ご丁寧にありがとうございました。
回答1件
あなたの回答
tips
プレビュー