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

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

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

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

Python

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

Q&A

解決済

1回答

710閲覧

chainerでのセグメンテーション実装中のエラーについて

rk2

総合スコア11

Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

Python

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

0グッド

0クリップ

投稿2019/05/06 02:13

編集2019/05/08 07:18

前提・実現したいこと

chainerを使用して画像のセグメンテーションを行いたいと考えています.
しかし,エラーが出てしまい,上手くいきません.
セグメンテーションはここ(リンク内容)を参考にしてコードを書きました.
今回は参考とは異なり,自分で学習データを用意,作成し,3クラス分類(物体A,物体B,その他)を試みています.入力画像と正解画像はそれぞれアルファチャンネル無しの3チャンネル画像ですが,正解画像はインデックスカラー画像になっており,プログラムで読み込んだ際はshapeが(1, 512, 512)でした.
chainerは初めて扱うので解決策が分からず困っています.
文字数制限があるためエラー(?)のtraceback以下は省略します.
分かる方いらっしゃいましたらご教授願います.
宜しくお願い致します.

発生している問題・エラーメッセージ

Traceback (most recent call last): ~ここは省略しました~ chainer.utils.type_check.InvalidType: Invalid operation is performed in: SoftmaxCrossEntropy (Forward) Expect: t.ndim == x.ndim - 1 Actual: 4 != 3

確認の為SoftmaxCrossEntropyの変数であるy_outとtの型を.shapeで確認したのですが,
y_out=(バッチ数, 3, 512, 512) t=(バッチ数, 1, 512, 512)となっていました.
tが3次元の入力を求めているようですが,4次元のどの次元を削除(?)して3次元に変換する必要があるのでしょうか?

該当のソースコード

python

1import glob 2import chainer 3import numpy as np 4import chainer.functions as F 5import chainer.links as L 6from chainer import datasets 7from chainer import reporter 8from chainer import iterators 9from chainer import training 10from chainer import optimizers 11from chainer.training import extensions 12from chainer.datasets import split_dataset_random 13from chainercv import evaluations 14 15def transform(data): 16 """ラベルデータの値を整数値に変換""" 17 data = data.astype(np.int32) 18 return data 19 20def create_dataset(img_filenames, label_filenames): 21 """データセット作成関数""" 22 img = datasets.ImageDataset(img_filenames) 23 label = datasets.ImageDataset(label_filenames) 24 label = datasets.TransformDataset(label, transform) 25 dataset = datasets.TupleDataset(img, label) 26 return dataset 27 28def create_datasets(): 29 """データセット作成関数を使用してデータセットの読み込み""" 30 train_img_filenames = sorted(glob.glob( 31 r"C:\Users\ttbnb\Documents\Python Scripts\data\img*.png")) 32 train_label_filenames = sorted(glob.glob( 33 r"C:\Users\ttbnb\Documents\Python Scripts\data\label*.png")) 34 train_val = create_dataset(train_img_filenames, train_label_filenames) 35 number = len(train_val) 36 ratio = 0.9 37 train, valid = split_dataset_random(train_val, int(number*ratio), seed=0) 38 return train, valid 39 40TRAIN, VALID = create_datasets() 41#確認の為にデータの数を出力 42print('Training dataset size:', len(TRAIN)) 43print('Validation dataset size:', len(VALID)) 44 45class UNET(chainer.Chain): 46 """畳み込みネットワーククラス""" 47 def __init__(self, out_h, out_w, n_class=3): 48 super().__init__() 49 with self.init_scope(): 50 self.conv1 = L.Convolution2D(n_class, 64, ksize=3, stride=1, pad=1) 51 self.conv2 = L.Convolution2D(None, 64, ksize=3, stride=1, pad=1) 52 self.conv3 = L.Convolution2D(None, 128, ksize=3, stride=1, pad=1) 53 self.conv4 = L.Convolution2D(None, 128, ksize=3, stride=1, pad=1) 54 self.conv5 = L.Convolution2D(None, 64, ksize=3, stride=1, pad=1) 55 self.conv6 = L.Convolution2D(None, 64, ksize=3, stride=1, pad=1) 56 self.conv7 = L.Convolution2D(None, n_class, ksize=3, stride=1, pad=1) 57 self.deconv1 = L.Deconvolution2D(None, 64, ksize=2, stride=2, pad=0) 58 59 self.out_h = out_h 60 self.out_w = out_w 61 62 def forward(self, inputimg): 63 """forward関数の定義""" 64 e_1 = F.relu(self.conv1(inputimg)) 65 e_2 = F.relu(self.conv2(e_1)) 66 e_3 = F.max_pooling_2d(e_2, ksize=2, stride=2, pad=0) 67 68 e_4 = F.relu(self.conv3(e_3)) 69 e_5 = F.relu(self.conv4(e_4)) 70 71 e_6 = F.relu(self.deconv1(e_5)) 72 73 e_7 = F.concat([e_2, e_6], axis=1) 74 e_8 = F.relu(self.conv5(e_7)) 75 e_9 = F.relu(self.conv6(e_8)) 76 e_10 = (self.conv7(e_9)) 77 78 return e_10.reshape(inputimg.shape[0], 3, e_10.shape[2], e_10.shape[3]) 79 80class PixelwiseSigmoidClassifier(chainer.Chain): 81 """目的関数を計算するclassifierクラス""" 82 83 def __init__(self, predictor): 84 """学習対象のモデルをpredictorとして保持しておく""" 85 super().__init__() 86 with self.init_scope(): 87 self.predictor = predictor 88 89 def __call__(self, inputimg, t): 90 """まずは学習対象のモデルで推論を行う""" 91 y_out = self.predictor(inputimg) 92 #ここで型を確認したが四次元のものはなかった. 93 print("y", y_out.shape, "t", t.shape) 94 95 loss = F.softmax_cross_entropy(y_out, t) 96 97 y_out, t = F.softmax(y_out).data, (t) 98 99 y_out, t = y_out[:, 0, ...], t[:, 0, ...] 100 evals = evaluations.eval_semantic_segmentation(y_out, t) 101 102 reporter.report({'loss':loss, 'miou':evals['miou'], 'pa':evals['pixel_accuracy']}, self) 103 return loss 104 105def create_trainer(batchsize, train, val, stop, device=-1, log_trigger=(1, 'epoch')): 106 """trainerによる学習""" 107 model = UNET(out_h=512, out_w=512) 108 train_model = PixelwiseSigmoidClassifier(model) 109 110 optimizer = optimizers.Adam() 111 optimizer.setup(train_model) 112 113 train_iter = iterators.MultiprocessIterator(train, batchsize) 114 val_iter = iterators.MultiprocessIterator(val, batchsize, repeat=False, shuffle=False) 115 116 updater = training.StandardUpdater(train_iter, optimizer, device=-1) 117 118 trainer = training.trainer.Trainer(updater, stop, out='result_fcn') 119 120 logging_attributes = ( 121 ['epoch', 'main/loss', 'main/miou', 'main/pa', 122 'val/main/loss', 'val/main/miou', 'val/main/pa']) 123 trainer.extend(extensions.LogReport(logging_attributes), trigger=log_trigger) 124 trainer.extend(extensions.PrintReport(logging_attributes), trigger=log_trigger) 125 trainer.extend(extensions.PlotReport( 126 ['main/loss', 'val/main/loss'], 'epoch', file_name='loss.png')) 127 trainer.extend(extensions.PlotReport( 128 ['main/miou', 'val/main/miou'], 'epoch', file_name='miou.png')) 129 trainer.extend(extensions.PlotReport( 130 ['main/pa', 'val/main/pa'], 'epoch', file_name='pa.png')) 131 132 trainer.extend(extensions.Evaluator(val_iter, train_model, device=device), name='val') 133 trainer.extend(extensions.dump_graph('main/loss')) 134 return trainer 135 136if __name__ == '__main__': 137 TRAINER = create_trainer(2, TRAIN, VALID, (1, 'epoch'), device=-1, log_trigger=(1, 'epoch')) 138 TRAINER.run()

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

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

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

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

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

guest

回答1

0

自己解決

tの次元のチャンネル数の大きさが1の次元をnp.sqeezeして次元を調節することで、SoftmaxCrossEntropyのエラーは回避することができました。しかし、eval_semantic_segmentationにてエラーが出てしまいました。本質問は解決できましたのでeval_semantic_segmentationのエラーについては次の質問にて質問させていただきました。
本質問を閲覧していただいた方で、お時間のありでしたら、次の質問も回答募集中ですのでご協力いただければ幸いです。

投稿2019/05/13 01:24

rk2

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問