深度学习--CNN(卷积神经网络)学习笔记

1. 卷积神经网络的定义

        卷积神经网络是一种专门用来处理具有类似网格结构的数据的神经网络。卷积网络是指那些至少在网络的一层中使用卷积运算来替代一般的矩阵乘法运算的神经网络。

2. 卷积神经网络的五个结构

2.1 输入层

2.2 卷积层

常用的尺寸有3×3,5×5

2.3 池化层

        池化层不会改变三维矩阵的深度,但是它可以缩小矩阵的大小。通过池化层,可以进一步缩小最后全连接层中节点的个数,从而达到减少整个神经网络参数的目的。使用池化层既可以加快计算速度也可以防止过拟合。池化层filter的计算不是节点的加权和,而是采用最大值或者平均值计算。

2.4 全连接层

2.5 Softmax层

通过Softmax层,可以得到当前样例属于不同种类的概率分布问题。

3. LeNet5代码实现

用tensorflow实现

import tensorflow as tf
from tensorflow import keras
import numpy as np
import os
import pandas as pd
import matplotlib.pyplot as plt

# 加载MNIST数据集
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 对数据进行归一化和重塑,将图像的像素值归一化到[0, 1]范围内,以便在神经网络中进行训练。
x_train_scaled = x_train.astype(np.float32) / 255.0
x_test_scaled = x_test.astype(np.float32) / 255.0

# 划分验证集
from sklearn.model_selection import train_test_split
x_train_scaled, x_valid_scaled, y_train, y_valid = train_test_split(x_train_scaled, y_train, test_size=0.1, random_state=42)

print("训练集大小:", x_train_scaled.shape, y_train.shape)
print("验证集大小:", x_valid_scaled.shape, y_valid.shape)

#数据标准化
from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()
x_train_scaled = scaler.fit_transform(x_train_scaled.astype(np.float32).reshape(-1,1)).reshape(-1,28,28,1)
x_valid_scaled = scaler.transform(x_valid_scaled.astype(np.float32).reshape(-1,1)).reshape(-1,28,28,1)
x_test_scaled = scaler.transform(x_test.astype(np.float32).reshape(-1,1)).reshape(-1,28,28,1)

#构建CNN模型
model = tf.keras.models.Sequential([
    #卷积层,6个滤波器,尺寸为5×5,
    keras.layers.Conv2D(filters = 6,kernel_size=5,activation='sigmoid',input_shape=(28,28,1),padding='same'),
    #最大池化层,窗口大小2×2,移动步长为2
    keras.layers.MaxPool2D(pool_size = 2,strides = 2),
    keras.layers.Conv2D(filters = 16,kernel_size=5,activation='sigmoid',input_shape=(28,28,1)),
    keras.layers.MaxPool2D(pool_size = 2,strides = 2),
    #扁平化层,将之前卷积层和池化层输出的多维特征图展开成一个一维向量,为全连接层的输入做准备
    keras.layers.Flatten(),
    #这是一个全连接层,包含120个神经元。
    keras.layers.Dense(120,activation = 'sigmoid'),
    #这是一个全连接层,包含84个神经元。
    keras.layers.Dense(84,activation = 'sigmoid'),
    #这是输出层,包含10个神经元
    keras.layers.Dense(10,activation = 'sigmoid'),
])

#设置回调函数
logdir = 'D:/cnn3'#定义了一个文件路径 logdir,用于存储日志和模型文件
if not os.path.exists(logdir):
    os.mkdir(logdir)
output_model_file=os.path.join(logdir,"output_model.h5")#创建一个指向输出模型文件的路径
callbacks=[#创建列表,包含3个不同的回调函数
    keras.callbacks.ModelCheckpoint(output_model_file, save_best_only=True),#在每个训练周期结束时保存模型
    keras.callbacks.EarlyStopping(patience = 5,min_delta = 1e-3),
    #监视模型的指标,如果经过 patience 个训练周期(这里是5个周期)模型性能没有提升超过 min_delta (这里是0.001),则停止训练。这可以避免过拟合,节省训练时间。
    keras.callbacks.TensorBoard(log_dir=logdir)
    #将训练过程中的日志信息保存到指定的 logdir 路径中
]

#编译模型,使用交叉熵作为损失函数,随机梯度下降(SGD)作为优化器,准确率作为评估指标。
model.compile(loss='sparse_categorical_crossentropy',optimizer=keras.optimizers.SGD(learning_rate=0.9),metrics=['accuracy'])


#训练模型,使用训练数据训练模型,进行10个epochs的训练,使用256批量大小。
history=model.fit(x_train_scaled,y_train,epochs=10,batch_size=256,callbacks=callbacks,validation_data=(x_valid_scaled,y_valid))

#绘制学习曲线,这个函数用于绘制训练过程中的损失和准确率的变化情况,以便进行可视化分析
def plot_learning_curves(history):
    pd.DataFrame(history.history).plot(figsize=(8,3))
    plt.grid(True)
    plt.show()
plot_learning_curves(history)

3.Inception模块

3.1 什么是Inception

Inception就是把多个卷积或池化操作,放在一起组装成一个网络模块,设计神经网络时以模块为单位去组装整个网络结构。

使用了1x1 卷积进行压缩降维

举个例子,假如输入的维度是 96 维,要求输出的维度是 32 维,二种计算方式:

第一种:用3x3的卷积核计算,参数量是3*3*96*32=27648(为了方便计算,这里忽略偏置bias,后面的计算均如此)


第二种:先用1x1卷积核将输出通道降维到32,参数量是1*1*96*32=3072,再用3x3卷积计算输出,参数量是3*3*32*32=9216,总的参数量是3072+9216=12288

在输出层GoogleNet采用全局平均池化
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值