您當前的位置:首頁 > 書法

13.初識Pytorch之復現VGG16及卷積神經網路圖的視覺化(Tensorboard)

作者:由 遊客26024 發表于 書法時間:2022-02-03

搭建VGG16網路

13.初識Pytorch之復現VGG16及卷積神經網路圖的視覺化(Tensorboard)

用黃框畫出vgg中vgg16的部分,將此網路分為8個部分,s1(stage 1),s2(stage 2),s3(stage 3),s4,s5,s6,s7,s8,其中stage 出自RetinaNet

13.初識Pytorch之復現VGG16及卷積神經網路圖的視覺化(Tensorboard)

分析

公式

out_size

=

1

+

in_size

+

2

*

padding_size

-

kernel_size

/

stride

1。

input_1

224

*

224

*

3

->

112

*

112

*

64

其後有2層卷積層與1層最大池化層

224

*

224

*

3

->

224

*

224

*

64

所以input_1_1

->

conv

relu

代入公式

1

224

=

1

+

224

+

2

*

padding_size

-

kernel_size

/

stride

假設stride

=

1

->

224

=

1

+

224

+

2

*

padding_size

-

kernel_size

->

0

=

1

+

2

*

padding_size

-

kernel_size

假設padding_size

=

1

kernel_size

=

3

nn

Conv2d

in_channels

=

3

out_channels

=

64

padding

=

1

kernel_size

=

3

stride

=

1

self

relu1_1

=

nn

ReLU

inplace

=

False

)[

inplace為是否覆蓋以前的結果

False為不覆蓋

且用一個新的變數來接

True為覆蓋

224

*

224

*

64

->

224

*

224

*

64

input_1_2

->

conv

relu

nn

Conv2d

in_channels

=

64

out_channels

=

64

padding

=

1

kernel_size

=

3

stride

=

1

self

relu1_2

=

nn

ReLU

inplace

=

False

224

*

224

*

64

->

112

*

112

*

64

再計算maxpool層

input1_3

代入公式

1

112

=

1

+

224

+

2

*

padding_size

-

kernel_size

/

stride

假設stride

=

2

->

112

=

1

+

112

+

padding_size

-

kernel_size

/

2

->

0

=

1

+

padding_size

-

kernel_size

/

2

假設padding_size

=

0

kernel_size

/

2

=

1

->

kernel_size

=

2

nn

MaxPool2d

padding

=

0

kernel_size

=

2

stride

=

2

2。

input_2

112

*

112

*

64

->

56

*

56

*

128

其後有2層卷積層與1層最大池化層

112

*

112

*

64

->

112

*

112

*

128

input2_1

->

conv

relu

nn

Conv2d

in_channels

=

64

out_channels

=

128

padding

=

1

kernel_size

=

3

stride

=

1

self

relu2_1

=

nn

ReLU

inplace

=

False

112

*

112

*

128

->

112

*

112

*

128

input2_2

->

conv

relu

nn

Conv2d

in_channels

=

128

out_channels

=

128

padding

=

1

kernel_size

=

3

stride

=

1

self

relu2_2

=

nn

ReLU

inplace

=

False

112

*

112

*

128

->

56

*

56

*

128

input2_3

->

maxpool

nn

MaxPool2d

padding

=

0

kernel_size

=

2

stride

=

2

3。

input_3

56

*

56

*

128

->

28

*

28

*

256

其後有3層卷積層與1層最大池化層

56

*

56

*

128

->

56

*

56

*

256

input3_1

->

conv

relu

nn

Conv2d

in_channels

=

128

out_channels

=

256

padding

=

1

kernel_size

=

3

stride

=

1

self

relu3_1

=

nn

ReLU

inplace

=

False

56

*

56

*

256

->

56

*

56

*

256

input3_2

->

conv

relu

nn

Conv2d

in_channels

=

256

out_channels

=

256

padding

=

1

kernel_size

=

3

stride

=

1

self

relu3_2

=

nn

ReLU

inplace

=

False

56

*

56

*

256

->

56

*

56

*

256

input3_3

->

conv

relu

nn

Conv2d

in_channels

=

256

out_channels

=

256

padding

=

1

kernel_size

=

3

stride

=

1

self

relu3_3

=

nn

ReLU

inplace

=

False

56

*

56

*

256

->

28

*

28

*

256

input_3_4

->

maxpool

nn

MaxPool2d

padding

=

0

kernel_size

=

2

stride

=

2

4。

input_4

28

*

28

*

256

->

14

*

14

*

512

其後有3層卷積層與1層最大池化層

28

*

28

*

256

->

28

*

28

*

512

input_4_1

->

conv

relu

nn

Conv2d

in_channels

=

256

out_channels

=

512

padding

=

1

kernel_size

=

3

stride

=

1

self

relu4_1

=

nn

ReLU

inplace

=

False

28

*

28

*

512

->

28

*

28

*

512

input_4_2

->

conv

relu

nn

Conv2d

in_channels

=

512

out_channels

=

512

padding

=

1

kernel_size

=

3

stride

=

1

self

relu4_2

=

nn

ReLU

inplace

=

False

28

*

28

*

512

->

28

*

28

*

512

input_4_3

->

conv

relu

nn

Conv2d

in_channels

=

512

out_channels

=

512

padding

=

1

kernel_size

=

3

stride

=

1

self

relu4_3

=

nn

ReLU

inplace

=

False

28

*

28

*

512

->

14

*

14

*

512

input_4_4

->

maxpool

nn

MaxPool2d

padding

=

0

kernel_size

=

2

stride

=

2

5。

input_5

14

*

14

*

512

->

7

*

7

*

512

其後有3層卷積層與1層最大池化層

14

*

14

*

512

->

14

*

14

*

512

input5_1

->

conv

relu

nn

Conv2d

in_channels

=

512

out_channels

=

512

padding

=

1

kernel_size

=

3

stride

=

1

self

relu5_1

=

nn

ReLU

inplace

=

False

14

*

14

*

512

->

14

*

14

*

512

input5_2

->

conv

relu

nn

Conv2d

in_channels

=

512

out_channels

=

512

padding

=

1

kernel_size

=

3

stride

=

1

self

relu5_2

=

nn

ReLU

inplace

=

False

14

*

14

*

512

->

14

*

14

*

512

input5_3

->

conv

relu

nn

Conv2d

in_channels

=

512

out_channels

=

512

padding

=

1

kernel_size

=

3

stride

=

1

self

relu5_3

=

nn

ReLU

inplace

=

False

14

*

14

*

512

->

7

*

7

*

512

input_5_4

->

maxpool

nn

MaxPool2d

padding

=

0

kernel_size

=

2

stride

=

2

6。

input_6

7

*

7

*

512

->

1

*

1

*

4096

展平

nn

flatten

()

nn

linear

7

*

7

*

512

1

*

1

*

4096

self

relu6

=

nn

ReLU

inplace

=

False

nn

Dropout

0。5

7。

input_7

4096

->

4096

nn

linear

4096

4096

self

relu7

=

nn

ReLU

inplace

=

False

nn

Dropout

0。5

8。

input_8

1

*

1

*

4096

->

1

*

1

*

100

nn

linear

4096

1000

self

relu8

=

nn

ReLU

inplace

=

False

上程式碼 1

import

torch

from

torch

import

nn

class

vgg_16

nn

Module

):

def

__init__

self

):

super

vgg_16

self

__init__

()

# input_1

# input_1_1 224*224*3 -> 224*224*64

self

conv1_1

=

nn

Conv2d

in_channels

=

3

out_channels

=

64

padding

=

1

kernel_size

=

3

stride

=

1

self

relu1_1

=

nn

ReLU

inplace

=

False

# input_1_2 224*224*64 -> 224*224*64

self

conv1_2

=

nn

Conv2d

in_channels

=

64

out_channels

=

64

padding

=

1

kernel_size

=

3

stride

=

1

self

relu1_2

=

nn

ReLU

inplace

=

False

# input_1_3 224*224*64 -> 112*112*64

self

maxpool1_3

=

nn

MaxPool2d

padding

=

0

stride

=

2

kernel_size

=

2

# input_2

# input_2_1 112*112*64 -> 112*112*128

self

conv2_1

=

nn

Conv2d

in_channels

=

64

out_channels

=

128

padding

=

1

kernel_size

=

3

stride

=

1

self

relu2_1

=

nn

ReLU

inplace

=

False

# input_2_2 112*112*128 -> 112*112*128

self

conv2_2

=

nn

Conv2d

in_channels

=

128

out_channels

=

128

padding

=

1

kernel_size

=

3

stride

=

1

self

relu2_2

=

nn

ReLU

inplace

=

False

# input_2_3 112*112*128 -> 56*56*128

self

maxpool2_3

=

nn

MaxPool2d

padding

=

0

stride

=

2

kernel_size

=

2

# input_3

# input_3_1 56*56*128 -> 56*56*256

self

conv3_1

=

nn

Conv2d

in_channels

=

128

out_channels

=

256

padding

=

1

kernel_size

=

3

stride

=

1

self

relu3_1

=

nn

ReLU

inplace

=

False

# input_3_2 56*56*256 -> 56*56*256

self

conv3_2

=

nn

Conv2d

in_channels

=

256

out_channels

=

256

padding

=

1

kernel_size

=

3

stride

=

1

self

relu3_2

=

nn

ReLU

inplace

=

False

# input_3_3 56*56*256 -> 56*56*256

self

conv3_3

=

nn

Conv2d

in_channels

=

256

out_channels

=

256

padding

=

1

kernel_size

=

3

stride

=

1

self

relu3_3

=

nn

ReLU

inplace

=

False

# input_3_4 56*56*256 -> 28*28*256

self

maxpool3_4

=

nn

MaxPool2d

padding

=

0

stride

=

2

kernel_size

=

2

# input_4

# input_4_1 28*28*256 -> 28*28*512

self

conv4_1

=

nn

Conv2d

in_channels

=

256

out_channels

=

512

padding

=

1

kernel_size

=

3

stride

=

1

self

relu4_1

=

nn

ReLU

inplace

=

False

# input_4_2 28*28*512 -> 28*28*512

self

conv4_2

=

nn

Conv2d

in_channels

=

512

out_channels

=

512

padding

=

1

kernel_size

=

3

stride

=

1

self

relu4_2

=

nn

ReLU

inplace

=

False

# input_4_3 28*28*512 -> 28*28*512

self

conv4_3

=

nn

Conv2d

in_channels

=

512

out_channels

=

512

padding

=

1

kernel_size

=

3

stride

=

1

self

relu4_3

=

nn

ReLU

inplace

=

False

# input_4_4 28*28*512 -> 14*14*512

self

maxpool4_4

=

nn

MaxPool2d

padding

=

0

stride

=

2

kernel_size

=

2

# input_5

# input_5_1 14*14*512 -> 14*14*512

self

conv5_1

=

nn

Conv2d

in_channels

=

512

out_channels

=

512

padding

=

1

kernel_size

=

3

stride

=

1

self

relu5_1

=

nn

ReLU

inplace

=

False

# input_5_2 14*14*512 -> 14*14*512

self

conv5_2

=

nn

Conv2d

in_channels

=

512

out_channels

=

512

padding

=

1

kernel_size

=

3

stride

=

1

self

relu5_2

=

nn

ReLU

inplace

=

False

# input_5_3 14*14*512 -> 14*14*512

self

conv5_3

=

nn

Conv2d

in_channels

=

512

out_channels

=

512

padding

=

1

kernel_size

=

3

stride

=

1

self

relu5_3

=

nn

ReLU

inplace

=

False

# input_5_4 14*14*512 -> 7*7*512

self

maxpool5_4

=

nn

MaxPool2d

padding

=

0

kernel_size

=

2

stride

=

2

self

flatten

=

nn

Flatten

()

self

linear6

=

nn

Linear

7

*

7

*

512

4096

self

relu6

=

nn

ReLU

inplace

=

False

self

drouout6

=

nn

Dropout

0。5

self

linear7

=

nn

Linear

4096

4096

self

relu7

=

nn

ReLU

inplace

=

False

self

drouout7

=

nn

Dropout

0。5

self

linear8

=

nn

Linear

4096

1000

self

relu8

=

nn

ReLU

inplace

=

False

def

forward

self

x

):

# stage 1

x

=

self

conv1_1

x

x

=

self

relu1_1

x

x

=

self

conv1_2

x

x

=

self

conv1_2

x

x

=

self

maxpool1_3

x

# stage 2

x

=

self

conv2_1

x

x

=

self

relu2_1

x

x

=

self

conv2_2

x

x

=

self

relu2_2

x

x

=

self

maxpool2_3

x

# stage 3

x

=

self

conv3_1

x

x

=

self

relu3_1

x

x

=

self

conv3_2

x

x

=

self

relu3_2

x

x

=

self

conv3_3

x

x

=

self

relu3_3

x

x

=

self

maxpool3_4

x

# stage 4

x

=

self

conv4_1

x

x

=

self

relu4_1

x

x

=

self

conv4_2

x

x

=

self

relu4_2

x

x

=

self

conv4_3

x

x

=

self

relu4_3

x

x

=

self

maxpool4_4

x

# stage 5

x

=

self

conv5_1

x

x

=

self

relu5_1

x

x

=

self

conv5_2

x

x

=

self

relu5_2

x

x

=

self

conv5_3

x

x

=

self

relu5_3

x

x

=

self

maxpool5_4

x

# stage 6

x

=

self

flatten

x

x

=

self

linear6

x

x

=

self

relu6

x

x

=

self

drouout6

x

# stage 7

x

=

self

linear7

x

x

=

self

relu7

x

x

=

self

drouout7

x

# stage 8

x

=

self

linear8

x

x

=

self

relu8

x

return

x

if

__name__

==

“__main__”

vgg_16

=

vgg_16

()

print

vgg_16

input

=

torch

ones

1

3

224

224

output

=

vgg_16

input

print

output

結果:

13.初識Pytorch之復現VGG16及卷積神經網路圖的視覺化(Tensorboard)

13.初識Pytorch之復現VGG16及卷積神經網路圖的視覺化(Tensorboard)

13.初識Pytorch之復現VGG16及卷積神經網路圖的視覺化(Tensorboard)

13.初識Pytorch之復現VGG16及卷積神經網路圖的視覺化(Tensorboard)

13.初識Pytorch之復現VGG16及卷積神經網路圖的視覺化(Tensorboard)

。。。

13.初識Pytorch之復現VGG16及卷積神經網路圖的視覺化(Tensorboard)

上程式碼 2

import

torch

from

torch

import

nn

class

vgg_16

nn

Module

):

def

__init__

self

):

super

vgg_16

self

__init__

()

self

module

=

nn

Sequential

# input_1

# input_1_1 224*224*3 -> 224*224*64

nn

Conv2d

in_channels

=

3

out_channels

=

64

padding

=

1

kernel_size

=

3

stride

=

1

),

nn

ReLU

inplace

=

True

),

# input_1_2 224*224*64 -> 224*224*64

nn

Conv2d

in_channels

=

64

out_channels

=

64

padding

=

1

kernel_size

=

3

stride

=

1

),

nn

ReLU

inplace

=

True

),

# input_1_3 224*224*64 -> 112*112*64

nn

MaxPool2d

padding

=

0

stride

=

2

kernel_size

=

2

),

# input_2

# input_2_1 112*112*64 -> 112*112*128

nn

Conv2d

in_channels

=

64

out_channels

=

128

padding

=

1

kernel_size

=

3

stride

=

1

),

nn

ReLU

inplace

=

True

),

# input_2_2 112*112*128 -> 112*112*128

nn

Conv2d

in_channels

=

128

out_channels

=

128

padding

=

1

kernel_size

=

3

stride

=

1

),

nn

ReLU

inplace

=

True

),

# input_2_3 112*112*128 -> 56*56*128

nn

MaxPool2d

padding

=

0

stride

=

2

kernel_size

=

2

),

# input_3

# input_3_1 56*56*128 -> 56*56*256

nn

Conv2d

in_channels

=

128

out_channels

=

256

padding

=

1

kernel_size

=

3

stride

=

1

),

nn

ReLU

inplace

=

True

),

# input_3_2 56*56*256 -> 56*56*256

nn

Conv2d

in_channels

=

256

out_channels

=

256

padding

=

1

kernel_size

=

3

stride

=

1

),

nn

ReLU

inplace

=

True

),

# input_3_3 56*56*256 -> 56*56*256

nn

Conv2d

in_channels

=

256

out_channels

=

256

padding

=

1

kernel_size

=

3

stride

=

1

),

nn

ReLU

inplace

=

True

),

# input_3_4 56*56*256 -> 28*28*256

nn

MaxPool2d

padding

=

0

stride

=

2

kernel_size

=

2

),

# input_4

# input_4_1 28*28*256 -> 28*28*512

nn

Conv2d

in_channels

=

256

out_channels

=

512

padding

=

1

kernel_size

=

3

stride

=

1

),

nn

ReLU

inplace

=

True

),

# input_4_2 28*28*512 -> 28*28*512

nn

Conv2d

in_channels

=

512

out_channels

=

512

padding

=

1

kernel_size

=

3

stride

=

1

),

nn

ReLU

inplace

=

True

),

# input_4_3 28*28*512 -> 28*28*512

nn

Conv2d

in_channels

=

512

out_channels

=

512

padding

=

1

kernel_size

=

3

stride

=

1

),

nn

ReLU

inplace

=

True

),

# input_4_4 28*28*512 -> 14*14*512

nn

MaxPool2d

padding

=

0

stride

=

2

kernel_size

=

2

),

# input_5

# input_5_1 14*14*512 -> 14*14*512

nn

Conv2d

in_channels

=

512

out_channels

=

512

padding

=

1

kernel_size

=

3

stride

=

1

),

nn

ReLU

inplace

=

True

),

# input_5_2 14*14*512 -> 14*14*512

nn

Conv2d

in_channels

=

512

out_channels

=

512

padding

=

1

kernel_size

=

3

stride

=

1

),

nn

ReLU

inplace

=

True

),

# input_5_3 14*14*512 -> 14*14*512

nn

Conv2d

in_channels

=

512

out_channels

=

512

padding

=

1

kernel_size

=

3

stride

=

1

),

nn

ReLU

inplace

=

True

),

# input_5_4 14*14*512 -> 7*7*512

nn

MaxPool2d

padding

=

0

kernel_size

=

2

stride

=

2

),

nn

Flatten

(),

nn

Linear

7

*

7

*

512

4096

),

nn

ReLU

inplace

=

True

),

nn

Dropout

0。5

inplace

=

True

),

nn

Linear

4096

4096

),

nn

ReLU

inplace

=

True

),

nn

Dropout

0。5

inplace

=

True

),

nn

Linear

4096

1000

),

nn

ReLU

inplace

=

True

),

def

forward

self

x

):

x

=

self

module

x

return

x

if

__name__

==

“__main__”

vgg_16

=

vgg_16

()

print

vgg_16

input

=

torch

ones

1

3

224

224

output

=

vgg_16

input

print

output

結果:

13.初識Pytorch之復現VGG16及卷積神經網路圖的視覺化(Tensorboard)

13.初識Pytorch之復現VGG16及卷積神經網路圖的視覺化(Tensorboard)

13.初識Pytorch之復現VGG16及卷積神經網路圖的視覺化(Tensorboard)

13.初識Pytorch之復現VGG16及卷積神經網路圖的視覺化(Tensorboard)

。。。

13.初識Pytorch之復現VGG16及卷積神經網路圖的視覺化(Tensorboard)

視覺化 上程式碼:

import torch

from torch import nn

from torch。utils。tensorboard import SummaryWriter

class vgg_16(nn。Module):

def __init__(self):

super(vgg_16, self)。__init__()

self。module = nn。Sequential(

# input_1

# input_1_1 224*224*3 -> 224*224*64

nn。Conv2d(in_channels=3, out_channels=64, padding=1, kernel_size=3, stride=1),

nn。ReLU(inplace=True),

# input_1_2 224*224*64 -> 224*224*64

nn。Conv2d(in_channels=64, out_channels=64, padding=1, kernel_size=3, stride=1),

nn。ReLU(inplace=True),

# input_1_3 224*224*64 -> 112*112*64

nn。MaxPool2d(padding=0, stride=2, kernel_size=2),

# input_2

# input_2_1 112*112*64 -> 112*112*128

nn。Conv2d(in_channels=64, out_channels=128, padding=1, kernel_size=3, stride=1),

nn。ReLU(inplace=True),

# input_2_2 112*112*128 -> 112*112*128

nn。Conv2d(in_channels=128, out_channels=128, padding=1, kernel_size=3, stride=1),

nn。ReLU(inplace=True),

# input_2_3 112*112*128 -> 56*56*128

nn。MaxPool2d(padding=0, stride=2, kernel_size=2),

# input_3

# input_3_1 56*56*128 -> 56*56*256

nn。Conv2d(in_channels=128, out_channels=256, padding=1, kernel_size=3, stride=1),

nn。ReLU(inplace=True),

# input_3_2 56*56*256 -> 56*56*256

nn。Conv2d(in_channels=256, out_channels=256, padding=1, kernel_size=3, stride=1),

nn。ReLU(inplace=True),

# input_3_3 56*56*256 -> 56*56*256

nn。Conv2d(in_channels=256, out_channels=256, padding=1, kernel_size=3, stride=1),

nn。ReLU(inplace=True),

# input_3_4 56*56*256 -> 28*28*256

nn。MaxPool2d(padding=0, stride=2, kernel_size=2),

# input_4

# input_4_1 28*28*256 -> 28*28*512

nn。Conv2d(in_channels=256, out_channels=512, padding=1, kernel_size=3, stride=1),

nn。ReLU(inplace=True),

# input_4_2 28*28*512 -> 28*28*512

nn。Conv2d(in_channels=512, out_channels=512, padding=1, kernel_size=3, stride=1),

nn。ReLU(inplace=True),

# input_4_3 28*28*512 -> 28*28*512

nn。Conv2d(in_channels=512, out_channels=512, padding=1, kernel_size=3, stride=1),

nn。ReLU(inplace=True),

# input_4_4 28*28*512 -> 14*14*512

nn。MaxPool2d(padding=0, stride=2, kernel_size=2),

# input_5

# input_5_1 14*14*512 -> 14*14*512

nn。Conv2d(in_channels=512, out_channels=512, padding=1, kernel_size=3, stride=1),

nn。ReLU(inplace=True),

# input_5_2 14*14*512 -> 14*14*512

nn。Conv2d(in_channels=512, out_channels=512, padding=1, kernel_size=3, stride=1),

nn。ReLU(inplace=True),

# input_5_3 14*14*512 -> 14*14*512

nn。Conv2d(in_channels=512, out_channels=512, padding=1, kernel_size=3, stride=1),

nn。ReLU(inplace=True),

# input_5_4 14*14*512 -> 7*7*512

nn。MaxPool2d(padding=0, kernel_size=2, stride=2),

nn。Flatten(),

nn。Linear(7 * 7 * 512, 4096),

nn。ReLU(inplace=True),

nn。Dropout(0。5, inplace=True),

nn。Linear(4096, 4096),

nn。ReLU(inplace=True),

nn。Dropout(0。5, inplace=True),

nn。Linear(4096, 1000),

nn。ReLU(inplace=True),

def forward(self, x):

x = self。module(x)

return x

if __name__ == “__main__”:

vgg_16 = vgg_16()

print(vgg_16)

input = torch。ones(1, 3, 224, 224)

output = vgg_16(input)

print(output)

writer = SummaryWriter(“logs”)

writer。add_graph(vgg_16, input)

writer。close()

結果:

13.初識Pytorch之復現VGG16及卷積神經網路圖的視覺化(Tensorboard)

13.初識Pytorch之復現VGG16及卷積神經網路圖的視覺化(Tensorboard)

上一章

遊客26024:12。初識Pytorch之搭建網路 LeNet-5復現(含nn。Sequential用法)

下一章

遊客26024:14。初識Pytorch之損失函式(Loss_funcations)

標簽: nn  channels  size  self  input