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

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

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

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

Python

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

Q&A

1回答

2479閲覧

python pkg の Convolutional Neural Network のコード (Chainer)

seturi38

総合スコア6

Chainer

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

Python

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

0グッド

0クリップ

投稿2017/01/28 13:54

python の pkg にある fcn のコードについて分からないことがあり質問させていただきました。pip install fcn でインストールできる以下のコードに
h = upscore[:, :, 19:19+x.data.shape[2], 19:19+x.data.shape[3]]
とあります。
これは Deconvolution した特徴マップを入力画像サイズにあうように crop していると思うのですが、なぜ 19 から配列を取り出しているのかわかりません。お分かりの方がいらっしゃいましたらご教授いただけないでしょうか。
入力画像のサイズは 300~500 pix のものが入ります。
よろしくお願いします。

python

1import math 2 3import chainer 4import chainer.functions as F 5import chainer.links as L 6import numpy as np 7 8import fcn 9 10class FCN32s(chainer.Chain): 11 12 """Full Convolutional Network 32s""" 13 14 def __init__(self, n_class=21): 15 self.n_class = n_class 16 super(self.__class__, self).__init__( 17 conv1_1=L.Convolution2D(3, 64, 3, stride=1, pad=100), 18 conv1_2=L.Convolution2D(64, 64, 3, stride=1, pad=1), 19 20 conv2_1=L.Convolution2D(64, 128, 3, stride=1, pad=1), 21 conv2_2=L.Convolution2D(128, 128, 3, stride=1, pad=1), 22 23 conv3_1=L.Convolution2D(128, 256, 3, stride=1, pad=1), 24 conv3_2=L.Convolution2D(256, 256, 3, stride=1, pad=1), 25 conv3_3=L.Convolution2D(256, 256, 3, stride=1, pad=1), 26 27 conv4_1=L.Convolution2D(256, 512, 3, stride=1, pad=1), 28 conv4_2=L.Convolution2D(512, 512, 3, stride=1, pad=1), 29 conv4_3=L.Convolution2D(512, 512, 3, stride=1, pad=1), 30 31 conv5_1=L.Convolution2D(512, 512, 3, stride=1, pad=1), 32 conv5_2=L.Convolution2D(512, 512, 3, stride=1, pad=1), 33 conv5_3=L.Convolution2D(512, 512, 3, stride=1, pad=1), 34 35 fc6=L.Convolution2D(512, 4096, 7, stride=1, pad=0), 36 fc7=L.Convolution2D(4096, 4096, 1, stride=1, pad=0), 37 38 score_fr=L.Convolution2D(4096, self.n_class, 1, stride=1, pad=0), 39 40 upscore=L.Deconvolution2D(self.n_class, self.n_class, 64, 41 stride=32, pad=0), 42 ) 43 self.train = False 44 45 def __call__(self, x, t=None): 46 self.x = x 47 self.t = t 48 49 # conv1 50 h = F.relu(self.conv1_1(x)) 51 conv1_1 = h 52 h = F.relu(self.conv1_2(conv1_1)) 53 conv1_2 = h 54 h = F.max_pooling_2d(conv1_2, 2, stride=2, pad=0) 55 pool1 = h # 1/2 56 57 # conv2 58 h = F.relu(self.conv2_1(pool1)) 59 conv2_1 = h 60 h = F.relu(self.conv2_2(conv2_1)) 61 conv2_2 = h 62 h = F.max_pooling_2d(conv2_2, 2, stride=2, pad=0) 63 pool2 = h # 1/4 64 65 # conv3 66 h = F.relu(self.conv3_1(pool2)) 67 conv3_1 = h 68 h = F.relu(self.conv3_2(conv3_1)) 69 conv3_2 = h 70 h = F.relu(self.conv3_3(conv3_2)) 71 conv3_3 = h 72 h = F.max_pooling_2d(conv3_3, 2, stride=2, pad=0) 73 pool3 = h # 1/8 74 75 # conv4 76 h = F.relu(self.conv4_1(pool3)) 77 h = F.relu(self.conv4_2(h)) 78 h = F.relu(self.conv4_3(h)) 79 h = F.max_pooling_2d(h, 2, stride=2, pad=0) 80 pool4 = h # 1/16 81 82 # conv5 83 h = F.relu(self.conv5_1(pool4)) 84 h = F.relu(self.conv5_2(h)) 85 h = F.relu(self.conv5_3(h)) 86 h = F.max_pooling_2d(h, 2, stride=2, pad=0) 87 pool5 = h # 1/32 88 89 # fc6 90 h = F.relu(self.fc6(pool5)) 91 h = F.dropout(h, ratio=.5, train=self.train) 92 fc6 = h # 1/32 93 94 # fc7 95 h = F.relu(self.fc7(fc6)) 96 h = F.dropout(h, ratio=.5, train=self.train) 97 fc7 = h # 1/32 98 99 # score_fr 100 h = self.score_fr(fc7) 101 score_fr = h # 1/32 102 103 # upscore 104 h = self.upscore(score_fr) 105 upscore = h # 1 106 107 # score 108 h = upscore[:, :, 19:19+x.data.shape[2], 19:19+x.data.shape[3]] 109 self.score = h # 1/1 110 111 if t is None: 112 assert not self.train 113 return 114 115 # testing with t or training 116 self.loss = F.softmax_cross_entropy(self.score, t, normalize=False) 117 if math.isnan(self.loss.data): 118 raise ValueError('loss value is nan') 119 120 # report the loss and accuracy 121 batch_size = len(x.data) 122 labels = chainer.cuda.to_cpu(t.data) 123 label_preds = chainer.cuda.to_cpu(self.score.data).argmax(axis=1) 124 results = [] 125 for i in xrange(batch_size): 126 acc, acc_cls, iu, fwavacc = fcn.util.label_accuracy_score( 127 labels[i], label_preds[i], self.n_class) 128 results.append((acc, acc_cls, iu, fwavacc)) 129 results = np.array(results).mean(axis=0) 130 chainer.reporter.report({ 131 'loss': self.loss, 132 'accuracy': results[0], 133 'acc_cls': results[1], 134 'iu': results[2], 135 'fwavacc': results[3], 136 }, self) 137 138 return self.loss

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

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

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

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

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

guest

回答1

0

README.mdを読む

This is Chainer implementation of fcn.berkeleyvision.org.

とありますから、元のFCN実装と同じことをしているのでしょう。そちらを見てみると、たとえばVOCのFCN-32sのコードでは

python

1 n.score = crop(n.upscore, n.data) 2

とだけ書かれていて、刈り込みの詳細はcaffe.coord_map.crop()にあるようです。そちらの仕様を調べれば、なぜ19というマジックナンバが出てくるのかわかるでしょう (ご自分で調べてみて下さい)。

投稿2017/01/29 03:26

ikedas

総合スコア4335

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問