吴恩达机器学习笔记四
目录
1、激活函数

1.1常见的激活函数
线性激活函数(左边):但人们认为线性回归没有激活函数因为g(z)=z
sigmoid函数(中间):取值为0<g(z)<1
ReLu函数(右边):g(z)<0为g(z)=0,g(z)>0为g(z)=z,最终输出为g(z)=max(0,z)

1.2激活函数的选择

如上图所示,
当要求输出值为(二分类)0/1时,选择sigmoid函数;
当要求输出值有正有负+-时,选择线性激活函数;
当要求输出值均>0(即0/+)时,选择ReLu函数,通常中间的隐藏层常用ReLu
因为sigmoid函数的计算相较于relu更加复杂,且有两个相对平坦的部分。平坦部分会导致梯度下降速度变缓,效率降低。如下图所示:

因此中间的隐藏层激活函数常用relu,如下图:

2、多类别分类(Softmax)
2.1概念
多类别指:对象或数据样本划分到三个或三个以上互斥类别。
如下图可以清晰看出与二分类的区别(左边为二分类,右边为多类别),且其决策边界也不同。

2.2 Softmax
2.2.1 概念
Softmax:是一种常用于机器学习和深度学习的激活函数,主要用于多类别分类任务的输出层,其核心作用是将模型输出的原始数值转换为概率分布,使得每个类别的输出值都在 [0, 1] 区间内,且所有类别概率之和为 1
对于一个包含 K 个类别的分类问题,假设模型输出的原始值为 z1,z2,…,zK,Softmax 函数对每个 zi 的转换公式为:
其推导过程如下图,参考逻辑回归

2.2.2 Softmax的loss损失函数
如下图所示,对照图左边的逻辑回归的loss,可推出softmax的 loss = -log aj , if y=j

2.2.3 带有softmax输出的神经网络
如下图所示,将最后一个输出层改为由10个单元组成,并使用softmax激活函数。最终输出的
a^3 = (a1^3, a2^3, ...a10^3) = g (z1^3,...,z10^3),激活函数不再是关于一个值的函数,而是全部的输出值的函数。 

其代码实现如下:
model = Sequential([
Dense (units=25, activation='relu'),
Dense (units=15, activation='relu'),
Dense (units=10, activation='softmax')
])
# logits是指神经网络输出层在经过激活函数之前的原始数值,即未被转换为概率的原始输出。
#进行损失loss函数计算
model.compile(loss=SparseCategoricalCrossEntropy(from_logits=True))
from_logits 是最常用的参数,决定损失函数是否需要对输入执行 softmax 转换:
from_logits=True:表示模型输出的是原始 logits(未经过softmax的原始数值),损失函数会先自动对其应用softmax,再计算交叉熵。
👉 优点:避免因softmax计算导致的数值精度损失,训练更稳定。from_logits=False(默认):表示模型输出已经是经过softmax的概率分布,损失函数直接用这些概率计算交叉熵。
SparseCategoricalCrossEntropy是适合于多类别分类的损失函数,其标签格式为整数,即真实标签是单个整数(如用 0 表示猫、1 表示狗、2 表示鸟),而非独热编码(如 [1,0,0] 表示猫)。
3、多标签分类
3.1概念
多标签分类(Multi-Label Classification)
是机器学习中的一种分类任务,指的是一个样本可以同时属于多个类别(标签),类别之间不互斥,标签之间是 “共存关系”。
多标签分类与多类别分类的区别与联系
| 维度 | 多类别分类(Multi-Class) | 多标签分类(Multi-Label) |
| 标签数量 | 类别数≥3 | 类别数可≥2(甚至 2 类也可) |
| 样本与标签关系 | 每个样本仅属于一个类别(单选) | 每个样本可属于多个类别(多选) |
| 标签性质 | 类别互斥(如 “猫”“狗”“鸟” 不能同时存在) | 类别可共存(如 “动作”“科幻” 可同时标记一部电影) |
| 输出形式 | 概率分布(所有类别概率和为 1,如 Softmax 输出) | 每个标签独立的概率(如 Sigmoid 输出,概率和可 > 1) |
| 典型场景 | 手写数字识别(0-9 中选 1 个)、物种分类 | 文本主题标注、图像多物体识别、电影标签分类 |
3.2多标签分类的代码实例
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.losses import BinaryCrossentropy
from tensorflow.keras.optimizers import Adam
# 1. 准备数据(示例)
# 假设每个样本有10个特征,标签是4个主题的二进制标记(1表示属于该主题,0表示不属于)
# 例如:[1,0,1,0] 表示样本同时属于“政治”和“体育”
X = np.random.rand(1000, 10) # 1000个样本,每个10个特征
y = np.random.randint(0, 2, size=(1000, 4)) # 1000个样本,4个标签(0或1)
# 2. 构建多标签分类模型
model = Sequential([
Dense(32, activation='relu', input_shape=(10,)), # 隐藏层
Dense(16, activation='relu'), # 隐藏层
Dense(4, activation='sigmoid') # 输出层:4个标签,用Sigmoid激活
])
# 3. 配置模型:多标签分类专用设置
model.compile(
loss=BinaryCrossentropy(), # 用二元交叉熵(每个标签独立判断)
optimizer=Adam(learning_rate=0.001),
metrics=['accuracy'] # 可选:监控准确率
)
# 4. 训练模型
model.fit(
X, y,
epochs=20,
batch_size=32,
validation_split=0.2 # 20%数据作为验证集
)
# 5. 预测示例
sample = X[0:1] # 取第一个样本
predictions = model.predict(sample)[0] # 输出每个标签的概率
# 设定阈值(如0.5),将概率转换为标签
threshold = 0.5
predicted_labels = [i for i, prob in enumerate(predictions) if prob >= threshold]
print("预测概率:", [round(p, 2) for p in predictions])
print("预测标签(主题索引):", predicted_labels)
标签格式:
使用二进制向量(如[1,0,1,0]),每个元素对应一个标签是否存在。
输出层设计:
最后一层神经元的数量 = 标签类别数(如 4 个主题→4 个神经元)。
激活函数用Sigmoid,使每个输出独立表示 “样本属于该标签的概率”(范围 0-1)。
损失函数:
使用BinaryCrossentropy(二元交叉熵),将每个标签视为独立的二分类问题(是否属于该标签)。
预测后处理:
通过阈值(如 0.5)将概率转换为最终标签(概率≥阈值则认为属于该标签)
多标签与多分类的代码核心区别
# 多类别分类 (例如:手写数字识别,10个互斥类别)
model = Sequential([
Dense(64, activation='relu'),
Dense(10, activation='softmax') # softmax确保概率和为1
])
model.compile(
loss='categorical_crossentropy', # 或sparse_categorical_crossentropy
optimizer='adam',
metrics=['accuracy']
)
# 预测
y_pred_probs = model.predict(x_test)
y_pred = np.argmax(y_pred_probs, axis=1) # 取概率最大的类别
# 多标签分类 (例如:图像标签,可同时属于多个类别)
model = Sequential([
Dense(64, activation='relu'),
Dense(5, activation='sigmoid') # sigmoid独立输出每个标签概率
])
model.compile(
loss='binary_crossentropy', # 每个标签独立计算损失
optimizer='adam',
metrics=['accuracy']
)
# 预测
y_pred_probs = model.predict(x_test)
y_pred = (y_pred_probs > 0.5).astype(int) # 阈值判断每个标签是否选中
4、Adam优化器
4.1概念
Adam 是深度学习中一种常用的优化器。它结合了两种经典优化算法的优点:Momentum(动量法)和 RMSprop(自适应学习率方法),能够自适应地为不同参数调整学习率,在大多数场景下收敛更快、更稳定。
Adam 优化器具有 收敛快、调参简单、鲁棒性强 等优点。
因此,模型的参数更新需要通过反向传播计算梯度,再由 Adam、梯度下降等优化器利用这些梯度来实现。
动量(Momentum):模拟物理中的 “惯性”,累加之前的梯度方向,加速收敛。
自适应学习率:为每个参数维护一个 “学习率缩放因子”:
对于更新频繁的参数(梯度大),缩小学习率,避免过度更新;
对于更新稀少的参数(梯度小),放大学习率,加速收敛。
与传统的“固定学习率”的区别:

4.2 代码示例
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.optimizers import Adam, SGD
from tensorflow.keras.utils import to_categorical
# 1. 加载并预处理数据(MNIST手写数字)
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train / 255.0 # 归一化到[0,1]
x_test = x_test / 255.0
y_train = to_categorical(y_train, 10) # 独热编码(10个类别)
y_test = to_categorical(y_test, 10)
# 2. 定义模型(简单全连接网络)
def build_model():
model = Sequential([
Flatten(input_shape=(28, 28)), # 展平28x28图像为784维向量
Dense(128, activation='relu'),
Dense(64, activation='relu'),
Dense(10, activation='softmax') # 10类分类
])
return model
# 3. 构建两个模型,分别使用Adam和SGD
# 模型1:使用Adam优化器
model_adam = build_model()
model_adam.compile(
optimizer=Adam(learning_rate=0.001), # Adam默认学习率0.001
loss='categorical_crossentropy',
metrics=['accuracy']
)
# 模型2:使用SGD(固定学习率)
model_sgd = build_model()
model_sgd.compile(
optimizer=SGD(learning_rate=0.01), # SGD通常需要更大的学习率
loss='categorical_crossentropy',
metrics=['accuracy']
)
# 4. 训练模型
history_adam = model_adam.fit(
x_train, y_train,
epochs=10,
batch_size=32,
validation_split=0.1,
verbose=1
)
history_sgd = model_sgd.fit(
x_train, y_train,
epochs=10,
batch_size=32,
validation_split=0.1,
verbose=1
)
# 5. 对比训练效果(绘制准确率曲线)
plt.figure(figsize=(10, 6))
plt.plot(history_adam.history['val_accuracy'], label='Adam (验证集准确率)')
plt.plot(history_sgd.history['val_accuracy'], label='SGD (验证集准确率)')
plt.title('Adam vs SGD 优化器对比')
plt.xlabel('Epoch')
plt.ylabel('Validation Accuracy')
plt.legend()
plt.show()
Adam 使用默认学习率 0.001,无需手动调参
5、卷积神经网络
5.1概念
卷积神经网络(Convolutional Neural Network,简称 CNN)是一种专门用于处理网格结构数据(如图像、音频)的深度学习模型。它的核心特点是通过卷积操作自动提取数据中的局部特征(如图像的边缘、纹理、形状),并利用卷积层(局部连接 + 参数共享) 和池化层(降维 + 抗干扰)减少模型复杂度
每层的每个神经元只关注前一层中的一小部分
CNN 与普通神经网络(全连接网络)的核心区别(隐藏层)

最核心的隐藏层差异:
全连接层:神经元与前一层所有输入连接(全局连接),参数随输入维度呈平方级增长(如 28×28 的图像展平后有 784 个特征,一个 100 神经元的全连接层就有 784×100=78,400 个参数)。
卷积层:神经元只与前一层的局部区域(如 3×3 的窗口)连接,且通过卷积核的参数共享,相同特征在不同位置复用同一组参数(如 3×3×3 的卷积核仅 27 个参数,与输入大小无关)。
更多推荐



所有评论(0)