tf.keras.metrics.IoUでIoUを計算したい

実現したいこと

tf.keras.metrics.IoUでIoUを計算したい

前提

Tensorflow + kerasでUnetを用いて医用画像のセマンティックセグメンテーションを行っているのですが,評価関数IoUがうまく計算できないです.
以下のように活性化関数をAdam,損失関数を交差エントロピー,評価関数をaccuracyとIoUにしているのですが,エポック1〜100のすべてでIoUが0.6667と表示されます.
数値が低く出るのならまだしも,全く同じ値となるので混乱しています.
最終的にlossは0.0070,accは0.9987となりIoU以外は問題ない値が出るため,モデルやデータセットは問題ないのかなと思っています.

行っているセグメンテーションとしては以下の画像のように,腹部のCT画像から背骨部分のみを検出するというものです.イメージ説明イメージ説明
また,訓練用データtrain.images_originalとtrain.images_segmentedのサイズは(130,256,256,3)で検証データvalid.images_originalとvalid.images_segmentedのサイズは(33,256,256,3)です.

評価関数にIoUを使うのは初めてなので,tf.keras.metrics.IoUの使い方が間違えている等初歩的なミスがあるかと思いますが,ご教授よろしくお願いします.

該当のソースコード

Python

1IoU = tf.keras.metrics.IoU(num_classes=2, target_class_ids=[0])2model_unet.compile(optimizer = 'adam',3 loss = 'binary_crossentropy',4 metrics = ['accuracy',IoU])5 6history = model_unet.fit(train.images_original,train.images_segmented,7 batch_size = 32,8 epochs = 100,9 shuffle = True,10 validation_data = (valid.images_original,valid.images_segmented))

実行結果(学習部分)

Epoch 1/100 2023-07-01 04:52:56.776428: E tensorflow/core/grappler/optimizers/meta_optimizer.cc:954] layout failed: INVALID_ARGUMENT: Size of values 0 does not match size of permutation 4 @ fanin shape indropout/cond/dropout/SelectV2-2-TransposeNHWCToNCHW-LayoutOptimizer 2023-07-01 04:53:01.245869: I tensorflow/compiler/xla/stream_executor/cuda/cuda_dnn.cc:424] Loaded cuDNN version 8900 2023-07-01 04:53:10.668379: I tensorflow/compiler/xla/stream_executor/cuda/cuda_blas.cc:637] TensorFloat-32 will be used for the matrix multiplication. This will only be logged once. 130/130 [==============================] - ETA: 0s - loss: 0.6533 - acc: 0.6359 - io_u: 0.6667/usr/local/lib/python3.10/dist-packages/keras/engine/training_v1.py:2335: UserWarning: `Model.state_updates` will be removed in a future version. This property should not be used in TensorFlow 2.0, as `updates` are applied automatically. updates = self.state_updates 2023-07-01 04:54:48.501025: W tensorflow/c/c_api.cc:300] Operation '{name:'loss/mul' id:1374 op device:{requested: '', assigned: ''} def:{{{node loss/mul}} = Mul[T=DT_FLOAT, _has_manual_control_dependencies=true](loss/mul/x, loss/output_conv_loss/value)}}' was changed by setting attribute after it was run by a session. This mutation will have no effect, and will trigger an error in the future. Either don't modify nodes after running them or create a new session. Epoch 2/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.4199 - acc: 0.9553 - io_u: 0.6667 - val_loss: 112.0155 - val_acc: 0.0155 - val_io_u: 0.0272 Epoch 3/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.3436 - acc: 0.9852 - io_u: 0.6667 - val_loss: 22.9034 - val_acc: 0.0190 - val_io_u: 0.3599 Epoch 4/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.2904 - acc: 0.9921 - io_u: 0.6667 - val_loss: 1.9417 - val_acc: 0.2841 - val_io_u: 0.6667 Epoch 5/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.2446 - acc: 0.9934 - io_u: 0.6667 - val_loss: 1.8819 - val_acc: 0.0783 - val_io_u: 0.6667 Epoch 6/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.2115 - acc: 0.9932 - io_u: 0.6667 - val_loss: 2.8457 - val_acc: 0.1454 - val_io_u: 0.6667 Epoch 7/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.1866 - acc: 0.9942 - io_u: 0.6667 - val_loss: 1.5594 - val_acc: 0.0400 - val_io_u: 0.6667 Epoch 8/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.1662 - acc: 0.9942 - io_u: 0.6667 - val_loss: 0.7763 - val_acc: 0.5498 - val_io_u: 0.6667 Epoch 9/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.1492 - acc: 0.9947 - io_u: 0.6667 - val_loss: 0.5558 - val_acc: 0.8383 - val_io_u: 0.6667 Epoch 10/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.1362 - acc: 0.9947 - io_u: 0.6667 - val_loss: 0.5804 - val_acc: 0.8604 - val_io_u: 0.6667 Epoch 11/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.1256 - acc: 0.9947 - io_u: 0.6667 - val_loss: 0.8566 - val_acc: 0.3761 - val_io_u: 0.6667 Epoch 12/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.1156 - acc: 0.9946 - io_u: 0.6667 - val_loss: 0.4547 - val_acc: 0.8263 - val_io_u: 0.6667 Epoch 13/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.1072 - acc: 0.9947 - io_u: 0.6667 - val_loss: 0.3453 - val_acc: 0.9417 - val_io_u: 0.6667 Epoch 14/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.1011 - acc: 0.9949 - io_u: 0.6667 - val_loss: 0.4234 - val_acc: 0.9003 - val_io_u: 0.6655 Epoch 15/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.0946 - acc: 0.9944 - io_u: 0.6667 - val_loss: 0.2232 - val_acc: 0.9800 - val_io_u: 0.6667 Epoch 16/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.0882 - acc: 0.9948 - io_u: 0.6667 - val_loss: 0.1898 - val_acc: 0.9860 - val_io_u: 0.6667 Epoch 17/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.0820 - acc: 0.9950 - io_u: 0.6667 - val_loss: 0.1604 - val_acc: 0.9963 - val_io_u: 0.6667 Epoch 18/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.0756 - acc: 0.9951 - io_u: 0.6667 - val_loss: 0.1657 - val_acc: 0.9859 - val_io_u: 0.6667 Epoch 19/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.0696 - acc: 0.9962 - io_u: 0.6667 - val_loss: 0.1530 - val_acc: 0.9812 - val_io_u: 0.6667 Epoch 20/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.0664 - acc: 0.9961 - io_u: 0.6667 - val_loss: 0.1651 - val_acc: 0.9626 - val_io_u: 0.6667 ...(省略) Epoch 91/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.0093 - acc: 0.9981 - io_u: 0.6667 - val_loss: 0.0259 - val_acc: 0.9936 - val_io_u: 0.6667 Epoch 92/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.0088 - acc: 0.9983 - io_u: 0.6667 - val_loss: 0.0263 - val_acc: 0.9932 - val_io_u: 0.6667 Epoch 93/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.0077 - acc: 0.9987 - io_u: 0.6667 - val_loss: 0.0198 - val_acc: 0.9959 - val_io_u: 0.6667 Epoch 94/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.0076 - acc: 0.9987 - io_u: 0.6667 - val_loss: 0.0215 - val_acc: 0.9952 - val_io_u: 0.6667 Epoch 95/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.0074 - acc: 0.9987 - io_u: 0.6667 - val_loss: 0.0192 - val_acc: 0.9944 - val_io_u: 0.6667 Epoch 96/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.0074 - acc: 0.9987 - io_u: 0.6667 - val_loss: 0.0171 - val_acc: 0.9961 - val_io_u: 0.6667 Epoch 97/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.0069 - acc: 0.9989 - io_u: 0.6667 - val_loss: 0.0227 - val_acc: 0.9958 - val_io_u: 0.6667 Epoch 98/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.0071 - acc: 0.9988 - io_u: 0.6667 - val_loss: 0.0226 - val_acc: 0.9943 - val_io_u: 0.6667 Epoch 99/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.0069 - acc: 0.9988 - io_u: 0.6667 - val_loss: 0.0791 - val_acc: 0.9716 - val_io_u: 0.6667 Epoch 100/100 130/130 [==============================] - 1s 11ms/sample - loss: 0.0070 - acc: 0.9987 - io_u: 0.6667 - val_loss: 0.0280 - val_acc: 0.9922 - val_io_u: 0.6667

やってみたこと

tf.keras.metrics.IoUの引数num_classesを3や4に変えても結果は同じでした.
また,試しにtf.keras.metrics.IoUをtf.keras.metrics.MeanIoU(num_classes=2)に変えて実行してみたところ,全てのエポックで値が0.3332となりました.

補足情報

Google Colabで実行しています

コメントを投稿

0 コメント