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

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

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

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

PyTorch

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

Q&A

解決済

2回答

4403閲覧

PytorchのConv2Dのチャンネル削減に関して

Vincent

総合スコア11

深層学習

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

PyTorch

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

0グッド

1クリップ

投稿2021/03/30 14:56

PytorchのConv2Dのチャンネル削減の演算方法を教えて頂きたいです。

Pytorchの2次元畳み込み演算のConv2dの引数は以下です。
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')

ここで例えば、in_channels:1 out_channels:4の場合は異なるkernelを4つ用意して
計算することで、channelは4倍になるのは分かるのですが逆にin_channels:4 out_channels:1
の時はどのような演算でチャンネル数を削減しているのでしょうか?

宜しくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

質問者様は、個々のm = in_channelsごとにn = out_channelsが(1:n関係で)対応付けられているような理解をされているのではないでしょうか?実態は逆であり、個々のout_channelsごとに全てのin_channelsが(m:1関係で)対応付けられて、畳込み後に全結合が行われています。ですので、out_channels=1であっても、理解は容易です。

全てのin_channelsではなく一部のin_channelsだけに限定して、特定のout_channelsに対応付けることは、groupsオプションを使うとある程度操作可能です。

参考: PyTorchのConv2dドキュメント
groups (int, optional) – Number of blocked connections from input channels to output channels. Default: 1

以上のことを、視覚的に理解できる素晴らしいサイトがあります。
Conv2d:最後にフォワードパスで何が起こるかを理解する

in_channels × out_channels の畳み込みフィルタが使われて、out_channelsごとに全てのin_channelsの畳み込み結果が全結合されている様子が、視覚的によくわかります。また、groupsオプションを使った際の動作も、視覚的にわかります。

投稿2021/03/30 23:04

toast-uz

総合スコア3266

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

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

Vincent

2021/03/31 11:33

教えて頂いたサイト素晴らしいです。 理解することができました。本当にありがとうございます。
guest

0

https://ai.stackexchange.com/questions/6934/convolutional-neural-nets-and-reduction-of-the-layers
を参考にすると、


in_channels=4
out_channels=1
kernel_size=7(仮定)

フィルタ数をm、展開したフィルタの数をkとおくと、

m = out_channels = 1
k = kernel_size x kernel_size x in_channels = 7 x 7 x 4 = 196

により、展開したフィルタの行列は以下のようになります。

(m x k) = (1 x 196)

パディングやストライドに寄りますが、入力画像のデータをnとおくと、
入力の行列は(k x n)と表現できます。

(m x k) に対して(k x n)を乗算すると、得られる結果は(m x n)

(m x n) = (1 x n)

結果、mは質問におけるチャネルに相当しますので、チャネルが4から1に削減されます。


https://cs231n.github.io/convolutional-networks/#conv
の"1x1 convolution"の項が(まったく同じ計算ではないですが、「次元が減るよ」という意味で)参考になりそうです。

投稿2021/03/30 22:36

編集2021/03/30 22:38
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Vincent

2021/03/31 11:27

凄く丁寧に回答頂き誠にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問