---
# System prepended metadata

title: Deep learning
tags: [Deep learning]

---

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