卷積神經網路計算過程中的維度變化

2021-09-29 04:28:13 字數 3110 閱讀 2279

最近在學習pytorch, 在閱讀pytorch教程的時候,發現有乙個簡單的卷積神經網路,之前搞明白過這個過程,時間太久,都忘的差不多了, 正好寫個筆記記錄總結一下

**如下:

#! usr/bin/env python3

# -*- coding:utf-8 -*-

""" @author:macan

@time:2019/10/29 19:59

@file:torch_net.py

@mail:[email protected]

"""from __future__ import absolute_import

from __future__ import division

from __future__ import print_function

import torch

import torch.nn as nn

import torch.nn.functional as f

class net(nn.module):

def __init__(self):

super(net, self).__init__()

self.conv1 = nn.conv2d(in_channels=1, out_channels=6, kernel_size=5)

self.conv2 = nn.conv2d(6, 16, 5)

self.fc1 = nn.linear(16 * 5 * 5, 128)

self.fc2 = nn.linear(128, 64)

self.fc3 = nn.linear(64, 10)

def forward(self, x):

x = self.conv1(x)

print('x1 {}'.format(x.size()))

x = f.max_pool2d(f.relu(x), (2, 2))

print('x2 {}'.format(x.size()))

x = self.conv2(x)

print('x3 {}'.format(x.size()))

x = f.max_pool2d(f.relu(x), 2)

print('x4: {}'.format(x.size()))

x = x.view(-1, self.num_flat_features(x))

print('x5: {}'.format(x.size()))

x = f.relu(self.fc1(x))

print('x6: {}'.format(x.size()))

x = f.relu(self.fc2(x))

print('x7: {}'.format(x.size()))

x = self.fc3(x)

print('x8: {}'.format(x.size()))

return x

def num_flat_features(self, x):

size = x.size()[1:] # 除了batch 外的其他緯度值

print('size: {}'.format(size))

num_features = 1

for s in size:

num_features *= s

return num_features

if __name__ == '__main__':

net = net()

print(net)

input = torch.randn(1, 1, 32, 32)

out = net(input)

print(out)

執行這個**,輸出如下:

net(

(conv1): conv2d(1, 6, kernel_size=(5, 5), stride=(1, 1))

(conv2): conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))

(fc1): linear(in_features=400, out_features=128, bias=true)

(fc2): linear(in_features=128, out_features=64, bias=true)

(fc3): linear(in_features=64, out_features=10, bias=true)

)x1 torch.size([1, 6, 28, 28])

x2 torch.size([1, 6, 14, 14])

x3 torch.size([1, 16, 10, 10])

x4: torch.size([1, 16, 5, 5])

size: torch.size([16, 5, 5])

x5: torch.size([1, 400])

x6: torch.size([1, 128])

x7: torch.size([1, 64])

x8: torch.size([1, 10])

tensor([[ 0.0684, 0.0224, -0.0527, -0.1091, 0.0603, -0.0389, -0.0848, -0.0689,

0.0107, -0.0398]], grad_fn=)

為了觀察每個過程的維度變化,我寫了一些print操作,其實維度變化已經很明顯了,下面來具體計算一下每個維度是怎麼計算的到的

第0層:網路的輸入[1, 1, 32, 32],其中第一維是batch_size, 第二維是input_channel,後面兩維是資料的大小,

第1層:卷積層(convolution layer).第一層使用的卷積核大小為[5, 5],卷積核(filter)的輸出深度為6(output_channel),使用不填充,步長為1.不填充的情況下,輸出的矩陣大小為32 -5 + 1 = 28.因此第一層卷積輸出的feature_map的大小為[28, 28, 6].

第2層:池化層(pooling layer). 池化層過濾器大小[2, 2],步長為2.第二層的輸出維度(28-2)/2 + 1(括號裡面的「2」是kernel的對應維度, 「/2」的2是步長)。因此第二層的的大小為[14,14,6].

後面的維度以此類推了。

一維卷積神經網路 卷積神經網路中的計算

卷積的基本介紹 卷積操作後張量的大小計算 卷積參數量的計算 卷積flops的計算 感受野的計算 卷積神經網路中的卷積是指定義好卷積核 kernel 並對影象 或者特徵圖,feature map 進行滑動匹配,即對應位置相乘再相加。其特點就在於能夠捕捉區域性的空間特徵。具體過程如下圖所示 圖1 二維卷...

卷積神經網路中的引數計算

舉例1 比如輸入是乙個32x32x3的影象,3表示rgb三通道,每個filter kernel是5x5x3,乙個卷積核產生乙個feature map,下圖中,有6個5x5x3的卷積核,故輸出6個feature map activation map 大小即為28x28x6。下圖中,第二層到第三層,其中...

卷積神經網路中的引數計算

從keras中執行卷積神經網路我們呼叫model.summary 會發現所定義卷積神經網路的引數情況。我們寫這樣乙個卷積網路 from keras import models from keras import layers model models.sequential model.add lay...