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 函数
用途:常用于二分类问题的输出层,将输出转化为概率值。也可以在某些特定网络结构中作为隐藏层激活函数。
缺点:容易在极端情况下导致梯度消失问题,尤其在深度网络中。
(b)Tanh 函数
用途:常用于循环神经网络(RNN)等任务中。与 sigmoid 相比,输出范围是 [-1, 1],因此能够更好地处理负值和正值。
缺点:也可能会导致梯度消失,尤其在深层网络中。
(c)ReLU 函数
用途:最常用的激活函数,适用于大多数卷积神经网络(CNN)和全连接网络(MLP)的隐藏层。它计算效率高,能有效地缓解梯度消失问题。
缺点:当输入值为负时,输出为零,可能导致“神经元死亡”问题(即神经元的输出恒为零)。
(d)Leaky ReLU 函数
activation=tf.keras.layers.LeakyReLU(alpha=0.01)
用途:用于缓解标准 ReLU 中的神经元死亡问题,尤其适用于深层网络。
(e)Parametric ReLU (PReLU)
activation=tf.keras.layers.PReLU()
用途:自适应调整负值区域的斜率,常用于深度卷积神经网络中。
(f)Exponential Linear Unit (ELU)
activation=tf.keras.layers.ELU(alpha=1.0)
用途:相比 ReLU,负值部分的输出更加平滑,有助于加速训练。
SoftMax函数:
将输入转换为概率分布,输出的值加起来为 1,常用于多分类问题的输出层。
用途:多分类问题的输出层,比如在图像分类任务中用于输出每个类别的概率。
(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)
输出层根据具体任务类型,通常是分类或回归任务的最后一层。输出层的设计决定了模型的输出类型。
分类任务:通常使用 softmax
或 sigmoid
激活函数。
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
:回归问题中的均方误差。
二分类问题 | 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)