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

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

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

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Spyder

Spyderとは、Pythonで分析するために作られたIDEです。プログラムの編集・実行・入力補完・デバッグなどの基本的なIDE機能の他、科学用途の計算をするために要するライブラリも装備。公式・サードパーティ製のプラグインもあり、機能を拡張することもできます。

機械学習

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2094閲覧

SSDの学習が進まない

toyo_69

総合スコア20

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Spyder

Spyderとは、Pythonで分析するために作られたIDEです。プログラムの編集・実行・入力補完・デバッグなどの基本的なIDE機能の他、科学用途の計算をするために要するライブラリも装備。公式・サードパーティ製のプラグインもあり、機能を拡張することもできます。

機械学習

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/17 12:57

###概要

物体検出アルゴリズム(SSD:Single Shot MultBox Detecter)を学習させてみる
の記事を参考に、プログラムの中身についてはほぼ理解が出来ておりませんが、自前で用意した画像を用いて物体検出をしたいと考えております。

使用しているプログラムは
ssd_keras
を自分のPCにクローンして使用しております。

また、教師データは
The PASCAL Visual Object Classes Homepage
でダウンロードしたVOC2012のデータセットを使用して学習が出来ることを確認致しました。
(※学習に3ヶ月かかるようで学習を最後まで終えていないので、VOC2012で最後まで学習出来るかは試しておりません。)

そこで、自前で用意した10枚の画像で学習が最後まで出来るか試そうと、自前で用意した画像からxmlファイルと、それらを1つにまとめたpklファイルを作成しました。
そして、このpklファイル(ssd_keras/)や画像ファイル(ssd_keras/WEB_design/JPEGImage/)をこのSSDの訓練用ネットワークtrain.pyに渡してパラメータの学習を試みました。

すると、train.pyを実行することで学習は始まるのですが、下記のような途中の部分で停止してしまいました。(使用しているライブラリのバージョンの関係で本質問の内容におそらく関係ないと思われるWarning文が出力されてしまっておりますが、念の為、省略せずに提示しておきます。)

In [1]: runfile('/Users/user/研究/ssd_keras/train.py', wdir='/Users/user/研究/ssd_keras') Using TensorFlow backend. WARNING:tensorflow:From /Users/user/研究/ssd_keras/ssd_utils.py:37: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead. WARNING:tensorflow:From /Users/user/研究/ssd_keras/ssd_utils.py:37: The name tf.ConfigProto is deprecated. Please use tf.compat.v1.ConfigProto instead. ~~~割愛~~~ Epoch 1/100 /Users/user/研究/ssd_keras/train.py:190: DeprecationWarning: `imread` is deprecated! `imread` is deprecated in SciPy 1.0.0, and will be removed in 1.2.0. Use ``imageio.imread`` instead. img = imread(img_path).astype('float32') /Users/user/研究/ssd_keras/train.py:194: DeprecationWarning: `imresize` is deprecated! `imresize` is deprecated in SciPy 1.0.0, and will be removed in 1.3.0. Use Pillow instead: ``numpy.array(Image.fromarray(arr).resize())``. img = imresize(img, self.image_size).astype('float32') 7/8 [=========================>....] - ETA: 9s - loss: 5.2499 /Users/user/opt/anaconda3/envs/py37/lib/python3.7/site-packages/keras/utils/data_utils.py:718: UserWarning: An input could not be retrieved. It could be because a worker has died.We do not have any information on the lost sample. UserWarning)

 
また、そのまま1日ほど放置し再度コンソールを見てみると先のエラー文のすぐ下から新しく次のような出力がされておりました。

Traceback (most recent call last): File "/Users/user/研究/ssd_keras/train.py", line 258, in <module> nb_worker=1) ~~~割愛~~~ File "/Users/user/opt/anaconda3/envs/py37/lib/python3.7/site-packages/keras/engine/training_generator.py", line 365, in evaluate_generator generator_output = next(output_generator) StopIteration Error in callback <bound method AutoreloadMagics.post_execute_hook of <autoreload.AutoreloadMagics object at 0x7f8d5dd26e50>> (for post_execute): Traceback (most recent call last): File "/Users/user/opt/anaconda3/envs/py37/lib/python3.7/site-packages/IPython/extensions/autoreload.py", line 538, in post_execute_hook _, pymtime = self._reloader.filename_and_mtime(sys.modules[modname]) ~~~割愛~~~ File "<frozen importlib._bootstrap_external>", line 916, in get_data OSError: [Errno 23] Too many open files in system: '/Users/user/opt/anaconda3/envs/py37/lib/python3.7/site-packages/tensorflow_core/contrib/framework/python/ops/__init__.py'

 
以上を踏まえて、以下の2点をご教授頂きたいです。

・学習が停止してしまう原因と解決方法について
・学習を途中で停止せずに進めるには追加で出力された文のエラー

StopIteration

Error in callback <bound method AutoreloadMagics.post_execute_hook of <autoreload.AutoreloadMagics object at 0x7f8d5dd26e50>> (for post_execute):
Traceback (most recent call last):)

OSError: [Errno 23] Too many open files in system: '/Users/user/opt/anaconda3/envs/py37/lib/python3.7/site-packages/tensorflow_core/contrib/framework/python/ops/init.py'

を解決しなければいけないのでしょうか?

###やったこと
初めの出力文の最後の方の「UserWarning: An input could not be retrieved. It could be because a worker has died.We do not have any information on the lost sample.」で検索をかけてみました。

trainGenerator gets stuckという記事を見つけたので、自分のPC上で次の一文

train_generator = zip(image_generator, mask_generator)

がヒットした3つのファイル

・image_data_generator.py(/Users/user/opt/anaconda3/pkgs/keras-preprocessing-1.1.2-pyhd3eb1b0_0/site-packages/keras_preprocessing/image/image_data_generator.py)
・image.py(/Users/user/opt/anaconda3/envs/py37/lib/python3.7/site-packages/tensorflow_core/python/keras/preprocessing/image.py)
・image.py(/Users/user/opt/anaconda3/pkgs/tensorflow-base-2.0.0-mkl_py37h66b1bf0_0/lib/python3.7/site-packages/tensorflow_core/python/keras/preprocessing/image.py)

のそれぞれに1箇所ずつ含んでおりました。
これら3つのファイル全てにおいて上の一文を下記のように置換しました。

train_generator = itertools.izip(image_generator, mask_generator)

その後、train.pyを再度実行してみましたが、学習はやはり進みませんでした。(コンソールに出力されたエラー文もおそらく同じ。)

 
また、他にヒットした記事を複数読むと、この現象に陥った方の多くがGoogle Colabにおける現象のようで、その原因としてはGoogle Driveをマウントし、ドライブからデータを読み込みCNNを回していたことで、Colabolatoryのファイルストリームが学習速度に追いついていないということが原因のようでした。(→参考

つまりその解決方法としては使用する教師データセットを全てローカルに保存するというものなのですが、私の場合、使用している教師データセット(VOC2012や自前データセット)は全て私のPC内に保存しているものなので、私の状況においてはこの方法が有効な解決法とはなりませんでした。

###環境など
PC:MacOS BigSur11.6
プロセッサ:3.1 GHz デュアルコアIntel Core i5
IDE:Anaconda spyder=5.0.5
AnacondaのPython環境:Python3.7.11

上記の環境下において道中のエラーの解決を含め手動でインストールした主要なライブラリのバージョンは現在以下の通りです。

  • keras=2.3.1
  • opencv=3.4.2
  • scipy=1.2.0
  • tensorflow=1.15.0
  • tensorflow-estimator=1.15.1

また、ssd_kerasのフルパスは

/Users/user/研究/ssd_keras

となっております。

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

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

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

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

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

jbpb0

2021/10/18 01:22 編集

> An input could not be retrieved. It could be because a worker has died.We do not have any information on the lost sample. https://stackoverflow.com/questions/58446290/userwarning-an-input-could-not-be-retrieved-it-could-be-because-a-worker-has の回答の中に、「I got this warning when I was training on the amount of data samples that was smaller than the batch size.」というのがありました 学習時のバッチサイズは、いくつで実行してますでしょうか? たぶん、コード中の「gen = Generator(...」の三つ目の引数 もしそれが、学習データ数よりも大きい(あるいは同じくらい)なら、それを学習データ数よりも明らかに小さくなるように(学習データ数の半分以下とか)変えるか、逆に学習データ数をもっと増やしてみてください > 自前で用意した10枚の画像で学習が最後まで出来るか試そうと、 実際の学習データ数は、コード中で計算されてる「num_train」だから、10よりも少ないですよね (8かな?) あと、念の為に、「num_val」が0になってないかも確認した方がいいかも (この質問のエラーとは関係無いかもしれませんが)
toyo_69

2021/10/18 07:12

jbpb0様、前回に引き続きご回答頂き、誠にありがとうございます! > 学習時のバッチサイズは、いくつで実行してますでしょうか? たぶん、コード中の「gen = Generator(...」の三つ目の引数 もしそれが、学習データ数よりも大きい(あるいは同じくらい)なら、それを学習データ数よりも明らかに小さくなるように(学習データ数の半分以下とか)変えるか、逆に学習データ数をもっと増やしてみてください train.pyの「gen = Generator(...」の三つ目の引数を見てみると「4」でした。なので20や200と変更してみてtrain.pyを実行してみました。するとEpoch 1/100のすぐ直下に Epoch 1/100 /Users/user/opt/anaconda3/envs/py37/lib/python3.7/site-packages/keras/utils/data_utils.py:718: UserWarning: An input could not be retrieved. It could be because a worker has died.We do not have any information on the lost sample. と出力され、同様に学習が進みませんでした。 一方でバッチサイズを「2」と変更して同様に実行してみたところ、学習が最後まで進み、train.pyの最終的な出力である学習済みのパラメータファイルを生成することに成功しました! ご共有いただいたサイトの「I got this warning when I was training on the amount of data samples that was smaller than the batch size.」というコメントを見るからに、バッチサイズよりも学習データ数が少ないとこのWarning文が出るようですが、元々私の環境ではバッチサイズは4で学習データ数は10やら8でしたのでこのWarning文が出る条件は満たされていなかったように思えます。 最終的にバッチサイズを4から2に変更したので、やったこととしてはバッチサイズをさらに少なくするという、記事とは全く逆の行為なんですよね。何故これで上手くいったのでしょうか? > 実際の学習データ数は、コード中で計算されてる「num_train」だから、10よりも少ないですよね (8かな?) あと、念の為に、「num_val」が0になってないかも確認した方がいいかも (この質問のエラーとは関係無いかもしれませんが) 私のtrain.pyの gt = pickle.load(open('WEBdesign.pkl', 'rb')) keys = sorted(gt.keys()) num_train = int(round(0.8 * len(keys))) train_keys = keys[:num_train] val_keys = keys[num_train:] num_val = len(val_keys) の部分のコードを見るに、渡しているpklファイルのkey数が10なので、num_trainは8ですね。また、おそらくnum_valは2になっているかと思われます。
jbpb0

2021/10/18 08:16 編集

> 最終的にバッチサイズを4から2に変更したので、やったこととしてはバッチサイズをさらに少なくするという、記事とは全く逆の行為なんですよね。 そうではないです 「I got this warning when I was training on the amount of data samples that was smaller than the batch size.」→「データ数 < バッチサイズ で警告が出た」 ですから、「データ数 ≧ バッチサイズ なら警告は出ないだろう」となり、対策としては ・データ数を増やす ・バッチサイズを減らす になります バッチサイズを4→2で学習できたということは、増減の方向は上記と合ってます > 元々私の環境ではバッチサイズは4で学習データ数は10やら8でしたのでこのWarning文が出る条件は満たされていなかったように思えます。 確かにそうですので、その回答を書いた人は、少しずつバッチサイズまたはデータ数を変えてどこでエラー出なくなるのかをちゃんと確認したのではなく、どちらかを大きく変えて大丈夫になった、ということなのかもしれません 質問者さんのケースで例えると、学習データ数が8の場合に、バッチサイズが16でダメだったとして、バッチサイズを2に変えたら大丈夫になり、その結果だけを見て、バッチサイズがデータ数8よりも大きいとダメで、小さければ大丈夫、と書いてしまった、みたいな (これはあくまでも例えです)
jbpb0

2021/10/18 07:46 編集

あるいは、 > 渡しているpklファイルのkey数が10なので、num_trainは8ですね。また、おそらくnum_valは2になっているかと思われます。 もしかしたら、「num_val」がバッチサイズ=4よりも小さいからダメなのかも その場合は、総データ数10をtrainとvalに分ける比を0.5:0.5に変えてみて、「num_val」が5になれば、バッチサイズ4でもいけるような (これはあくまでもエラー原因の確認のためで、本番も0.5:0.5でやるのを勧めているのではありません)
toyo_69

2021/10/18 15:23

> そうではないです 「I got this warning when I was training on the amount of data samples that was smaller than the batch size.」→「データ数 < バッチサイズ で警告が出た」 ですから、「データ数 ≧ バッチサイズ なら警告は出ないだろう」となり、対策としては ・データ数を増やす ・バッチサイズを減らす になります バッチサイズを4→2で学習できたということは、増減の方向は上記と合ってます 勝手に勘違いしていたようです。大変失礼致しました。 > もしかしたら、「num_val」がバッチサイズ=4よりも小さいからダメなのかも その場合は、総データ数10をtrainとvalに分ける比を0.5:0.5に変えてみて、「num_val」が5になれば、バッチサイズ4でもいけるような (これはあくまでもエラー原因の確認のためで、本番も0.5:0.5でやるのを勧めているのではありません) ご指摘の通り、実際に num_train = int(round(0.5 * len(keys))) gen = Generator(gt, bbox_util, 4, path_prefix, train_keys, val_keys, (input_shape[0], input_shape[1]), do_crop=False) のようにnum_val ≧ バッチサイズとなるようにして実行してみても学習が途中で止まることは無く、 逆に、同様にしてnum_val < バッチサイズとなるように調整して実行してみると学習が止まることが確認できました。 なのでやはりnum_val < バッチサイズとなる状態で学習が進まなくなるようです! 改めまして前回に続けて様々なご意見を述べて頂き、ありがとうございました。大変助かります! これからはヒットした記事の細かい部分まで見逃さないようにしたいと思います。 では是非jbpb0様のご回答をベストアンサーとさせて頂くのでご回答の程、お願いいたします。
guest

回答1

0

ベストアンサー

An input could not be retrieved. It could be because a worker has died.We do not have any information on the lost sample.

UserWarning: An input could not be retrieved. It could be because a worker has died. We do not have any information on the lost sample.
の回答の中に、「I got this warning when I was training on the amount of data samples that was smaller than the batch size.」というのがありました
学習に用いるデータ数がバッチサイズよりも小さいと、そうなるようです

コード中の「gen = Generator(...」の三つ目の引数がバッチサイズですが、コード中で計算されてる「num_train」と「num_val」の両方がバッチサイズ以上になるように、設定してみてください

投稿2021/10/19 09:02

jbpb0

総合スコア7653

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問