1. 程式人生 > 程式設計 >用pytorch的nn.Module構造簡單全連結層例項

用pytorch的nn.Module構造簡單全連結層例項

python版本3.7,用的是虛擬環境安裝的pytorch,這樣隨便折騰,不怕影響其他的python框架

1、先定義一個類Linear,繼承nn.Module

import torch as t
from torch import nn
from torch.autograd import Variable as V
 
class Linear(nn.Module):

  '''因為Variable自動求導,所以不需要實現backward()'''
  def __init__(self,in_features,out_features):
    super().__init__()
    self.w = nn.Parameter( t.randn( in_features,out_features ) ) #權重w 注意Parameter是一個特殊的Variable
    self.b = nn.Parameter( t.randn( out_features ) )   #偏值b
  
  def forward( self,x ): #引數 x 是一個Variable物件
    x = x.mm( self.w )
    return x + self.b.expand_as( x ) #讓b的形狀符合 輸出的x的形狀

2、驗證一下

layer = Linear( 4,3 )
input = V ( t.randn( 2,4 ) )#包裝一個Variable作為輸入
out = layer( input )
out

#成功執行,結果如下:

tensor([[-2.1934,2.5590,4.0233],[ 1.1098,-3.8182,0.1848]],grad_fn=<AddBackward0>)

下面利用Linear構造一個多層網路

class Perceptron( nn.Module ):
  def __init__( self,hidden_features,out_features ):
    super().__init__()
    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()啟用函式
    return self.layer2( x )

測試一下

perceptron = Perceptron ( 5,3,1 )
 
for name,param in perceptron.named_parameters(): 
  print( name,param.size() )

輸出如預期:

layer1.w torch.Size([5,3])
layer1.b torch.Size([3])
layer2.w torch.Size([3,1])
layer2.b torch.Size([1])

以上這篇用pytorch的nn.Module構造簡單全連結層例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。