###### tags: `Deep learning` # Deep learning ## kernel size * 1*n+3=10 -> n=7,total=n+1=8(因為最後一個conv也須加進去) ![](https://i.imgur.com/evJqou4.png =50%x) * 2*n+3=10 -> n=3,total=n+1=4(因為最後一個conv也須加進去) ![](https://i.imgur.com/zaS2gED.png =50%x) ### Example[1] 以下範例為[1]的sample code,以此sample code解釋以上convolution後的size ### **Input**: >為2D MNIST images ,共60000 pcs的28x28 image,每一張依序進行convolution,因此input shape=(1,28,28)意思為1張28x28的Image ### **cnn1**: * **in_channels=1** >輸入為1x28x28,故channel只有1 * **kernel_size=5, stride=1, padding=0** >kernel size為5(W)x5(H),stride=1意思為每一次往右移動1格,padding=0,沒有向外擴增,因此1n+5=28,因此n=23,但最後一次conv也要算,因此總共n=23+1=24,故conv後的size變為24x24 * **out_channels=16** >共有16層的kernel,因此在conv後可得到16x24x24,outputshape=(16,24,24) * **maxpool1:** >kernelsize=意思為在2x2大小中的pixel取出其中最大的pixel最為最後的pixel,因此24/2=12,outputshape=(16,12,12) ### **cnn2** * **in_channels=16** >輸入為16x12x12,故channel有16層 * **kernel_size=5, stride=1, padding=0** >kernel size為5(W)x5(H),stride=1意思為每一次往右移動1格,padding=0,沒有向外擴增,因此1n+5=12,因此n=7,但最後一次conv也要算,因此總共n=7+1=8,故conv後的size變為8x8 * **out_channels=32** >共有16層的kernel,因此在conv後可得到32x8x8,outputshape=(32,8,8) * **maxpool2:** >kernelsize=意思為在2x2大小中的pixel取出其中最大的pixel最為最後的pixel,因此8/2=4,outputshape=(32,4,4) ### fc1[2] * **nn.Linear(32 * 4 * 4, 10)** 2D需要轉為1D,因此使用Flatten,Flatten後再連到output layer,因此會將32x4x4進行Flatten,第二個參數為output layer的neuron數量10類別分類, ![](https://i.imgur.com/XzF4e9O.png =80%x) ```javascript= # Create CNN Model class CNN_Model(nn.Module): def __init__(self): super(CNN_Model, self).__init__() # Convolution 1 , input_shape=(1,28,28) self.cnn1 = nn.Conv2d(in_channels=1, out_channels=16, kernel_size=5, stride=1, padding=0) #output_shape=(16,24,24) self.relu1 = nn.ReLU() # activation # Max pool 1 self.maxpool1 = nn.MaxPool2d(kernel_size=2) #output_shape=(16,12,12) # Convolution 2 self.cnn2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=5, stride=1, padding=0) #output_shape=(32,8,8) self.relu2 = nn.ReLU() # activation # Max pool 2 self.maxpool2 = nn.MaxPool2d(kernel_size=2) #output_shape=(32,4,4) # Fully connected 1 ,#input_shape=(32*4*4) self.fc1 = nn.Linear(32 * 4 * 4, 10) def forward(self, x): # Convolution 1 out = self.cnn1(x) out = self.relu1(out) # Max pool 1 out = self.maxpool1(out) # Convolution 2 out = self.cnn2(out) out = self.relu2(out) # Max pool 2 out = self.maxpool2(out) out = out.view(out.size(0), -1) # Linear function (readout) out = self.fc1(out) return out ``` ## Reference 1. https://hackmd.io/@lido2370/SJMPbNnKN?type=view 2. https://zhuanlan.zhihu.com/p/86586480