14模型构造
import torch
from torch import nn
from torch. nn import functional as F
net1 = nn. Sequential( nn. Linear( 20 , 256 ) , nn. ReLU( ) , nn. Linear( 256 , 10 ) )
"""
nn.Sequential定义了一种特殊的Module, 即在PyTorch中表示一个块的类,
它维护了一个由Module组成的有序列表。
注意,两个全连接层都是Linear类的实例, Linear类本身就是Module的子类。
另外,到目前为止,我们一直在通过net(X)调用我们的模型来获得模型的输出。
这实际上是net.__call__(X)的简写。这个前向传播函数非常简单: 它将列表中的每个块连接在一起,将每个块的输出作为下一个块的输入。
"""
X1 = torch. rand( 2 , 20 )
print ( net1( X1) )
class MLP ( nn. Module) : def __init__ ( self) : super ( ) . __init__( ) self. hidden = nn. Linear( 20 , 256 ) self. out = nn. Linear( 256 , 10 ) def forward ( self, X) : return self. out( F. relu( self. hidden( X) ) )
X2 = torch. rand( 2 , 20 )
net2 = MLP( )
print ( net2( X2) )
class MySequential ( nn. Module) : def __init__ ( self, * args) : super ( ) . __init__( ) for idx, module in enumerate ( args) : self. _modules[ str ( idx) ] = moduledef forward ( self, X) : for block in self. _modules. values( ) : X = block( X) return XX3 = torch. rand( 2 , 20 )
net3 = MySequential( nn. Linear( 20 , 256 ) , nn. ReLU( ) , nn. Linear( 256 , 10 ) )
print ( net3( X3) )
class FixedHiddenMLP ( nn. Module) : def __init__ ( self) : super ( ) . __init__( ) self. rand_weight = torch. rand( ( 20 , 20 ) , requires_grad= False ) self. linear = nn. Linear( 20 , 20 ) def forward ( self, X) : X = self. linear( X) X = F. relu( torch. mm( X, self. rand_weight) + 1 ) X = self. linear( X) while X. abs ( ) . sum ( ) > 1 : X = X / 2 return X. sum ( ) X4 = torch. rand( 2 , 20 )
net4 = FixedHiddenMLP( )
print ( net4( X4) )
class NestMLP ( nn. Module) : def __init__ ( self) : super ( ) . __init__( ) self. net = nn. Sequential( nn. Linear( 20 , 64 ) , nn. ReLU( ) , nn. Linear( 64 , 32 ) , nn. ReLU( ) ) self. linear = nn. Linear( 32 , 16 ) def forward ( self, X) : return self. linear( self. net( X) ) X5 = torch. rand( 2 , 20 )
net5 = nn. Sequential( NestMLP( ) , nn. Linear( 16 , 20 ) , FixedHiddenMLP( ) )
print ( net5( X5) ) """
tensor([[ 0.0843, -0.1867, 0.0457, 0.1082, -0.0236, -0.1245, -0.0184, 0.0233,0.1765, -0.1390],[ 0.0129, -0.1441, 0.1156, -0.0327, 0.0044, -0.0510, 0.0715, -0.0162, 0.0137, -0.1148]], grad_fn=<AddmmBackward>)
tensor([[-0.1180, 0.0799, -0.0260, 0.0529, 0.0055, -0.1481, 0.1311, -0.1334, 0.1224, 0.0713],[-0.0610, 0.0789, -0.0321, 0.0154, 0.0246, -0.1857, 0.0652, -0.0461, 0.1029, 0.1205]], grad_fn=<AddmmBackward>)
tensor([[-0.0571, -0.1119, 0.0851, 0.1362, -0.0945, 0.0078, 0.2157, -0.1273, -0.0017, 0.1981],[-0.0049, -0.0103, 0.0114, -0.0101, -0.1034, 0.0204, 0.1531, 0.0481, 0.1361, -0.0403]], grad_fn=<AddmmBackward>)
tensor(0.3121, grad_fn=<SumBackward0>)
tensor(0.1369, grad_fn=<SumBackward0>)
"""