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

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

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

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

PyTorch

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

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

機械学習

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

Python

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

Q&A

1回答

1665閲覧

PyTorchにてCNN実装の際に隠れニューロンとFlattenの扱い方について

huskies

総合スコア2

深層学習

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

PyTorch

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

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

機械学習

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

Python

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

0グッド

0クリップ

投稿2021/05/29 01:08

質問内容

PyTorchにて以下条件のCNNを実装しております。Flatten隠れニューロン(hidden-neurons)`の扱い方が不明瞭なため、上手く実装することが出来ない状況です。
実装フローは以下の通りです。

  • Flattenにてイメージをベクターに変更 (Flatten the image to a vector for the input)
  • fully-connected レイヤーには300の隠れニューロン
  • ReLU活性化関数を利用
  • Fully-connected linearレイヤーには10個のアウトプットを生成

現状のコードですと、初期inputのサイズがtorch.Size([100, 3, 32, 32])でして、2回目のprintでtorch.Size([1024, 300])、3回目でtorch.Size([1024, 10])とサイズがどうしても調整できていない状況です。上記フロー実行の際に必要な点をご指摘いただければ幸いです。

python

1class MyNet(nn.Module): 2 def __init__(self): 3 super(MyNet, self).__init__() 4 self.relu = nn.ReLU() 5 self.fc1 = torch.nn.Linear(300, 10) 6 7 def forward(self, x): 8 x = x.view(-1, 300) 9 print(x.shape) 10 x = self.relu(self.fc1(x)) 11 print(x.shape) 12 13 return x

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

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

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

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

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

jbpb0

2021/05/30 23:17 編集

PyTorchのMNIST Example https://github.com/pytorch/examples/blob/master/mnist/main.py の「class Net(nn.Module):...」を例に説明します 上記「Net()」が定義されている状態で、「torchinfo」を使って下記を実行して、ネットワーク構造を可視化します from torchinfo import summary model = Net() summary(model, input_size=(100, 1, 28, 28)) 実行の結果の表示の一部を抜粋すると、下記の通り ================================================== Layer (type:depth-idx) Output Shape Param # ================================================== Net -- -- ├─Conv2d: 1-1 [100, 32, 26, 26] 320 ├─Conv2d: 1-2 [100, 64, 24, 24] 18,496 ├─Dropout: 1-3 [100, 64, 12, 12] -- ├─Linear: 1-4 [100, 128] 1,179,776 ├─Dropout: 1-5 [100, 128] -- ├─Linear: 1-6 [100, 10] 1,290 ================================================== 「Output Shape」の一番左の「100」はバッチサイズ(サンプル数)なので、ネットワークの最初から最後までずっと変わらなくて当然なので、それ以外の数字だけ見ます 「self.dropout1(x)」(Dropout: 1-3)のOutput Shape(出力)は「100, 64, 12, 12」なので、データ数は「64*12*12=9216」個で、それがその次の「torch.flatten(x, 1)」で1次元の9216個のデータに展開されます その次の「self.fc1 = nn.Linear(9216, 128)」の入力「9216」は、self.dropout1(x)の出力の「64*12*12=9216」と数が合ってますし、出力の「128」は、さらにその次の「self.fc2 = nn.Linear(128, 10)」の入力「128」と数が合ってます ネットワーク定義と、「torchinfo」結果の「Output Shape」を参照すると、ネットワーク定義のどの数字が何の意味を持っているのかが、よくわかると思います
jbpb0

2021/05/30 15:05

質問者さんが自分で定義したネットワーク(全結合部分だけではなくCNN部分も含めて)について、上記と同じ解析をしてみてください 上記MNIST Exampleのネットワークと同様に、矛盾無く前後の層のデータ数が合ってますでしょうか? 矛盾があるのでしたら、どこが間違ってるのか、MNIST Exampleのネットワーク定義と見比べながら(「torchinfo」結果も参照しながら)考えてみてください
guest

回答1

0

inputのサイズがtorch.Size([100, 3, 32, 32])

Flattenにてイメージをベクターに変更 (Flatten the image to a vector for the input)
fully-connected レイヤーには300の隠れニューロン
ReLU活性化関数を利用
Fully-connected linearレイヤーには10個のアウトプットを生成

python

1class MyNet(nn.Module): 2 def __init__(self): 3 super(MyNet, self).__init__() 4 self.fc1 = nn.Linear(3072, 300) 5 self.fc2 = nn.Linear(300, 10) 6 def forward(self, x): 7 print(x.shape) 8 x = torch.flatten(x, 1) 9 print(x.shape) 10 x = self.fc1(x) 11 x = F.relu(x) 12 print(x.shape) 13 x = self.fc2(x) 14 print(x.shape) 15 return x

print()の結果
torch.Size([100, 3, 32, 32])
torch.Size([100, 3072])
torch.Size([100, 300])
torch.Size([100, 10])

投稿2021/05/31 14:01

jbpb0

総合スコア7651

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問