【pytorch】bufferの使用
7791 ワード
作文の背景:最近pix 2 pix、cycleganとpix 2 pixHDのコードを研究して、自分がpytorchに対して根本的に何もできないことを発見して、だからコードの中で現れる自分の分からない地方に対してCSDNの上で書くことを準備して、自分の学習過程と学習の難点を記録して、自分の学習の心得を分かち合います.
buffer:pytorchは通常、ネットワーク内のパラメータをOrderedDict形式で保存します.その中のパラメータは実は2種類を含む:1つはモデルの中の各種moduleが含むパラメータであるnn.Parameter、私たちはネットワークで他のnnを定義することができます.パラメータ.もう一つはbufferです.使用中、前者はoptim毎である.Stepは後者を更新せずに更新されます.
コードによって、以下の小さな結論が得られます. Parameterとbufferを定義するには、Tensorに転送するだけです.gpuに変換する必要もありません.これは、ネットワークが進行するときに行うためである.Cuda()の場合、内側の層のパラメータ、bufferなどを自動的に対応するGPUに変換します. self.register_bufferはtensorをbufferとして登録する、forwardでselfを使用することができる.selfではなくmybuffermybuffer_tmp; ネットワークストレージ時にもbufferが格納され、ネットワークloadモデルの場合、格納されたモデルのbufferも付与される. optim.Stepはnnのみ更新できます.パラメータタイプのパラメータですが、bufferの更新はforwardです.
buffer:pytorchは通常、ネットワーク内のパラメータをOrderedDict形式で保存します.その中のパラメータは実は2種類を含む:1つはモデルの中の各種moduleが含むパラメータであるnn.Parameter、私たちはネットワークで他のnnを定義することができます.パラメータ.もう一つはbufferです.使用中、前者はoptim毎である.Stepは後者を更新せずに更新されます.
class myModel(nn.Module):
def __init__(self, kernel_size=3):
super(Depth_guided1, self).__init__()
self.kernel_size = kernel_size
self.back_end = torch.nn.Sequential(
torch.nn.Conv2d(3, 32, 3, padding=1),
torch.nn.ReLU(True),
torch.nn.Conv2d(3, 64, 3, padding=1),
torch.nn.ReLU(True),
torch.nn.Conv2d(64, 3, 3, padding=1),
torch.nn.ReLU(True),
)
mybuffer = np.arange(1,10,1)
self.mybuffer_tmp = np.randn((len(mybuffer), 1, 1, 10), dtype='float32')
self.mybuffer_tmp = torch.from_numpy(self.mybuffer_tmp)
# register preset variables as buffer
# So that, in testing , we can use buffer variables.
self.register_buffer('mybuffer', self.mybuffer_tmp)
# Learnable weights
self.conv_weights = nn.Parameter(torch.FloatTensor(64, 10).normal_(mean=0, std=0.01))
# Other code
def forward(self):
...
# self.mybuffer!
コードによって、以下の小さな結論が得られます.