卷积神经网络中多通道参数个数计算的理解


一、例子

1.代码

这里是一个我写的简单的例子,代码如下:

import numpy as np
import tensorflow as tf
from  tensorflow.keras import Model
from tensorflow.keras.layers import Conv2D,BatchNormalization,Activation,MaxPool2D,Dropout,Flatten,Dense

path=r'C:\Users\67368\Desktop\python深度学习\训练集和测试集'
x_train_path=path+'\minist_x_train.npy'
y_train_path=path+'\minist_y_train.npy'

x_train=np.load(x_train_path)
print(len(x_train))
print(x_train.shape)
#x_train=np.reshape(x_train,(len(x_train),80,57,3))
y_train=np.load(y_train_path)
#y_train=np.reshape(x_train,(len(y_train),(14,20)))
#测试输入的训练集
'''
for i in range(len(y_train)):
    print(x_train[i])
    print(len(x_train[i]))
    print(i)
    print(y_train[i])
    print('*'*30)
'''
'''
i=9
plt.imshow(x_train[i])
print(y_train[i])
plt.show()
'''


class Mymodel(Model):
    def __init__(self):
        super(Mymodel, self).__init__()
        self.c1 = Conv2D(filters=4, kernel_size=(3, 3), activation='relu')
        self.p1 = MaxPool2D(pool_size=(2, 2), strides=2)

        #self.c2 = Conv2D(filters=3, kernel_size=(3, 3), activation='sigmoid')
        #self.p2 = MaxPool2D(pool_size=(2, 2), strides=2)

        self.flatten = Flatten()
        self.f1 = Dense(14, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())

    def call(self, x):
        x = self.c1(x)
        x = self.p1(x)



        x = self.flatten(x)
        y = self.f1(x)
        return y


model = Mymodel()


'''
model=tf.keras.models.Sequential( [
       tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(14,activation='softmax',kernel_regularizer=tf.keras.regularizers.l2())])
'''
#4model.compile()
model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
              metrics=['sparse_categorical_accuracy']
              )

model.fit(x_train,y_train,batch_size=32,epochs=80,validation_split=0.2,validation_freq=1)
np.set_printoptions(threshold=np.inf)
model.summary()
#C:\Users\67368\Desktop\python深度学习\深度学习笔记
path=r'C:\Users\67368\Desktop\python深度学习\深度学习笔记'
model.save_weights('quanzhong\model_cnn__try1.ckpt')
file=open(path+'\weight.txt','w')
for v in model.trainable_variables:#tf.all_variables返回的是所有变量的列表
    file.write(str(v.name)+'\n')
    file.write('*'*30)
    file.write(str(v.shape)+'\n')
    file.write('*'*30)
    file.write(str(v.numpy())+'\n')
file.close()

2.运行的summary

summary如下:

________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d (Conv2D)             multiple                  112       
                                                                 
 max_pooling2d (MaxPooling2D  multiple                 0         
 )                                                               
                                                                 
 flatten (Flatten)           multiple                  0         
                                                                 
 dense (Dense)               multiple                  17654     
                                                                 
=================================================================
Total params: 17,766
Trainable params: 17,766
Non-trainable params: 0
_________________________________________________________________

Process finished with exit code 0


二、解释

conv2d (Conv2D) multiple 112
这里的112是卷积核3*3和通道数3还有filters=4相乘,再加上filters=4
即3×3×3×4+4=112。
dense (Dense) multiple 17654
17654的过程是45×32×3的图片经过卷积核3×3后变为43×30,这里为什么不是43×30×3呢?卷积过程中,输入层有多少个通道,滤波器就要有多少个通道,也就是3×3其实是3×3×3,然后由三个通道上(i,j)处的卷积结果相加然后再取激活函数值得到的。所以是43×30。由于我们的filters=4,所以最后的输出为43×30×4。
然后经过池化由于步长是2,变成了21×15×4,由于我这里的类别是14种,所以参数个数就是21×15×4×14+14=17654。
和summary答案一样了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值