pytorch에서 커널을 변경하여 동일한 이미지에 대해 conv2d하는 메모
                                            
                                                
                                                
                                                
                                                
                                                
                                                 3314 단어  PyTorchconvolution
                    
배경
mode=fft 에서 빨리 할 수 있지만, 근사적인 결과가 될 것 같아...?) 그래서, pytorch 로 처리한다 (CUDA 를 사용할 수 있으면 GPU 로 고속화가 (예상 가능) depthwise convolution (
Conv2d에서 groups 설정)이 필요한지 궁금했지만 in_channel = 1, out_channel = N에서 OK였습니다.절차
weight는
[N, 1, KH, KW]로 만들 수 있습니다.device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')
kernel_size = [3, 3]
num_kernels = 4
kernel = torch.zeros([num_kernels, 1, kernel_size[1], kernel_size[0]], dtype=torch.float32).to(device)
# テスト用に channel ごとに all 1s, 2s, 3s, ... なのを用意する
for i in range(num_kernels):
    kernel[i] = float(i) + 1
print(kernel)
tensor([[[[1., 1., 1.],
          [1., 1., 1.],
          [1., 1., 1.]]],
        [[[2., 2., 2.],
          [2., 2., 2.],
          [2., 2., 2.]]],
        [[[3., 3., 3.],
          [3., 3., 3.],
          [3., 3., 3.]]],
        [[[4., 4., 4.],
          [4., 4., 4.],
          [4., 4., 4.]]]], device='cuda:0')
그런 다음 다음과 같이 conv2d를 설정 + 실행하십시오!
# assume default stride and dilation and odd kernel size 
conv = torch.nn.Conv2d(1, num_kernels, kernel_size, padding=[kernel_size[1]//2, kernel_size[0] // 2], bias=False, padding_mode='replicate')
conv.weight = torch.nn.Parameter(kernel)
img = np.ones(img_size).astype('float32')
x = torch.from_numpy(img).to(device)
# [h, w] -> [1, 1(c), h, w]
x = torch.unsqueeze(torch.unsqueeze(x, 0), 0)
# forward pass(eval convolution)
with torch.no_grad():
    f = conv(x)
f = f.to('cpu')
print(f)
tensor([[[[ 9.,  9.,  9.,  ...,  9.,  9.,  9.],
          [ 9.,  9.,  9.,  ...,  9.,  9.,  9.],
          [ 9.,  9.,  9.,  ...,  9.,  9.,  9.],
          ...,
          [ 9.,  9.,  9.,  ...,  9.,  9.,  9.],
          [ 9.,  9.,  9.,  ...,  9.,  9.,  9.],
          [ 9.,  9.,  9.,  ...,  9.,  9.,  9.]],
         [[18., 18., 18.,  ..., 18., 18., 18.],
          [18., 18., 18.,  ..., 18., 18., 18.],
          [18., 18., 18.,  ..., 18., 18., 18.],
          ...,
          [18., 18., 18.,  ..., 18., 18., 18.],
          [18., 18., 18.,  ..., 18., 18., 18.],
          [18., 18., 18.,  ..., 18., 18., 18.]],
         [[27., 27., 27.,  ..., 27., 27., 27.],
          [27., 27., 27.,  ..., 27., 27., 27.],
          [27., 27., 27.,  ..., 27., 27., 27.],
          ...,
          [27., 27., 27.,  ..., 27., 27., 27.],
          [27., 27., 27.,  ..., 27., 27., 27.],
          [27., 27., 27.,  ..., 27., 27., 27.]],
         [[36., 36., 36.,  ..., 36., 36., 36.],
          [36., 36., 36.,  ..., 36., 36., 36.],
          [36., 36., 36.,  ..., 36., 36., 36.],
          ...,
          [36., 36., 36.,  ..., 36., 36., 36.],
          [36., 36., 36.,  ..., 36., 36., 36.],
          [36., 36., 36.,  ..., 36., 36., 36.]]]])
Voila!
Channel (layer)마다 다른 kernel이 적용되고 있습니다!
TODO
RGB 이미지로 시도
Reference
이 문제에 관하여(pytorch에서 커널을 변경하여 동일한 이미지에 대해 conv2d하는 메모), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/syoyo/items/3c98309cf395c9013d13텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)