【pytorch】bufferの使用

7791 ワード

作文の背景:最近pix 2 pix、cycleganとpix 2 pixHDのコードを研究して、自分がpytorchに対して根本的に何もできないことを発見して、だからコードの中で現れる自分の分からない地方に対してCSDNの上で書くことを準備して、自分の学習過程と学習の難点を記録して、自分の学習の心得を分かち合います.
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!

コードによって、以下の小さな結論が得られます.
  • 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です.