記事のディレクトリ
Pytorchでの計算
テンソルとパラメーターのいくつかの使用方法をpytorchに記録します。
パラメータ
パラメータアクセス
各レイヤーのパラメーターはParameter
、対応するクラスの属性に格納されます。例:weight
、bias
。
# 查看所有的参数和对应属性名称
print(net.state_dict())
net[2].bias # Parameter Class
net[2].bias.data = torch.randn(3,3) # the numerical value
値を直接操作する場合は
.data
、割り当てを変更する必要があることに注意してください。(または、割り当てをauto_gradでテンソルし、インプレースエラーを回避する必要がある場合は、.data
評価方法を採用する必要があります)
一度にすべてのパラメータ
nn.Module
提供された.named_parameters()
メソッドは、使用されたすべてのパラメーター(初期化パラメーター、グラデーションを設定するかどうかなど)をトラバースするためのイテレーターを返します。
for name, param in net.named_parameters():
# name 是相应的 attribute 的名字
# parameter operation
param.data = ...
# you can also use name to directly access parameter
net.state_dict()[name].data # eg. name = '2.bias'
パラメータの初期化
def init_normal(m):
"""
判断传入 m 的类型,然后据此初始化模型。
"""
if type(m) == nn,Linear:
nn.init.normal_(m.weight, std=0.01)
def my_init(m):
if isinstance(m, nn.Linear):
nn.init.uniform_(m.weight, -10, 10)
m.weight.data *= m.weight.data.abs() >= 5 # `.data` 操作
net.apply(init_normal)
パラメータ共有
ニューラルネットワークの一部のモジュールは同じパラメータを共有します。pytorchは計算グラフを作成しているため、基本的に同じオブジェクトを複数の操作に使用します。
shared = nn.Linear(8, 8)
net = nn.Sequential(nn.Linear(4, 8), nn.ReLU(),
shared, nn.ReLU(),
shared, nn.ReLU())
2番目と3番目のレイヤーの勾配を計算する場合、メモリ内の実際の勾配(1つのコピーのみ)は2つの合計になります。これは、pytorchが加算と累積の原理に基づいて勾配を計算するためです。
層
ネットワーク層をカスタマイズして、パラメーターの取得、初期化、保存、ロード、および共有を実現します。特定のパラメータの作成は、各モジュールの初期化機能で確認できます。
class MyLinear(nn.Module):
def __init__(self, in_units, out_units):
super().__init__()
self.weight = nn.Parameter(torch.randn(in_uints, out_units))
self.bias = nn.Parameter(torch.randn(out_uints,))
def forward(self, x):
linear = torch.matmul(x, self.weight.data) + self.bias.data
return linear
参照:
- d2l