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

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

新規登録して質問してみよう
ただいま回答率
85.35%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

1回答

3451閲覧

MobileNet V1内のバッチ正規化(Batch Normalization)層の推論時の入力データに対する処理内容を知りたい

Otom_jp

総合スコア4

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

1クリップ

投稿2020/08/28 08:11

編集2020/08/28 15:11

[実現したいこと]
訳あってMobileNet_V1をCで実装したい。convolution層,point_convolution層,dw_convolution層等の層は問題なく実装できそうなのだが、当モデルは学習時にBatchNormalization層を通しているので推論時にも同様に入力を正規化する必要があるのでバッチ正規化層を実装したいと考えている。
[わかっていること]
ここでどのように正規化するのかということで、調べてみたところどうやら学習中にバッチ毎に正規化するための平均と標準偏差が決定されており、学習時はバッチ毎に決定されたそれら二つのパラメータを用いて入力を正規化するとのこと。

参考にしたサイトの一つ : https://qiita.com/t-tkd3a/items/14950dbf55f7a3095600

[実現のために知りたいこと]
推論時のバッチ正規化層では入力をどのように正規化しているのか知りたい。推論時(つまりテスト時)には入力はバッチでは来ないはずであり1枚の画像が入力されてテストが行われるはず。学習時ではバッチ毎に決定した平均と標準偏差を用いて各バッチの入力を正規化するのに対して、推論時はどういったパラメータを用いて中間入出力の値を正規化するのか知りたい。
自分の予想では学習データ全体の平均と標準偏差を用いて正規化するのだとふんでいるのだがいまいち確証が持てないので手詰まりになっている。

またPyTorchを用いて学習を行ったのでPyTorchでどのように学習後のモデルから学習によって決定された平均や標準偏差を抽出するか。ということも知りたいです。

どなたか詳しい方がいらっしゃいましたらご教授頂けると幸いです。
すみませんがよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下のページがわかりやすいです。

Deep LearningにおけるBatch Normalizationの理解メモと、実際にその効果を見てみる - Qiita

また Pytorch のドキュメントも参考になると思います。

BatchNorm1d — PyTorch 1.6.0 documentation

推論時のバッチ正規化層では入力をどのように正規化しているのか知りたい

入力が (バッチサイズ, N) としたとき、各次元ごとに平均μ_iと標準偏差σ_iを計算し、
x'_i = (x_i - μ_i) / σ_i で平均0、分散1に正規化します。

そして、推論時用に平均と標準偏差を移動平均で更新しながら記録します。

μ'i = (1 - λ) μ'{i - 1} + λ μ_i
σ'i = (1 - λ) σ'{i - 1} + λ σ_i

平均と標準偏差を用いて各バッチの入力を正規化するのに対して、推論時はどういったパラメータを用いて中間入出力の値を正規化するのか知りたい。

学習時に記録しておいたμ'、σ'を使用して、入力データに対して x'_i = (x_i - μ'_i) / σ'_i を同様に適用します。

以上がシンプルな Batch Noramlization ですが、一般的にはこれに加えて標準化後の出力に対して、アフィン変換を行います。(Pytorch の場合は affine=True を指定した場合)

python

1import torch 2 3bn = torch.nn.BatchNorm1d(10) 4 5# 平均、分散の移動平均 6print("mean", bn.running_mean.shape) # 平均 7print("var", bn.running_var.shape) # 分散 8 9# アフィン変換 wX + b のパラメータ (affine=True の場合) 10params = dict(bn.named_parameters()) 11print("w", params["weight"].shape) 12print("b", params["bias"].shape)

Pytorch の CPU 実装は以下です。

pytorch/Normalization.cpp at master · pytorch/pytorch

投稿2020/08/28 17:25

編集2020/08/28 17:37
tiitoi

総合スコア21956

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

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

Otom_jp

2020/08/29 04:12

前回の質問に引き続き解答して頂き感謝いたします。大まかな全体像は掴むことができました " 学習時に記録しておいたμ'、σ'を使用して、入力データに対して x'_i = (x_i - μ'_i) / σ'_i を同様に適用します。" 上記の部分で疑問がまだあります。 MobileNet_V1の場合20層近くある畳み込み層の後には毎回BN層が実装されていると思いますが、推論時はそれぞれのBN層に毎回学習で得られた各BN層の平均と標準偏差を用いて入力データの正規化を行うのでしょうか。 (例えば 推論時のBN1層目には学習時にBN1層目で得られた平均と標準偏差を。BN2層目には同様にBN2層目で得られた平均と標準偏差を... といった形) それとも学習の中で、全20層以上あるBN層から得られた約20組の平均と標準偏差を何らかの方法で1組の平均と標準偏差に統合するのでしょうか。
tiitoi

2020/08/29 04:16

前者であってます。処理はBNの層単位です。
Otom_jp

2020/08/30 16:33

なるほどありがとうございます。今回の知りたかったことは知ることが出来ました。 引き続き各BN層で得られた平均と標準偏差の抽出を学習済みモデルから行ってみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問