CNN : Lesson 1. Convolutional Neural Network (8)


27. Convolutional Layers (Part 2)


↓下矢印↓このLessonの#27コンセプトのJupyterノートconv_visualization.ipynb

Convolutional Layer


In this notebook, we visualize four filtered outputs (a.k.a. activation maps) of a convolutional layer.
In this example, we are defining four filters that are applied to an input image by initializing the weights of a convolutional layer, but a trained CNN will learn the values of these weights.Convolutional Layer의 weight = 필터(들)의 요소 값 처음에는 Random Initialization하나 학습을 통해 weight값 발전

Import the image

import cv2
import matplotlib.pyplot as plt

%matplotlib inline

img_path = 'springmeal.jpg`           # 로컬PC Jupyter경로에 춘식사진 받아놓음


# load color image
bgr_img = cv2.imread(img_path)

# convert to grayscale
gray_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2GRAY)

# normalize, rescale entries to lie in 0~1
gray_img = gray_img.astype('float32')/255

# plot image
plt.imshow(gray_img, cmap='gray')
plt.show()

Define and visualize the filters

import numpy as np

filter_vals = np.array([[-1,-1,1,1], [-1,-1,1,1], [-1,-1,1,1], [-1,-1,1,1]])

filter_1 = filter_vals
filter_2 = -filter_1
filter_3 = filter_1.T
filter_4 = -filter_3
filters = np.array([filter_1, filter_2, filter_3, filter_4])

print(filters)
print(filters.shape)

>>>
array([[[-1, -1,  1,  1],
        [-1, -1,  1,  1],
        [-1, -1,  1,  1],
        [-1, -1,  1,  1]],

       [[ 1,  1, -1, -1],
        [ 1,  1, -1, -1],
        [ 1,  1, -1, -1],
        [ 1,  1, -1, -1]],

       [[-1, -1, -1, -1],
        [-1, -1, -1, -1],
        [ 1,  1,  1,  1],
        [ 1,  1,  1,  1]],

       [[ 1,  1,  1,  1],
        [ 1,  1,  1,  1],
        [-1, -1, -1, -1],
        [-1, -1, -1, -1]]])
        
(4, 4, 4)
4 x 4 x 4 Numpy arrayの割当て
fig = plt.figure(figsize=(10, 5))
for i in range(4):
    ax = fig.add_subplot(1, 4, i+1, xticks=[], yticks=[])
    ax.imshow(filters[i], cmap='gray')
    ax.set_title('Filter %s' % str(i+1))
    width, height = filters[i].shape
    for x in range(width):
        for y in range(height):
            ax.annotate(str(filters[i][x][y]), xy=(y,x),
                        horizontalalignment='center',
                        verticalalignment='center',
                        color='white' if filters[i][x][y]<0 else 'black')
filters可視化

Define a convolutional layer


For a convolutional neural network, we'll start by defining a:
  • Convolutional layer
  • Initialize a single convolutional layer so that it contains all your created filters. Note that you are not training this network; you are initializing the weights in a convolutional layer so that you can visualize what happens after a forward pass through this network!filters[!] CNN을 위해서, Convolutional Layer를 먼저 만들어볼것이다.

    現段階ではConvolutional Layerを訓練するフィルタ重み値ではない.and __init__


    To define a neural network in PyTorch, you define the layers of a model in the function forward and define the forward behavior of a network that applies those initialized layers to an input ( __init__ ) in the function x . In PyTorch we convert all inputs into the Tensor datatype, which is similar to a list data type in Python.
    Below, I define the structure of a class called forward that has a convolutional layer that can contain four 4x4 grayscale filters.Net PyTorch에서의 (model의) Layer를 만들때에는 꼭? __init__과 forward method가 있어야한다.
    import torch
    import torch.nn as nn
    import torch.nn.functional as F
        
    # define a neural network with a single convolutional layer with four filters
    class Net(nn.Module):
        
        def __init__(self, weight):
            super(Net, self).__init__()
            # initializes the weights of the convolutional layer to be the weights of the 4 defined filters
            k_height, k_width = weight.shape[2:]
            # assumes there are 4 grayscale filters
            self.conv = nn.Conv2d(1, 4, kernel_size=(k_height, k_width), bias=False)
            self.conv.weight = torch.nn.Parameter(weight)
    
        def forward(self, x):
            # calculates the output of a convolutional layer
            # pre- and post-activation
            conv_x = self.conv(x)
            activated_x = F.relu(conv_x)
            
            # returns both layers
            return conv_x, activated_x
        
    # instantiate the model and set the weights
    weight = torch.from_numpy(filters).unsqueeze(1).type(torch.FloatTensor)
    model = Net(weight)
    
    # print out the layer in the network
    print(model)
    
    >>>
    Net(
      (conv): Conv2d(1, 4, kernel_size=(4, 4), stride=(1, 1), bias=False)
    )
  • 아래 코드에서 gray이미지에 대한 4x4 filter를 가진 Convolutional Layer를 가진 Class를 만들어보겠다.:このコードより下のコードを見るとk_height, k_width = weight.shape[2:]weight、つまり先ほど発表したフィルタ(4 x 4 x 4)から来ていることがわかります.ちなみにtorch.from_numpy(filters)なんですか?
  • [+]Tensorの削除.shape[2:]:シングル次元
    [+]Tensor加入.squeeze:0表示一次元,加入1表示二次元...位置に1次元を追加する.
    [!] .unsqueeze実際のテンソルや配列は一切返さず、実形状に関する情報のみをテキストとして返す.(次のコードを見て)
    # weight = torch.from_numpy(filters).unsqueeze(1).type(torch.FloatTensor)
    weight.shape
    
    >>>
    torch.Size([4, 1, 4, 4])      # .unsqueeze(1)을 통해 4x4x4 tensor가 4x1x4x4 tensor가 됨
    
    ---------------------------------
    
    a, b = weight.shape[2:]
    print(a,b)
    
    >>>
    4 4
  • shape:PyTorchのnnのConv 2 dを使用.
  • # helper function for visualizing the output of a given layer
    # default number of filters is 4
    def viz_layer(layer, n_filters= 4):
        fig = plt.figure(figsize=(20, 20))
        
        for i in range(n_filters):
            ax = fig.add_subplot(1, n_filters, i+1, xticks=[], yticks=[])
            # grab layer outputs
            ax.imshow(np.squeeze(layer[0,i].data.numpy()), cmap='gray')
            ax.set_title('Output %s' % str(i+1))
            
    [+]Layerからの出力画像を可視化するためのヘルプ関数です(参照のみ)
    Let's look at the output of a convolutional layer, before and after a ReLu activation function is applied.
    `convolutional layer
    # plot original image
    plt.imshow(gray_img, cmap='gray')
    
    # visualize all filters
    fig = plt.figure(figsize=(12, 6))
    fig.subplots_adjust(left=0, right=1.5, bottom=0.8, top=1, hspace=0.05, wspace=0.05)
    for i in range(4):
        ax = fig.add_subplot(1, 4, i+1, xticks=[], yticks=[])
        ax.imshow(filters[i], cmap='gray')
        ax.set_title('Filter %s' % str(i+1))
    
        
    # convert the image into an input Tensor
    gray_img_tensor = torch.from_numpy(gray_img).unsqueeze(0).unsqueeze(1)
    
    # get the convolutional layer (pre and post activation)
    conv_layer, activated_layer = model(gray_img_tensor)
    
    # visualize the output of a conv layer
    viz_layer(conv_layer)