吴恩达深度学习复盘(7)一个简单训练示例

简介

本篇简单讲解简单的神经网络训练。通过回顾逻辑回归模型训练,了解神经网络训练的相关内容。比如训练步骤、损失函数、优化算法以及深度学习库的使用,了解训练过程中的相关概念。

例子

手写数字识别(判断是 0 还是 1)。这是常见的二分类问题。构建一个包含输入层、两个隐藏层(分别有 25 个和 15 个单元)以及一个输出层的神经网络,搭建模型,损失函数确定,再到参数优化。

原理

1. 逻辑回归模型原理

 - 模型构建与输出计算:

逻辑回归模型需明确输入特征X与输出的关系,其输出由权重W和偏置B决定,通过Sigmoid函数对W \cdot X + B进行运算得到,即输出为\frac{1}{1 + e^{-(W \cdot X + B)}},确定了输入到输出的映射规则。

- 损失函数与成本函数:

损失函数衡量单个训练样本的预测误差,对于逻辑回归,单个样本损失为-y \cdot \log(F(X)) - (1 - y) \cdot \log(1 - F(X))

,其中y为真实标签,F(X)为预测输出。成本函数则是对所有训练样本损失函数的平均值,是关于WB的函数,用于从整体训练集角度评估模型性能。

- 模型训练优化:

采用梯度下降算法,通过不断更新参数WBW = W - \alpha \cdot \frac{\partial J}{\partial W}),(B = B - \alpha \cdot \frac{\partial J}{\partial B}),(alpha为学习率,\frac{\partial J}{\partial W}\frac{\partial J}{\partial B}为成本函数J关于WB的偏导数),逐步减小成本函数,使模型拟合训练数据。

2. 神经网络训练原理

 - 模型结构与输出计算:

类似逻辑回归确定输入输出关系,神经网络通过定义网络结构(如各层单元数量),明确输入如何经各层处理得到输出。例如,输入数据依次经过包含特定数量单元的隐藏层,最终到达输出层,各层的权重和偏置参数决定数据处理方式,确定了复杂的输入到输出映射。

- 损失函数与成本函数确定:

对于二分类神经网络,常用二元交叉熵损失函数,形式与逻辑回归类似,为-y \cdot \log(F(X)) - (1 - y) \cdot \log(1 - F(X)),其中y是真实标签,F(X)是神经网络输出。对所有训练样本的损失求平均得到成本函数。若为回归问题,则可选用均方误差等不同损失函数。

- 模型训练优化:

利用反向传播算法计算成本函数关于参数的偏导数,进而使用梯度下降等算法更新参数。在实际应用中,如使用TensorFlow框架,通过调用fit函数,框架自动执行反向传播和参数更新过程,以最小化成本函数,优化神经网络性能。

实践建议

1. 理解为先:

尽管深度学习库功能强大且方便使用,但深入理解神经网络训练原理是关键。当训练过程出现问题(如模型不收敛、准确率低等),扎实的原理知识有助于快速定位和解决问题。

2. 合理选择损失函数:

根据问题类型(分类或回归)合理选择损失函数。对于分类问题,要依据类别数量和数据特点确定合适的损失函数,如二分类常用二元交叉熵损失函数;回归问题则多考虑均方误差等损失函数,以确保模型能准确衡量预测与真实值的差异。

3. 借助成熟库提升效率:

鉴于深度学习库已成熟,实际开发中应充分利用如TensorFlow、PyTorch等库。它们提供了高效且经过优化的实现,能大幅减少开发时间和工作量。例如,在使用TensorFlow训练神经网络时,可通过简单调用函数完成复杂的模型训练过程。

4. 尝试不同网络设置:

在掌握基本神经网络训练方法后,可尝试调整网络设置,如改变隐藏层单元数量、更换激活函数等,以探索提升模型性能的可能性,根据实际任务需求优化模型。

示例代码

import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.utils import to_categorical

# 加载 MNIST 数据集
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

# 数据预处理
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255

# 将标签进行 one - hot 编码
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

# 构建模型
model = Sequential([
    Dense(25, activation='relu', input_shape=(28 * 28,)),
    Dense(15, activation='relu'),
    Dense(10, activation='softmax')
])

# 编译模型
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# 训练模型
model.fit(train_images, train_labels, epochs=5, batch_size=128)

# 评估模型
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"Test accuracy: {test_acc}")
    

笔者注

本篇笔记没有什么特别的地方,只是简单回顾了解一下与训练相关的底层知识,后面几篇会更详细的拆解。

深度学习工作本身会比较枯燥,代码写下去后剩下的是显卡在烧。学习AI的话,API本身没什么可说的,工作流反而比API重要的多,而底层的数学才是AI更有意思的地方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值