質問編集履歴
5
質問内容に補足説明を記載しました.
title
CHANGED
File without changes
|
body
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
chainerを使用して画像のセグメンテーションを行いたいと考えています.
|
3
3
|
しかし,エラーが出てしまい,上手くいきません.
|
4
4
|
セグメンテーションはここ([リンク内容](https://japan-medical-ai.github.io/medical-ai-course-materials/notebooks/Image_Segmentation.html))を参考にしてコードを書きました.
|
5
|
-
今回は参考とは異なり,自分で学習データを用意,作成し,3クラス分類(物体A,物体B,その他)を試みています.入力画像と正解画像はそれぞれアルファチャンネル無しの3チャンネル画像です.
|
5
|
+
今回は参考とは異なり,自分で学習データを用意,作成し,3クラス分類(物体A,物体B,その他)を試みています.入力画像と正解画像はそれぞれアルファチャンネル無しの3チャンネル画像ですが,正解画像はインデックスカラー画像になっており,プログラムで読み込んだ際はshapeが(1, 512, 512)でした.
|
6
6
|
chainerは初めて扱うので解決策が分からず困っています.
|
7
7
|
文字数制限があるためエラー(?)のtraceback以下は省略します.
|
8
8
|
分かる方いらっしゃいましたらご教授願います.
|
4
質問内容に補足説明を記載しました.
title
CHANGED
File without changes
|
body
CHANGED
@@ -19,9 +19,9 @@
|
|
19
19
|
Expect: t.ndim == x.ndim - 1
|
20
20
|
Actual: 4 != 3
|
21
21
|
```
|
22
|
-
SoftmaxCrossEntropyに代入する変数の次元が異なるということだと思うのですが,どこに四次元のものが出てきているのかわからないでいます.
|
23
22
|
確認の為SoftmaxCrossEntropyの変数であるy_outとtの型を.shapeで確認したのですが,
|
24
23
|
y_out=(バッチ数, 3, 512, 512) t=(バッチ数, 1, 512, 512)となっていました.
|
24
|
+
tが3次元の入力を求めているようですが,4次元のどの次元を削除(?)して3次元に変換する必要があるのでしょうか?
|
25
25
|
### 該当のソースコード
|
26
26
|
|
27
27
|
```python
|
3
質問内容に補足説明を記載しました.
title
CHANGED
File without changes
|
body
CHANGED
File without changes
|
2
質問内容に補足説明を記載しました.
title
CHANGED
File without changes
|
body
CHANGED
@@ -19,7 +19,9 @@
|
|
19
19
|
Expect: t.ndim == x.ndim - 1
|
20
20
|
Actual: 4 != 3
|
21
21
|
```
|
22
|
-
|
22
|
+
SoftmaxCrossEntropyに代入する変数の次元が異なるということだと思うのですが,どこに四次元のものが出てきているのかわからないでいます.
|
23
|
+
確認の為SoftmaxCrossEntropyの変数であるy_outとtの型を.shapeで確認したのですが,
|
24
|
+
y_out=(バッチ数, 3, 512, 512) t=(バッチ数, 1, 512, 512)となっていました.
|
23
25
|
### 該当のソースコード
|
24
26
|
|
25
27
|
```python
|
@@ -39,7 +41,6 @@
|
|
39
41
|
|
40
42
|
def transform(data):
|
41
43
|
"""ラベルデータの値を整数値に変換"""
|
42
|
-
data = data[:3, ...]
|
43
44
|
data = data.astype(np.int32)
|
44
45
|
return data
|
45
46
|
|
@@ -115,7 +116,8 @@
|
|
115
116
|
def __call__(self, inputimg, t):
|
116
117
|
"""まずは学習対象のモデルで推論を行う"""
|
117
118
|
y_out = self.predictor(inputimg)
|
119
|
+
#ここで型を確認したが四次元のものはなかった.
|
118
|
-
print(y_out.
|
120
|
+
print("y", y_out.shape, "t", t.shape)
|
119
121
|
|
120
122
|
loss = F.softmax_cross_entropy(y_out, t)
|
121
123
|
|
1
編集前のエラーは解決しましたが新しくエラーが出たのでエラー内容とコードの修正をしました
title
CHANGED
File without changes
|
body
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
chainerを使用して画像のセグメンテーションを行いたいと考えています.
|
3
3
|
しかし,エラーが出てしまい,上手くいきません.
|
4
4
|
セグメンテーションはここ([リンク内容](https://japan-medical-ai.github.io/medical-ai-course-materials/notebooks/Image_Segmentation.html))を参考にしてコードを書きました.
|
5
|
-
今回は参考とは異なり,自分で学習データを用意,作成し,3クラス分類を試みています.
|
5
|
+
今回は参考とは異なり,自分で学習データを用意,作成し,3クラス分類(物体A,物体B,その他)を試みています.入力画像と正解画像はそれぞれアルファチャンネル無しの3チャンネル画像です.
|
6
6
|
chainerは初めて扱うので解決策が分からず困っています.
|
7
7
|
文字数制限があるためエラー(?)のtraceback以下は省略します.
|
8
8
|
分かる方いらっしゃいましたらご教授願います.
|
@@ -16,8 +16,8 @@
|
|
16
16
|
chainer.utils.type_check.InvalidType:
|
17
17
|
Invalid operation is performed in: SoftmaxCrossEntropy (Forward)
|
18
18
|
|
19
|
-
Expect: t.
|
19
|
+
Expect: t.ndim == x.ndim - 1
|
20
|
-
Actual:
|
20
|
+
Actual: 4 != 3
|
21
21
|
```
|
22
22
|
|
23
23
|
### 該当のソースコード
|
@@ -25,11 +25,9 @@
|
|
25
25
|
```python
|
26
26
|
import glob
|
27
27
|
import chainer
|
28
|
-
|
29
28
|
import numpy as np
|
30
29
|
import chainer.functions as F
|
31
30
|
import chainer.links as L
|
32
|
-
|
33
31
|
from chainer import datasets
|
34
32
|
from chainer import reporter
|
35
33
|
from chainer import iterators
|
@@ -39,10 +37,17 @@
|
|
39
37
|
from chainer.datasets import split_dataset_random
|
40
38
|
from chainercv import evaluations
|
41
39
|
|
40
|
+
def transform(data):
|
41
|
+
"""ラベルデータの値を整数値に変換"""
|
42
|
+
data = data[:3, ...]
|
43
|
+
data = data.astype(np.int32)
|
44
|
+
return data
|
45
|
+
|
42
46
|
def create_dataset(img_filenames, label_filenames):
|
43
47
|
"""データセット作成関数"""
|
44
48
|
img = datasets.ImageDataset(img_filenames)
|
45
49
|
label = datasets.ImageDataset(label_filenames)
|
50
|
+
label = datasets.TransformDataset(label, transform)
|
46
51
|
dataset = datasets.TupleDataset(img, label)
|
47
52
|
return dataset
|
48
53
|
|
@@ -52,14 +57,9 @@
|
|
52
57
|
r"C:\Users\ttbnb\Documents\Python Scripts\data\img*.png"))
|
53
58
|
train_label_filenames = sorted(glob.glob(
|
54
59
|
r"C:\Users\ttbnb\Documents\Python Scripts\data\label*.png"))
|
55
|
-
#タプルで入力画像とマスクの正解画像を束ねる
|
56
60
|
train_val = create_dataset(train_img_filenames, train_label_filenames)
|
57
|
-
#データセットのデータ数を取得する
|
58
61
|
number = len(train_val)
|
59
|
-
#データセットをトレーニング用と検証用に分割する割合を決める
|
60
62
|
ratio = 0.9
|
61
|
-
#読み込んだデータセットをトレーニング用とヴァリデーション用に分割する
|
62
|
-
#第二引数の数だけトレーニングに,残りをヴァリデーションに,seed=0で分割を固定化
|
63
63
|
train, valid = split_dataset_random(train_val, int(number*ratio), seed=0)
|
64
64
|
return train, valid
|
65
65
|
|