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

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

新規登録して質問してみよう
ただいま回答率
85.39%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

Q&A

解決済

1回答

613閲覧

InvalidArgumentError: Received a label value of 128 which is outside the valid range of [0, 3). が出る

minTH

総合スコア4

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

0グッド

0クリップ

投稿2023/05/03 07:18

編集2023/05/04 02:36

実現したいこと

下記のコードに少し手を加えたものを使い、セグメンテーションを行おうとしています。

https://www.tensorflow.org/tutorials/images/segmentation?hl=ja

前提

TensorFlowでセグメンテーションを行うプログラムを作成中です。

学習枚数60枚程度のデータセットでは学習が行えましたが、
200~300枚に増加させたデータセットを使用したところ、以下のエラーが表示されて学習が進みません。

発生しているエラー(長いため一部省略しています)

Train on 232 samples, validate on 58 samples Epoch 1/10 64/232 [=======>......................] - ETA: 10s --------------------------------------------------------------------------- InvalidArgumentError Traceback (most recent call last) <ipython-input-32-a6845ad9de9a> in <module> 6 model_history = model.fit(x=train_imgarray,y=trainmask_imgarray, batch_size=BATCH_SIZE,epochs=EPOCHS, 7 steps_per_epoch=STEPS_PER_EPOCH, ----> 8 validation_split=VALIDATAION_SPILIT) 9 10 #model_history = model.fit(train_batches, epochs=EPOCHS, ~/.local/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs) 817 max_queue_size=max_queue_size, 818 workers=workers, --> 819 use_multiprocessing=use_multiprocessing) 820 821 def evaluate(self, ~/.local/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training_v2.py in fit(self, model, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs) 340 mode=ModeKeys.TRAIN, 341 training_context=training_context, --> 342 total_epochs=epochs) 343 cbks.make_logs(model, epoch_logs, training_result, ModeKeys.TRAIN) 344 ~/.local/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training_v2.py in run_one_epoch(model, iterator, execution_function, dataset_size, batch_size, strategy, steps_per_epoch, num_samples, mode, training_context, total_epochs) 126 step=step, mode=mode, size=current_batch_size) as batch_logs: 127 try: --> 128 batch_outs = execution_function(iterator) 129 except (StopIteration, errors.OutOfRangeError): 130 # TODO(kaftan): File bug about tf function and errors.OutOfRangeError? ~/.local/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training_v2_utils.py in execution_function(input_fn) 96 # `numpy` translates Tensors to values in Eager mode. 97 return nest.map_structure(_non_none_constant_value, ---> 98 distributed_function(input_fn)) 99 100 return execution_function ~/.local/lib/python3.6/site-packages/tensorflow_core/python/eager/def_function.py in __call__(self, *args, **kwds) 566 xla_context.Exit() 567 else: --> 568 result = self._call(*args, **kwds) 569 570 if tracing_count == self._get_tracing_count(): ~/.local/lib/python3.6/site-packages/tensorflow_core/python/eager/def_function.py in _call(self, *args, **kwds) 597 # In this case we have created variables on the first call, so we run the 598 # defunned version which is guaranteed to never create variables. --> 599 return self._stateless_fn(*args, **kwds) # pylint: disable=not-callable 600 elif self._stateful_fn is not None: 601 # Release the lock early so that multiple threads can perform the call ~/.local/lib/python3.6/site-packages/tensorflow_core/python/eager/function.py in __call__(self, *args, **kwargs) 2361 with self._lock: 2362 graph_function, args, kwargs = self._maybe_define_function(args, kwargs) -> 2363 return graph_function._filtered_call(args, kwargs) # pylint: disable=protected-access 2364 2365 @property ~/.local/lib/python3.6/site-packages/tensorflow_core/python/eager/function.py in _filtered_call(self, args, kwargs) 1609 if isinstance(t, (ops.Tensor, 1610 resource_variable_ops.BaseResourceVariable))), -> 1611 self.captured_inputs) 1612 1613 def _call_flat(self, args, captured_inputs, cancellation_manager=None): ~/.local/lib/python3.6/site-packages/tensorflow_core/python/eager/function.py in _call_flat(self, args, captured_inputs, cancellation_manager) 1690 # No tape is watching; skip to running the function. 1691 return self._build_call_outputs(self._inference_function.call( -> 1692 ctx, args, cancellation_manager=cancellation_manager)) 1693 forward_backward = self._select_forward_and_backward_functions( 1694 args, ~/.local/lib/python3.6/site-packages/tensorflow_core/python/eager/function.py in call(self, ctx, args, cancellation_manager) 543 inputs=args, 544 attrs=("executor_type", executor_type, "config_proto", config), --> 545 ctx=ctx) 546 else: 547 outputs = execute.execute_with_cancellation( ~/.local/lib/python3.6/site-packages/tensorflow_core/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name) 65 else: 66 message = e.message ---> 67 six.raise_from(core._status_to_exception(e.code, message), None) 68 except TypeError as e: 69 keras_symbolic_tensors = [ /usr/local/lib/python3.6/site-packages/six.py in raise_from(value, from_value) InvalidArgumentError: Received a label value of 128 which is outside the valid range of [0, 3). Label values: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (この後数字が羅列されます) ##数字の羅列の終了後## [[node loss/conv2d_transpose_4_loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits (defined at <ipython-input-31-a6845ad9de9a>:8) ]] [Op:__inference_distributed_function_15878] Function call stack: distributed_function

該当セルのソースコード

Python

1#get_index_from_data_list関数の詳細と、画像差し替え時の変更箇所 2 3def get_index_from_data_list(data_list): 4 x_rgb = [] 5 for f in data_list: 6 rgbp=np.zeros((img_size,img_size,1)) 7 image=Image.open(f) 8 imager=image.resize((img_size,img_size)) 9 rgb=np.asarray(imager) 10 11 for tate in range (0,img_size,1): 12 for yoko in range (0,img_size,1): 13 14 rgbp[tate,yoko,0]=0 15 if rgb[tate,yoko,0]>0: 16 rgbp[tate,yoko,0]=rgb[tate,yoko,0] 17 18#画像変更差し替え時には15~16行目を 19#if rgb[tate,yoko]>0: 20# rgbp[tate,yoko,0]=rgb[tate,yoko] 21#に変更しました 22 23# if rgb[tate,yoko,0]<60 and rgb[tate,yoko,1]<60: 24# rgbp[tate,yoko,0]=0 25# if rgb[tate,yoko,0]>60 and rgb[tate,yoko,1]<60: 26# rgbp[tate,yoko,0]=1 27# if rgb[tate,yoko,0]<60 and rgb[tate,yoko,1]>60: 28# rgbp[tate,yoko,0]=1 29# if rgb[tate,yoko,0]>60 and rgb[tate,yoko,1]>60: 30# rgbp[tate,yoko,0]=1 31 32#rgbp=rgbp[:,:,np.newaxis] 33 x_rgb.append(rgbp) 34 return np.stack(x_rgb) 35

Python

1#trainmask_imgarrayを作成 2 3trainmask_path = '/home/user/sample_dataset/train/mask' 4trainmask_lists = sorted(glob.glob(os.path.join(trainmask_path, '*.png'))) 5print(len(trainmask_lists)) 6#out:230 7trainmask_imgarray = get_index_from_data_list(trainmask_lists) 8print(trainmask_imgarray.shape) 9#out:(230, 256, 256, 1)

Python

1#エラー発生箇所 2 3EPOCHS = 10 4#VAL_SUBSPLITS = 1 5#VALIDATION_STEPS = info.splits['test'].num_examples//BATCH_SIZE//VAL_SUBSPLITS 6#VALIDATION_STEPS = train_n_sample//BATCH_SIZE//VAL_SUBSPLITS 7#VALIDATION_STEPS = 10 8model_history = model.fit(x=train_imgarray,y=trainmask_imgarray, batch_size=BATCH_SIZE,epochs=EPOCHS, 9 steps_per_epoch=STEPS_PER_EPOCH, 10 validation_split=VALIDATAION_SPILIT) 11 12#model_history = model.fit(train_batches, epochs=EPOCHS, 13# steps_per_epoch=STEPS_PER_EPOCH, 14# validation_steps= 15# validation_data=test_batches, 16# callbacks=[DisplayCallback()])

試したこと

デフォルトで64に設定してあるバッチサイズを、1, 10, 36, 128等に変更しましたが、エラー内容に変化はありませんでした。

また、

  • png形式で読み込んでいた学習画像をjpeg形式に変更したデータセットを使用
  • jsonファイルからマスク画像のpngファイルを作成し、データセットとして使用

以上の2つを試したところ、いずれの場合でもエラー文の
「InvalidArgumentError: Received a label value of 128 which is outside the valid range of [0, 3). 」

「InvalidArgumentError: Received a label value of 3 which is outside the valid range of [0, 2). 」
に変化しました。

学習が停止するのがバッチサイズ分の学習を終えた後なので、バッチが関係しているのかとも考えていますが、具体的な問題点が分からず行き詰まっています。

補足情報

  • Jupyter Notebook
  • Python 2.7.5
  • TensorFlow 2.6.2
  • keras 2.6.0

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

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

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

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

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

jbpb0

2023/05/03 08:00

> InvalidArgumentError: Received a label value of 128 which is outside the valid range of [0, 3). Label values: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (この後数字が羅列されます) https://www.tensorflow.org/tutorials/images/segmentation?hl=ja の「Oxford-IIIT ペットデータセットをダウンロードする」に 「セグメンテーションマスクから 1 を減算して、ラベルを {0, 1, 2} としましょう。」 とありますが、そこを変えないままで、0〜2以外のラベル(128等)を含むデータセットを使ってませんでしょうか?
minTH

2023/05/03 10:46 編集

コメントありがとうございます。 現在、リンク先にあるような方法でデータセットを取得しておらず、パスを指定して直接データセットのフォルダを読み込む形を取っています。 マスク画像はlabelmeで「background」と「target」の2種類にラベル分けしましたが、コード内で実際に読み込んでいるのはpngの画像ファイルのみであり、ラベル情報がどう読み込まれているのか不明な状態です。 ラベル情報は、pngファイルに付属しているものなのでしょうか。 または、jsonなどのラベル情報を読み込んでいない現在の方法が根本的に間違っているのでしょうか。 知識不足で申し訳ありませんが、何卒よろしくお願いいたします。
jbpb0

2023/05/03 12:52 編集

> ラベル情報がどう読み込まれているのか不明な状態です。 「model.fit(...」の「y=trainmask_imgarray」がラベルデータのはずですが、「trainmask_imgarray」はどのようにして作成されてるのでしょうか? > ラベル情報は、pngファイルに付属しているものなのでしょうか。 (普通の)入力画像とラベルデータをどちらも画像で用意する場合は、たとえば https://farml1.com/segmentation_3/#toc3 の「U-Netの学習結果」の「セマンティックセグメンテーション(AI)予測」の「Grand Truth」がラベルデータの画像です
minTH

2023/05/03 16:12

trainmask_imgarrayを作成する部分のコードを抜粋して質問のソースコード欄に追記いたしました。 また、ラベル情報については、 その後様々なサイトを調べ、jsonファイルをpngに変換したデータセットを改めて作成しました。 しかし、このデータセットを用いた場合でも同様のエラーが発生しています。
jbpb0

2023/05/04 01:42 編集

> print(trainmask_imgarray.shape) のすぐ下に下記を追加して実行して、「trainmask_imgarray」の値の範囲を確認してみてください print(trainmask_imgarray.min()) print(trainmask_imgarray.max()) > 「background」と「target」の2種類にラベル分け ならば、「trainmask_imgarray」の値の範囲は、最小が「0」で最大が「1」だと思いますが、実際にそうでしょうか? また、上記で確認した値の範囲は、ネットワーク定義で想定してるラベルの範囲と合致してますでしょうか?
minTH

2023/05/04 02:12

2文を追加し値の範囲を確認したところ, minは「0.0」,maxは「3.0」と出力されました. エラー文は 「InvalidArgumentError: Received a label value of 3 which is outside the valid range of [0, 2). 」 のため, trainmask_imgarrayの値の範囲を0.0~2.0に修正するべきであると理解しましたが,修正方法が分かりません。 何度も質問してしまい大変申し訳ございませんが、このような場合の修正方法を教えていただければ幸いです。 何卒よろしくお願いいたします。
jbpb0

2023/05/04 02:17

もう一点、 > InvalidArgumentError: Received a label value of 128 which is outside the valid range of [0, 3). と > InvalidArgumentError: Received a label value of 3 which is outside the valid range of [0, 2). で、ラベルの有効な(許容される)範囲が「[0, 3)」(0以上3未満)から「[0, 2)」(0以上2未満)に変わってますが、それは > ・png形式で読み込んでいた学習画像をjpeg形式に変更したデータセットを使用 ・jsonファイルからマスク画像のpngファイルを作成し、データセットとして使用 以上の2つを試した 「だけ」で起きたのでしょうか? ラベル画像を取り替えた「だけ」で、そこも変わったのでしょうか? ラベル画像を取り替えただけではなく、同時にネットワーク定義のラベルの範囲も変更してませんでしょうか?
minTH

2023/05/04 02:30

正確には,画像の変更と同時に,trainmask_imgarray作成のセル7行目にある「get_index_from_data_list」関数の変更も行いました. 関数のコードと変更箇所を合わせてソースコード欄に追記しておきます. 説明に不足があり申し訳ございません.
minTH

2023/05/04 02:42 編集

コードを追記いたしました. また,先ほど ・get_index_from_data_list関数の15~16行目をコード内コメントの通りに変更 ・jsonファイルからマスク画像のpngファイルを作成し、データセットとして使用 して再度プログラムを実行したところ、エラーが 「InvalidArgumentError: Received a label value of 2 which is outside the valid range of [0, 2). 」 に変化しました.
jbpb0

2023/05/04 03:34 編集

> 「get_index_from_data_list」関数の変更も行いました. それだけでしょうか? ネットワーク定義のラベルの範囲は変更してませんでしょうか? https://www.tensorflow.org/tutorials/images/segmentation?hl=ja のコードでは、ネットワーク定義のラベルの範囲は、「OUTPUT_CLASSES = 3」が model = unet_model(output_channels=OUTPUT_CLASSES) や weighted_model = unet_model(OUTPUT_CLASSES) で使われて決まってるようですが、質問者さんが実行してるコードでのそれに相当する部分は、変更してませんでしょうか?
minTH

2023/05/04 04:09

「OUTPUT_CLASSES」は「2」固定で実行しています. 今「OUTPUT_CLASSES = 3」に変更して実行したところ,エラーが 「InvalidArgumentError: Received a label value of 3 which is outside the valid range of [0, 3). 」 に変化しました.
jbpb0

2023/05/04 04:57

> 「OUTPUT_CLASSES」は「2」固定で実行しています. の場合は、現状のエラー > InvalidArgumentError: Received a label value of 3 which is outside the valid range of [0, 2). の「[0, 2)」となります この質問の当初のエラー > InvalidArgumentError: Received a label value of 128 which is outside the valid range of [0, 3). では「[0, 2)」ではなく「[0, 3)」だったのだから、その時点では > 「OUTPUT_CLASSES」は「2」固定で実行しています. ではなく、「OUTPUT_CLASSES = 3」だったはずで、実際 > 「OUTPUT_CLASSES = 3」に変更して実行したところ,エラーが 「InvalidArgumentError: Received a label value of 3 which is outside the valid range of [0, 3). 」 に変化しました. で、「[0, 3)」に戻ってますよね エラーメッセージの変化に影響するコード変更をしたなら、それもちゃんと質問に書いてください
jbpb0

2023/05/04 05:41 編集

> エラー文は 「InvalidArgumentError: Received a label value of 3 which is outside the valid range of [0, 2). 」 のため, trainmask_imgarrayの値の範囲を0.0~2.0に修正するべき 「[0, 2)」は0以上2未満なので、ラベルとして許容される値は(整数の場合は)「0」と「1」だけで、「2」はダメです > 修正方法が分かりません。 ラベルの画像を > マスク画像はlabelmeで「background」と「target」の2種類にラベル分けしました で作ったのなら、その時の手順に誤りがあったのかも 【追記】 > マスク画像はlabelmeで「background」と「target」の2種類にラベル分けしました で作成したjsonファイルを https://deecode.net/?p=581 のコードで変換したら、「background」(背景)が「0」、「target」が「1」のpngファイルが作成されませんでしょうか? それでもダメなら、ラベル画像の作り方はこの質問の範疇外だと思うので、別の質問にしてください
minTH

2023/05/04 05:15

分かりました。至らない点も多い中、何度もお答えいただきありがとうございました。
guest

回答1

0

自己解決

trainmask_imgarrayが3次元の配列なのに対し,代入する値が2次元になっていたことが原因でした。
ありがとうございました。

投稿2023/07/19 06:12

minTH

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問