###### tags: `Deep learning`
# Deep learning
## kernel size
* 1*n+3=10 -> n=7,total=n+1=8(因為最後一個conv也須加進去)

* 2*n+3=10 -> n=3,total=n+1=4(因為最後一個conv也須加進去)

### 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類別分類,

```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