CNN卷积神经网络各层的参数和神经元数量的计算方法注释

import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
#tensorflow手写数字识别案例
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Dropout,Convolution2D,MaxPooling2D,Flatten
from tensorflow.keras.optimizers import Adam
 
# 1、载入数据
mnist = tf.keras.datasets.mnist
(train_data, train_target), (test_data, test_target) = mnist.load_data()
 
# 2、改变数据维度
train_data = train_data.reshape(-1, 28, 28, 1)
test_data = test_data.reshape(-1, 28, 28, 1)
# 注:在TensorFlow中,在做卷积的时候需要把数据变成4维的格式
# 这4个维度分别是:(batch_size)数据数量,图片高度,图片宽度,图片通道数
 
# 3、归一化(有助于提升训练速度)
train_data = train_data/255.0
test_data = test_data/255.0
 
# 4、独热编码
train_target = tf.keras.utils.to_categorical(train_target, num_classes=10)
test_target = tf.keras.utils.to_categorical(test_target, num_classes=10)    #10种结果
 
# 5、搭建CNN卷积神经网络
model = Sequential()
# 5-1、第一层:卷积层(初始输入数据是单通道,输出为32通道)
# 第一个卷积层(参数数量:5*5*1*32+32=800+32=832)(32个通道每个通道的5*5*1(输入为单通道)参数都不同,随着学习过程反向传播调整)
#神经元数量可以认为只与输出体积有关(28*28*32),由于每个输出通道上的(5*5*1)参数共享,所以参数与面积无关,只有(5*5*1*32)+32
model.add(Convolution2D(input_shape = (28,28,1), filters = 32, kernel_size = 5, strides = 1, padding = 'SAME', activation = 'relu'))
#         卷积层         输入数据                  滤波器数量      卷积核大小   步长    不够卷积核多余的填充数据0(same padding)  激活函数
# 5-2 第二层,第一个池化层 # pool_size(参数数量0,神经元数量可以认为是(28/2)*(28/2)*32)
#(池化改变了每个通道的面积,降低了神经元数量和计算量,没有改变参数数量,参数数量只与上下层的通道数和卷积核有关)
model.add(MaxPooling2D(pool_size = 2, strides = 2, padding = 'same',))
#         池化层(最大池化) 池化窗口大小   步长          填充方式
 
# 5-3、第三层:卷积层(上层输入数据为32通道,输出为64通道)
# 第二个卷积层(参数数量:5*5*32*64+64=51200+64=51264) 
model.add(Convolution2D(64, 5, strides=1, padding='same', activation='relu'))
# 64:滤波器个数      5:卷积窗口大小
# 5-4 第四层,第二个池化层(参数数量0,神经元数量可以认为是(14/2)*(14/2)*64)
model.add(MaxPooling2D(2, 2, 'same'))
 
# 5-5、扁平化 (相当于把(64,7,7,64)数据->(64,7*7*64=3136)),变为扁平的3136个神经元,参数数量0。
model.add(Flatten())
 
# 5-6、第六层:第一个全连接层1024个神经元(参数数量:3136*1024+1024)
model.add(Dense(1024, activation = 'relu'))

# 5-7、第七层:Dropout层(参数数量0,神经元数量1024)
model.add(Dropout(0.5))  
# 5-8、第八层:第二个全连接层(输出层)10个神经元(参数数量:1024*10+10)
model.add(Dense(10, activation='softmax'))
 
# 6、编译
model.compile(optimizer=Adam(lr=1e-4), loss='categorical_crossentropy', metrics=['accuracy'])
#            优化器(adam)               损失函数(交叉熵损失函数)            评价方法
 
# 7、训练(batch_size=64,迭代次数=样本总数/64=938)
model.fit(train_data, train_target, batch_size=64, epochs=1, validation_data=(test_data, test_target))
 
# 8、保存模型
model.save('digits1epoch.h5')
model.summary()

你可能感兴趣的:(cnn,深度学习,tensorflow)