【问题标题】:How to compute number of weights of CNN?如何计算 CNN 的权重数量?
【发布时间】:2020-04-08 03:53:27
【问题描述】:

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

  • 输入:100x100 灰度图像。
  • 第 1 层:具有 60 个 7x7 卷积滤波器的卷积层(步幅 = 1,有效 填充)。
  • 第 2 层:具有 100 个 5x5 卷积滤波器的卷积层(步幅 = 1,有效 填充)。
  • 第 3 层:最大池化层,将第 2 层下采样 4 倍(例如,从 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 中创建该模型,它会为您计算。
  • 创建模型并调用model.summary()

标签: tensorflow machine-learning keras neural-network conv-neural-network


【解决方案1】:

TL;DR - 用于 TensorFlow + Keras

在文档中使用Sequential.summary - Link

使用示例:

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
_________________________________________________________________

这是 50,828,751 个参数。

说明

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

【讨论】:

  • Flatten 和 Dense 层我认为我的模型不需要。我应该在 MaxPooling 层添加一个类似于 AlexNet 的权重吗?
  • 据我所知,MaxPooling 层没有与之关联的权重。不过,我可能错了。
  • 是的,Maxpooling 层没有权重。我在顶帖写了一些固定的代码。
  • 你的模型需要在 Conv2D 和 Dense 层之间有一个 Flatten 层,否则你会在运行时(训练时)得到一个 ValueError。 Dense 层需要 2D 张量作为输入,但 Conv2D 层的输出是 4D 张量。 Flatten 将根据需要将 4D 张量转换为 2D 张量。请参阅this question 了解更多详情。此外,您需要在网络末端有一个具有 1 个神经元的 Dense 层,因为那是输出层。
猜你喜欢
  • 2020-09-19
  • 2017-08-27
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
相关资源
最近更新 更多