卷积神经网络中的参数数目计算

卷积神经网络中卷积层的参数设置与卷积核的大小还有数目有关。具体数目为:卷积核size×卷积核size×均积核的channel数目×卷积核的数目×bias(卷积核数目);
全连接层的参数数目为:imput的matrix特征数目*全连接层Dense数值

import tensorflow as tf
from tensorflow.keras import layers, optimizers, datasets, Sequential
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
tf.random.set_seed(2345)

conv_layers = [
    layers.Conv2D(64, kernel_size=[3, 3], padding='same', activation=tf.nn.relu),
    # 本层参数:卷积核size×卷积核size×均积核的channel数目×卷积核的数目×bias(卷积核数目)对应 3*3*3*64+64=1792
    layers.Conv2D(64, kernel_size=[3, 3], padding='same', activation=tf.nn.relu),
    #本层参数数目:3*3*64*64+64=36928,chanel数目为上一个卷积层的输出结果,为64
    layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),
    

    layers.Conv2D(128, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
    # 同理,本层参数为3*3*64*128+128=73856,64为上一个卷积层的输出为64
    layers.Conv2D(128, kernel_size=[3, 3], padding='same', activation=tf.nn.relu),
    layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),

    layers.Conv2D(256, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
    layers.Conv2D(256, kernel_size=[3, 3], padding='same', activation=tf.nn.relu),
    layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),

    layers.Conv2D(512, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
    layers.Conv2D(512, kernel_size=[3, 3], padding='same', activation=tf.nn.relu),
    layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),

    layers.Conv2D(512, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
    layers.Conv2D(512, kernel_size=[3, 3], padding='same', activation=tf.nn.relu),
    layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),
]


def preprocss(x, y):
    x = tf.cast(x, dtype=tf.float32)/255.
    y = tf.cast(y, dtype=tf.int32)
    return x, y

(x, y), (x_test, y_test) = datasets.cifar100.load_data()
y = tf.squeeze(y, axis=1)
y_test = tf.squeeze(y_test, axis=1)
print(x.shape, y.shape, x_test.shape, y_test.shape)

train_db = tf.data.Dataset.from_tensor_slices((x, y))
train_db = train_db.shuffle(1000).map(preprocss).batch(64)

train_test = tf.data.Dataset.from_tensor_slices((x_test, y_test))
train_test = train_test.map(preprocss).batch(64)

sample = next(iter(train_db))
print('sample: ', sample[0].shape, sample[1].shape,
      tf.reduce_min(sample[0]), tf.reduce_max(sample[0]))




def main():
    conv_net = Sequential(conv_layers)
    # x = tf.random.normal([4, 32, 32, 3])
    # out = conv_net(x)
    # print(out.shape)

    fc_net = Sequential([
        layers.Dense(256, activation=tf.nn.relu),#参数数目:imput dim(512)*256+256=131328
        layers.Dense(128, activation=tf.nn.relu),
        layers.Dense(100)
    ])

    conv_net.build(input_shape=[None, 32, 32, 3])
    fc_net.build(input_shape=[None, 512])

    conv_net.summary()
    fc_net.summary()


if __name__ == '__main__':
    main()

结果:
卷积层参数数目:
在这里插入图片描述
全连接层参数:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卷积神经网络(Convolutional Neural Network,CNN)是一种常用于图像处理和计算机视觉任务的深度学习模型。在CNN,每个卷积层都会提取输入图像的特征,并将其表示为特征图。特征图的数量取决于卷积层的卷积核数量。 如果卷积神经网络的特征值数目过多,可能会导致以下问题: 1. 参数量过大:每个特征值都需要一定数量参数来进行计算,如果特征值数目过多,网络的参数量也会相应增加。这会增加模型的复杂度和训练的时间成本。 2. 内存消耗过大:特征值数目过多会导致卷积层输出的特征图尺寸变大,进而增加了内存的消耗。这可能会导致在资源受限的设备上无法有效地运行模型。 3. 过拟合:如果特征值数目过多,模型可能会过度拟合训练数据,导致在未见过的数据上表现不佳。过拟合是指模型在训练数据上表现良好,但在测试数据上表现较差的现象。 为了解决特征值数目过多的问题,可以考虑以下方法: 1. 减少卷积核数量:通过减少卷积层的卷积核数量,可以降低特征值的数目。这样可以减少模型的参数量和内存消耗。 2. 使用池化层:池化层可以对特征图进行下采样,减小特征图的尺寸。这样可以降低内存消耗,并且可以提取更加抽象的特征。 3. 正则化技术:使用正则化技术如Dropout、L1/L2正则化等可以减少过拟合问题,提高模型的泛化能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值