卷积神经网络(python实现)

1.tensorflow搭建神经网络:

model=models.Sequential([
    layers.Input(shape=(32,32,3)),
    layers.Conv2D(16,(3,3),activation='relu',padding='same'),
    layers.MaxPool2D((2,2)),
    layers.Conv2D(32,(3,3),activation='relu',padding='same'),
    layers.MaxPool2D((2,2)),
    layers.Dropout(0.1),
    layers.Flatten(),
    layers.Dense(128,activation='relu'),
    layers.Dense(10,activation='softmax')
])

(1)激活函数 activation

线性激活函数:

linear:直接输出输入值,没有任何变换(实际上等同于没有激活函数)。

用途:一般用于回归问题的输出层,或者某些层不需要非线性变换时。

非线性激活函数:

(a)Sigmoid 函数

Sigmoid(x)=\frac{1}{1+e^{-x}}

用途:常用于二分类问题的输出层,将输出转化为概率值。也可以在某些特定网络结构中作为隐藏层激活函数。

缺点:容易在极端情况下导致梯度消失问题,尤其在深度网络中。

(b)Tanh 函数

Tanh(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}

用途:常用于循环神经网络(RNN)等任务中。与 sigmoid 相比,输出范围是 [-1, 1],因此能够更好地处理负值和正值。

缺点:也可能会导致梯度消失,尤其在深层网络中。

  (c)ReLU 函数

ReLU(x)=max(0,x)

用途:最常用的激活函数,适用于大多数卷积神经网络(CNN)和全连接网络(MLP)的隐藏层。它计算效率高,能有效地缓解梯度消失问题。

缺点:当输入值为负时,输出为零,可能导致“神经元死亡”问题(即神经元的输出恒为零)。

  (d)Leaky ReLU 函数

Leaky ReLU(x)=\left\{\begin{matrix} x,if&x>0 \\ 0.01x,if&x<=0 \end{matrix}\right.

activation=tf.keras.layers.LeakyReLU(alpha=0.01)

用途:用于缓解标准 ReLU 中的神经元死亡问题,尤其适用于深层网络。

  (e)Parametric ReLU (PReLU)

activation=tf.keras.layers.PReLU()

用途:自适应调整负值区域的斜率,常用于深度卷积神经网络中。

  (f)Exponential Linear Unit (ELU)

ELU(x)=\left\{\begin{matrix} x&if &x>0, \\\alpha (e^{x}-1)&if&x<=0. \end{matrix}\right.

activation=tf.keras.layers.ELU(alpha=1.0)

用途:相比 ReLU,负值部分的输出更加平滑,有助于加速训练。

SoftMax函数:

将输入转换为概率分布,输出的值加起来为 1,常用于多分类问题的输出层。

Softmax(x_{i} )=\frac{e^{x_{i} }}{\sum_{j}^{}e^{x_{j} }}

用途:多分类问题的输出层,比如在图像分类任务中用于输出每个类别的概率。

(2)步幅(stride)

在卷积神经网络(CNN)中,步幅指的是卷积核在输入图像上滑动的步长,也就是每次移动的距离。步幅可以在卷积操作或池化操作中设置,通常用来控制输出特征图的尺寸。

卷积或池化层的输出尺寸取决于输入尺寸、卷积核大小、步幅和填充方式。计算公式如下

卷积层中的步幅:控制卷积核的移动速度。如果步幅较大,卷积核覆盖的像素较少,输出特征图较小。

layers.Conv2D(32, (3,3), strides=(2,2), padding='same')

这里 strides=(2,2) 表示卷积核在高度和宽度方向上每次移动 2 个像素,输出特征图的大小会减半。

池化层中的步幅:类似于卷积层,步幅决定了池化窗口的移动速度,影响输出特征图的尺寸。池化通常用于下采样,减小特征图的尺寸。

layers.MaxPool2D((2,2), strides=(2,2))

在这里,池化窗口每次移动 2 个像素,特征图尺寸将减少一半。

  (3)零填充(padding)

(a)Valid 填充 (padding='valid')

无填充:不在输入图像的边缘添加额外的像素,卷积核只在实际图像的像素内滑动。

这种方式通常会减小输出特征图的尺寸

  (b) Same 填充 (padding='same')

填充输入图像:在输入图像的边缘添加像素,使得输出特征图的尺寸与输入图像相同(步幅为 1 时)。

通常在每边添加适量的像素,以保证卷积核能够在输入的每个像素点上滑动。

(4)神经网络层

(a)输入层(Input Layer)

输入层是神经网络接收输入数据的第一层。

通常不涉及任何计算,只是用于定义输入数据的形状。

layers.Input(shape=(32, 32, 3))

(b)全连接层(Dense Layer)

也称为密集层,是最常见的层,每个神经元与上一层的所有神经元相连。

主要用于将高维输入映射到低维空间,适合分类、回归等任务。

常用于网络的最后几层进行输出的预测。

layers.Dense(128, activation='relu')

(c)卷积层(Conv2D、Conv1D、Conv3D)

卷积层用于提取输入数据中的局部特征,通常用于图像处理任务。

卷积层通过在输入上滑动卷积核(滤波器)来捕捉局部特征。卷积核的大小和数量决定了提取特征的细粒度程度。

卷积层根据输入数据的维度分为一维、二维和三维卷积层。

layers.Conv2D(filters=32, kernel_size=(3, 3), activation='relu')

(d)池化层(Pooling Layer)

池化层用于下采样特征图,减少其空间维度,常用于卷积层后以降低计算复杂度。

常见的池化方式包括最大池化(MaxPooling)平均池化(AveragePooling)

MaxPooling:取局部窗口内的最大值。AveragePooling:取局部窗口内的平均值。

layers.MaxPool2D(pool_size=(2, 2))

(e)归一化层(Normalization Layer)

归一化层用于对输入数据进行标准化,以加快模型的收敛速度。

批量归一化(Batch Normalization):通过标准化批次数据中的每个特征,使其均值为 0、方差为 1,有助于减少内部协变量偏移问题。

layers.BatchNormalization()

(f)Dropout 层

Dropout 是一种正则化技术,用于防止模型过拟合。它通过在训练过程中随机将一部分神经元“关闭”来降低模型的复杂度。常用于全连接层或卷积层之后。

layers.Dropout(0.5)

(g)嵌入层(Embedding Layer)

嵌入层主要用于处理自然语言处理(NLP)任务,将离散的词语映射为连续的向量。

输入通常是单词索引,输出是对应的词向量。

layers.Embedding(input_dim=10000, output_dim=64)

(h)Flatten 层

Flatten 层将多维的输入数据展平为一维,通常在卷积层之后,用于将卷积特征图连接到全连接层。

layers.Flatten()

(i)输出层(Output Layer)

输出层根据具体任务类型,通常是分类或回归任务的最后一层。输出层的设计决定了模型的输出类型。

分类任务:通常使用 softmaxsigmoid 激活函数。

layers.Dense(10, activation='softmax')

2.神经网络编译

model.compile(optimizer='adam',
             loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
             metrics=['accuracy'])

常见参数:

(1)optimizer(优化器)

(a)adam:自适应矩估计(Adam),是深度学习中最常用的优化器,结合了动量和自适应学习率,适用于大多数任务。

(b)sgd:随机梯度下降法(SGD),是一种传统的优化方法,常与动量或学习率调度结合使用。

  (c) rmsprop:基于梯度平方的自适应学习率方法。

  (d) adagrad:针对稀疏数据的优化方法。

(2)loss(损失函数)

(a)sparse_categorical_crossentropy:用于多类分类问题,目标标签为整数编码(如 0、1、2...)。

(b)categorical_crossentropy:用于多类分类问题,目标标签为 one-hot 编码。

  (c)  binary_crossentropy:用于二分类问题。

  (d) mean_squared_error(MSE):用于回归问题。

  (e) mean_absolute_error(MAE):用于回归问题,计算预测值与真实值之间的绝对差。

(3)metrics(评估指标)

(a) accuracy:分类问题中的准确率。

(b) mae:回归问题中的平均绝对误差。

(c) mse:回归问题中的均方误差。

不同场景的 loss 函数选择
二分类问题binary_crossentropy
多分类问题(整数标签)sparse_categorical_crossentropy
多分类问题(one-hot 编码标签categorical_crossentropy
回归问题mean_absolute_error

3.训练模型

model.fit(
    x,                  # 输入数据
    y,                  # 标签
    batch_size=32,      # 每次训练所使用的样本数
    epochs=10,          # 训练轮数
    validation_data=None, # 验证集,用于监控模型的性能
    shuffle=True,       # 是否在每个 epoch 之前打乱数据
    callbacks=None,     # 训练过程中可执行的一些操作,如学习率调整、模型保存等
)

常用回调函数:

EarlyStopping:如果监控的指标在若干 epoch 内没有提升,提前停止训练。

ModelCheckpoint:在训练过程中保存模型的权重。

ReduceLROnPlateau:如果监控的指标在若干 epoch 内没有提升,自动减少学习率。

from tensorflow.keras.callbacks import EarlyStopping
early_stopping = EarlyStopping(monitor='val_loss', patience=3)
model.fit(x_train, y_train, epochs=10, validation_data=(x_val, y_val), callbacks=[early_stopping])

训练结果的可视化与评估

model.fit() 返回一个 history 对象,其中保存了训练过程中的损失、评估指标和验证集上的性能。可以通过 history.history 来查看训练过程中的各项数据。

import matplotlib.pyplot as plt

# 绘制训练集和验证集上的损失曲线
plt.plot(history.history['loss'], label='train_loss')
plt.plot(history.history['val_loss'], label='val_loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()

4.模型的评估和预测

在训练完成后,可以通过 model.evaluate()model.predict() 来评估模型的性能和进行预测。

评估模型性能

test_loss, test_acc = model.evaluate(x_test, y_test)
print(f'Test Accuracy: {test_acc}')

进行预测

predictions = model.predict(x_new)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值