Pytorchでの計算

Pytorchでの計算

テンソルとパラメーターのいくつかの使用方法をpytorchに記録します。

パラメータ

パラメータアクセス

各レイヤーのパラメーターはParameter対応するクラスの属性に格納されます。例:weightbias

# 查看所有的参数和对应属性名称
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

参照:

  1. d2l

おすすめ

転載: blog.csdn.net/lib0000/article/details/113916142