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

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

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

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

PyTorch

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

0回答

939閲覧

[pytorchモデル]forwardの中身が知りたい。特にsoftmaxのdimの決め方がわからない。

oinari03

総合スコア59

深層学習

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

PyTorch

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/08/14 03:37

編集2020/08/14 06:21

やりたいこと

以下の条件でモデルを作成したい

・pytorchであること
・画像データとlabelを付与することについてやっています。

・入力画像は256x256のRGB画像
・出力は二値で分類するので2次元になると思います

環境

python 3.7.7 >>> print(torch.__version__) 1.5.1+cu101

書いてみたコード

import torch import torch.nn as nn import torch.nn.functional as F """ 入力は256x256のRGB画像 出力は0or1の2次元ベクトルになるはず """ class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.relu = nn.ReLU() # input: RGB 3 ,output : 16, kernel 3(default) self.conv1 = nn.Conv2d(3, 16, 3) # print(self.conv1.weight) self.pool1 = nn.MaxPool2d(2,stride=2) self.conv2 = nn.Conv2d(16, 32, 3) self.pool2 = nn.MaxPool2d(2,stride=2) self.conv3 = nn.Conv2d(32, 64, 3) self.pool3 = nn.MaxPool2d(2,stride=2) self.conv4 = nn.Conv2d(64, 128, 3) self.pool4 = nn.MaxPool2d(2,stride=2) self.conv5 = nn.Conv2d(128, 256, 3) self.pool5 = nn.MaxPool2d(2,stride=2) self.softmax = nn.Softmax(dim=1) # an affine operation: y = Wx + b # linearにおけるout_featuresとはなんだろうか self.fc1 = nn.Linear(256 * 3 * 3, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 2) def forward(self, x): # conv relu poolの流れを実行してみる x = self.conv1(x) x = self.relu(x) x = self.pool1(x) x = self.conv2(x) x = self.relu(x) x = self.pool2(x) x = self.conv3(x) x = self.relu(x) x = self.pool3(x) x = self.conv4(x) x = self.relu(x) x = self.pool4(x) x = self.conv5(x) x = self.relu(x) x = self.pool5(x) x = x.view(x.size()[0], -1) x = self.fc1(x) x = self.relu(x) x = self.fc2(x) x = self.relu(x) x = self.fc3(x) x = self.softmax(x) return x net = Net() print(net) # params = list(net.parameters()) # print(len(params))

出力

Net( (relu): ReLU() (conv1): Conv2d(3, 16, kernel_size=(3, 3), stride=(1, 1)) (pool1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (conv2): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1)) (pool2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (conv3): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1)) (pool3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (conv4): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1)) (pool4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (conv5): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1)) (pool5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (softmax): Softmax(dim=1) (fc1): Linear(in_features=2304, out_features=120, bias=True) (fc2): Linear(in_features=120, out_features=84, bias=True) (fc3): Linear(in_features=84, out_features=2, bias=True) )

<コードの意図>
conv→relu→poolingのユニットを自分にとってわかりやすくするためにまとめて書いています。
convの引数の意図は最初のinはRGBなので3、kernelは3で統一しています。最終的に最初の256になるように大きくしていきます。

また、Linearの意図に関しては256から2次元にするために最初と最後は決まっていますが、
間にどういった法則性で小さくしていくかわからなかったため120、84のような適当な値になってしまいました。
softmaxの書き方がどうなっているのかわからなかったのでdim=1にしています。

わからないこと(よろしくお願いします。)

・Linearの引数。ドキュメントではout_featureってなっていましたがどういう値をいれればいいのかわかりません。
・softmaxの引数の適切なdimの数字0とか1で何がちがうのか、使い方があっているのか知りたいです。最後に確率であらわされるはずだと思ってます。

・forwardがどのようになっているのか知りたいです。
→例えば、xにどんな値を与えたらいいかのコードを示していただけると助かります。
→それでクラスを呼び出したときにxの中身がどう変化しているのかが知りたいです。
・そもそもinitやforwardの書き方があっているのか確認してほしいです。

以下の書き方を参照しましたがわからない点があります。
softmaxのドキュメント
modelの書き方ドキュメント
nn.Linearのドキュメント

以上が、自分なりに書いてみてわからないところをまとめた点です。
これらを踏まえて疑問点を解消していただけないでしょうか。また、このような書き方正しいのかどうかを確認していただければと思います。

なにか拙い点や、足りない情報があれば追記いたしますのでご指摘してくださると助かります。

どうかよろしくお願いします。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問