如何计算卷积神经网络的权重数量?

3
我们如何计算卷积神经网络的权重数量,该网络用于将图像分为两类:

  • 输入:100x100灰度图像。
  • 第1层:具有60个7x7的卷积滤波器的卷积层(步幅=1,valid填充)。
  • 第2层:具有100个5x5的卷积滤波器的卷积层(步幅=1,valid填充)。
  • 第3层:通过因子4降采样Layer 2的最大池化层(例如,从500x500到250x250)
  • 第4层:具有250个单元的密集层
  • 第5层:具有200个单元的密集层
  • 第6层:单个输出单元

假设每层都存在偏差。 此外,池化层具有权重(类似于AlexNet)

此网络有多少个权重?

一些Keras代码

import keras
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Conv2D, MaxPooling2D

model = Sequential()

# Layer 1
model.add(Conv2D(60, (7, 7), input_shape = (100, 100, 1), padding="same", activation="relu"))

# Layer 2
model.add(Conv2D(100, (5, 5), padding="same", activation="relu"))

# Layer 3
model.add(MaxPooling2D(pool_size=(2, 2)))

# Layer 4
model.add(Dense(250))

# Layer 5
model.add(Dense(200))

model.summary()

如果您在Keras中创建了该模型,它将为您计算。 - Chris Tosh
2
创建模型并调用 model.summary() - Daniel Möller
1个回答

7

TL;DR - 对于TensorFlow + Keras

使用Sequential.summary - 链接到文档。

示例用法:

from tensorflow.keras.models import *

model = Sequential([
    # Your architecture here
]);

model.summary()

你的架构输出结果为:
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 94, 94, 60)        3000      
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 90, 90, 100)       150100    
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 45, 45, 100)       0         
_________________________________________________________________
flatten (Flatten)            (None, 202500)            0         
_________________________________________________________________
dense (Dense)                (None, 250)               50625250  
_________________________________________________________________
dense_1 (Dense)              (None, 200)               50200     
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 201       
=================================================================
Total params: 50,828,751
Trainable params: 50,828,751
Non-trainable params: 0
_________________________________________________________________

那是50828751个参数。

解释

2D卷积层中的权重数量

对于具有以下参数的2D卷积层:

  • num_filters个过滤器,
  • 过滤器大小为filter_size * filter_size * num_channels
  • 每个过滤器都有一个偏置参数。

权重数量为:(num_filters * filter_size * filter_size * num_channels) + num_filters

例如:你的神经网络中的第1层有:

  • 60个过滤器
  • 过滤器大小为7 * 7 * 1(请注意,通道数(1)来自输入图像。)

它的权重数量是:(60 * 7 * 7 * 1) + 60,也就是3000个。

密集层中的权重数量

对于具有以下参数的密集层:

  • num_units个神经元,
  • 在它之前的层中有num_inputs个神经元,
  • 每个神经元都有一个偏置参数。

权重数量为:(num_units * num_inputs) + num_units

例如:你的神经网络中的第5层有:

  • 200个神经元
  • 它之前的层 - 第4层 - 有250个神经元。

它的权重数量是200 * 250,也就是50200个。


展平层和密集层在我的模型中似乎不是必需的。我是否应该在MaxPooling层添加类似于AlexNet的权重? - estamos
1
据我所知,MaxPooling层没有与之相关联的权重。虽然我可能是错的。 - tVishal96
是的,Maxpooling层没有权重。我在顶部发布了一些固定代码。 - estamos
您的模型需要在Conv2D和Dense层之间添加一个Flatten层,否则在训练时会出现ValueError。Dense层期望输入一个2D张量,但Conv2D层的输出是一个4D张量。Flatten将根据需要将4D张量转换为2D张量。请参见此问题获取更多详细信息。此外,您需要在网络末端添加一个具有1个神经元的Dense层,因为那是输出层。 - tVishal96

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接