CNN : Lesson 1. Convolutional Neural Network (8)
37118 ワード
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:
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)
なんですか?.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)
Reference
この問題について(CNN : Lesson 1. Convolutional Neural Network (8)), 我々は、より多くの情報をここで見つけました https://velog.io/@olxtar/Deep-Learning-CNN-Lesson-1.-Convolutional-Neural-Network-8テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol