質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

1回答

1178閲覧

学習済みモデルでの未知データに対しての推論[FileNotFoundError: [Errno 2] No such file or directory: './test_data/filename]

mmmw

総合スコア23

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2021/06/29 12:30

前提・実現したいこと

画像機械学習の写経をやってみました。
モデル作成後、未知データに対しての推論を行う過程が上手くいっていません。

学習済みモデルで未知データ推論時に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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2021/06/29 21:59

エラーメッセージが「[FileNotFoundError: [Errno 2] No such file or directory: './test_data/filename]」とのことですが、「./test_data/filename」は存在しているのでしょうか?
mmmw

2021/06/30 08:03

確認したところ存在していませんでした。 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などに(各画像データのファイル名)したいです。
mmmw

2021/06/30 08:04

def __getitem__(self, index): file = self.df['filename'][index] image = Image.open('./test_data/' + file) <-----ここで上手くpathが作れていない? image = self.data_transform(image) return file,image 上記の部分をどのように修正すればよろしいでしょうか?
meg_

2021/06/30 08:56

ファイル名は「self.df['filename'][index]」で設定されてますよね? データフレームの中身および元のファイル'./df_test.csv'は確認されましたか?
mmmw

2021/06/30 09:32

'./df_test.csv'の中身は下記のようになっています。 filename 1009937.jpeg 109996.jpeg 119892.jpeg 129893.jpeg .....
mmmw

2021/06/30 09:45 編集

#学習済みモデルでの未知データに対しての推論 のブロックを実行したときに出る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'
meg_

2021/06/30 10:20

おそらくですが、「self.df = pd.read_csv('./df_test.csv',names=['filename','target'])」の「names=['filename','target']」の部分とcsvファイルのヘッダー部分とが重複しているのが原因だと思います。
mmmw

2021/06/30 10:42

ご丁寧に教えていただきありがたいのですが、知識がないもので 今回の場合はどのようにコード修正すべきか教えていただけないでしょうか...
mmmw

2021/06/30 10:58

csvのヘッダ部分(fnameに変更)と,names=[filename]の部分を書き換えても同じerrorとなってしまいました...
meg_

2021/06/30 11:18

csvファイルを変更しても良いのであれば、ヘッダ行(filename)を削除すれば良いと思います。
mmmw

2021/06/30 11:25

#カラム削除 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
mmmw

2021/06/30 11:27

下記のような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
mmmw

2021/06/30 12:23

無事に解決しました。 ご丁寧にありがとうございました。
guest

回答1

0

自己解決

上記コメントにより解決

投稿2021/07/01 10:13

mmmw

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問