研究ノートは、この記事から学びます。https://blog.csdn.net/u011436316/article/details/101930269
autogradは自動微分システムを実現しますが、深い学習の下部には、あまりにも、この章では、NNモジュールはautogradニューラルネットワークモジュールの上に構築されて紹介します。nnのに加えて、我々は、ニューラルネットワークに、このようなようにオプティマイザOPTIM、初期化initととして一般的に使用されるツールを、ご紹介します。
4.1 nn.Module
第3章では、あなたが深い学習モデルを実現するためにそれを使用する場合、あなたが書かれたコードの偉大な量を必要とする、autogradの使用は深い学習モデルを実現することができます言及しますが、抽象化の低水準。この場合、torch.nnは、特に深い学習モジュールのために設計された、されて入ってきました。抽象的概念であるModule1を、torch.nnコアデータ構造であり、ニューラルネットワークは、特定の層(レイヤ)で表すことができる、それはまた、ニューラルネットワークは、多くの層を含んで表すことができます。実際の使用では、最も一般的な方法は、独自のネットワーク/レイヤーを書き、nn.Moduleを継承しています。あなたは彼らの完全な接続層を実現する以下のnn.Moduleを使用する方法で見てみましょう。完全接続層も知られているアフィン層、入力パラメータyと入力X満たすY = Wxを+ B、W Bとは学習可能です。
import torch as t
from torch import nn
from torch.autograd import Variable as V
# 定义线性模型:y = w * x + b
class Linear(nn.Module): # 继承nn.Module,并且在其构造函数中需调用
#nn.Module的构造函数,即super(Linear,self).init()或nn.Module.init(self)
def __init__(self,in_features,out_features):
#构造函数__init__定义可学习的参数,
#并封装成Parameter,如封装w,b成Parameter.
#Parameter是一种特殊的Variable,但其默认需要求导(requires_grad=True)
super(Linear,self).__init__() # 等价于nn.Module.__init__(self)
self.w = nn.Parameter(t.randn(in_features,out_features))#封装w
self.b = nn.Parameter(t.randn(out_features))#封装b
def forward(self,x):#实现前向传播过程,
#其实输入可以是一个或多个variable,对x的操作也必须是variable支持的操作
xw = x.mm(self.w)
y = xw + self.b.expand_as(xw)
#tensor.expand_as()这个函数就是
#把一个tensor变成和函数括号内一样形状的tensor,用法与expand()类似。
return y
net = Linear(4,3)
x = V(t.randn(2,4))
y = net(x)#将net看成函数
print(y)
次のように出力されます。
tensor([[-4.6985, -2.3410, -1.2974],
[-1.7272, 0.0638, 2.1338]], grad_fn=<AddBackward0>)
入力:
layer=net
for name,parameter in layer.named_parameters():
print(name,parameter) #w and b
次のように出力されます。
w Parameter containing:
tensor([[-1.1190, -0.4002, 0.8744],
[-0.7999, -0.5281, -1.0659],
[ 0.5722, -0.7538, -0.9995],
[-0.2019, 0.2152, 0.6807]], requires_grad=True)
b Parameter containing:
tensor([0.6568, 0.5761, 1.7080], requires_grad=True)
それは非常に簡単なコードの10行を超えたが、以下の点に注意しないされ、完全な接続層を達成するために、見られています:
- リニアカスタム層がnn.Moduleを継承しなければならないし、そのコンストラクタはnn.Moduleが必要なコンストラクタを呼び出し、すなわちスーパー(リニア、自己).INIT()またはnn.Module.init(自己)。
- 学習パラメータは、それ自体、コンストラクタ__init__で定義され、パラメータにパッケージング、この場合のように我々のW B、パラメータとしてパッケージ化されなければなりません。パラメータは、特殊な変数であるが、デフォルト要求ガイド(requires_grad = TRUE)、興味のある読者はnn.Parameter介し??パラメータ・クラスのソースコードを見ることができます。
- 入力変数の一つ以上であってもよい伝播を実現するフォワード機能する前に、任意の操作のXもサポート業務に可変でなければなりません。
書き込みバックプロパゲーション機能する必要はありませんが、それは変数の操作の順方向の広がりであるので、nn.Moduleは自動的に機能よりもはるかに簡単であるバックプロパゲーションを、autogradを使用することができます。 - 使用時には、ネットが直感的な数学的概念の関数として見ることができ、Xの結果に対応するネットコール(X)を得ることができます。それはnet.call(X)に相当し、__call__機能で、メイン・コールはまた、いくつかの処理を行うためのフックに、net.forward(x)があります。下記のAPIの具体的な内容に、代わりnet.forward(x)は、実際の使用においてネット(X)を使用することが可能であるべきです。
- 学習パラメータのモジュールはイテレータnamed_parameters()またはパラメータ()で返すことができ、前者はそれをより認識できるように、各パラメータ名に添付します。
目に見えるが、接続層モジュールの完全な実装を使用して、関数を使用するよりも簡単には、ライトバックプロパゲーション機能する必要はありませんので、実装されています。
モジュールは自動的に独自のパラメータを検出し、学習パラメータとしてすることができます。付加パラメータで、モジュールモジュールは、さらに、サブパラメータ内のサブマスタモジュールモジュール再帰ルックアップを含みます。MLP:もう少し複雑なネットワークでは、以下の表情。
MLPネットワーク構造図です。これは活性化機能(図示せず)などのシグモイド関数を使用して、2つの完全に接続された層からなります。
class Perceptron(nn.Module):
def __init__(self,in_features,hidden_features,out_features):
nn.Module.__init__(self)
self.layer1=Linear(in_features,hidden_features)
self.layer2=Linear(hidden_features,out_features)
def forward(self,x):
x=self.layer1(x)
x=t.sigmoid(x)
#Sigmoid函数是一个在生物学中常见的S型函数,也称为S型生长曲线。
#在信息科学中,由于其单增以及反函数单增等性质,
#Sigmoid函数常被用作神经网络的激活函数,将变量映射到0,1之间。
x=self.layer2(x)
return x
perceptron=Perceptron(3,4,1)
for name,param in perceptron.named_parameters():
#Module中的可学习参数可以通过named_parameters()或者parameters()返回迭代器,
#前者会给每个parameter附上名字,使其更具有辨识度。
print(name,param.size())#3.4,4,4.1,1
次のように出力されます。
layer1.w torch.Size([3, 4])
layer1.b torch.Size([4])
layer2.w torch.Size([4, 1])
layer2.b torch.Size([1])
可視少しでもより複雑な多層パーセプトロン、その実装はまだ非常に簡単です。それは、次の2つの知識ポイントことに留意すべきです。
- __init__コンストラクタはサブ現在のモジュールモジュールオブジェクトとして先行層リニア(モジュール)を使用してカスタマイズすることができる、それがパラメーターを学ぶことができ、現在のモジュールは、パラメータを学習することができます。
- 前方伝播関数は、我々意識的に出力変数は、それによって、メモリを節約し、Pythonは中間層の出力の一部を可能にするために回収され、Xと命名されています。いくつかの変数名がカバーされ、まだ参照カウントをチェックすることで、バックプロパゲーション、Pythonのメモリ・リカバリ・モジュールでの使用に必要な、メモリのこの部分を再利用されていませんが、しかし、すべての中間結果は、リサイクルされます。
グローバル・ネーミングでのモジュールのパラメータは次のとおりです。
- 直接パラメータ名。=例えばself.param_name
nn.Parameter(t.randn(3,4-))、命名PARAM_NAME。 - パラメータ内のサブモジュールは、現在のモジュール名の前に自分の名前を追加します。例えば= self.sub_moduleのための
サブモジュール()、サブモジュールは、次いで、パラメータの両方のスプライシング、パラメータ名もPARAM_NAME呼ばれるある
名前はsub_module.param_nameあります。
ユーザーの便宜のために、PyTorchパラメータは、カプセル化され得るパラメータ、および器具フォワード機能を学習、nn.Moduleを継承している層ニューラルネットワーク層の大部分において達成され、具体的CuDNNを計算GPU用に最適化されますスピードとパフォーマンスが非常に優れています。この本は、読者がで?チェックIPython / Jupyter公式文書または使用nn.layerの具体的な内容を参照することができ、すべての層は、詳細な説明をnn.Moduleために準備ができていません。以下の点に焦点を当てるべきであるマニュアルを参照してください。
- そのようなnn.Linear(in_features、out_features、バイアス)としてコンストラクタパラメータは、これら三つのパラメータの役割を心配します。
- プロパティは、パラメータやサブモジュールを学ぶことができます。重みとバイアスnn.Linearは2つの学習パラメータ、ない子モジュールを持っています。
- O形状は、入力形状nn.Linear(N、input_features)、出力形状(N、output_features)ように、NはBATCH_SIZEあります。
入力データが単一ではなく、バッチ:これらのカスタム層は、入力の形状を想定しています。データ入力に、BATCH_SIZE =バッチ1のデータの関数として偽装(0)unsqueeze呼び出さなければなりません。
アプリケーションレベルから次の出発は、簡単な紹介を行うにはいくつかの一般的な層、より詳細な使用方法に、公式のドキュメントを参照してください。