原书:TensorFlow+PyTorch深度学习 从算法到实战
边学边记
TensorFlow与PyTorch
两者都是深度学习框架。
环境安装
windows环境下载安装Anaconda
Anaconda能自动解决依赖包的安装,并且可以管理不同版本的Python。
https://www.anaconda.com/download
安装完成后点击打开Anaconda Powershell Prompt
安装TensorFlow
conda install tensorflow
安装PyTorch
conda install pytorch-cpu -c pytorch #此处为CPU版本,若要安装GPU版本则改为-c pytorch-gpu
安装完后还要安装torchvision包,用于处理图像数据。
torchvision要用pip3安装
pip3 install torchvision
安装高层API框架Keras
conda install keras
以上所有安装完后使用conda list
确认和验证安装
创建虚拟环境
以上安装如果与你先前的版本冲突(比如说截至现在python3.12不支持tensorflow的2.12.0),可能会安装失败,可以用Anaconda创建虚拟环境,避免对系统其他环境依赖产生影响。
conda create -n tf_env python=3.8 #根据框架所需要的依赖选择版本
conda activate tf_env #激活虚拟环境
pip install tensorflow==2.12.0 #根据需要和依赖选择版本
virtualenv也可以创建虚拟环境。
conda的其他命令
conda info #查看conda版本信息
conda install #安装包
conda config #配置conda
conda list #查看已安装的包
conda search #搜索包
conda update #更新包
conda remove #删除包
conda clean -a #清理全部缓存和无用包
conda create #创建环境
conda activate #激活环境
conda deactivate #退出环境
conda env #查看环境
在conda创建的虚拟环境中依旧可以通过install修改安装的依赖和更新包
5-4-6 速成
5 五步法构造基本模型
4 四种基本元素
6 6种基本网络结构
五步法构造基本模型
1 构造网络模型
2 编译模型
3 训练模型
4 评估模型
5 预测模型
网络结构的主要元素
- 网络层结构
- 全连接层Dense
Dense层是最基本的网络层,可以理解为全连接神经网络中的神经元,它接收输入数据,经过矩阵运算得到输出数据。 - 卷积层Conv2D、Conv1D
2D卷积层和1D卷积层都是用来处理图像数据的,它们的输入是图像数据,输出是经过卷积运算得到的特征图。 - 循环层RNN、LSTM、GRU
RNN、LSTM、GRU都是循环神经网络的变种,它们的输入是序列数据,输出是经过循环运算得到的序列数据。对处理语言和文本数据有很大帮助。 - 防止过拟合层
- Dropout层:在训练时随机将某些神经元的输出设置为0,防止过拟合。
- 池化层:对输入数据进行降采样,降低计算量。
- 层间接合层
负责主模型和数据的转换 - 还有其他辅助层等
- 全连接层Dense
- 激活函数
- 激活函数,是指神经网络的输出值经过某种变换后得到的结果。
- 激活函数是神经网络的关键,它决定了神经网络的输出。常见的激活函数有sigmoid、tanh、relu、softmax等。
- 常见的激活函数的优缺点:
- sigmoid函数:输出范围在0~1,适用于二分类问题。
- tanh函数:输出范围在-1~1,适用于回归问题。
- relu函数:输出范围在0~正无穷,适用于分类问题。
- softmax函数:输出范围在0~1,适用于多分类问题。
- 损失函数
- 损失函数,是指神经网络的输出值与真实值之间的差距。
- 损失函数是衡量模型好坏的指标,它是模型的优化目标。常见的损失函数有均方误差、交叉熵、KL散度等。
- 常见的损失函数的优缺点:
- 均方误差:适用于回归问题。
- 交叉熵:适用于分类问题。
- KL散度:适用于概率分布之间的距离计算。
- 优化器
- 优化器,是指模型训练时更新权重的算法。
- 优化器是模型训练的关键,它决定了模型的训练效率。
构造模型的两种方法
过程化方法
Keras提供Sequential容器实现过程式构造
(以下代码未加说明都是用的Keras高层API)
from keras.models import Sequential #导入Sequential容器
from keras.layers import Dense #导入Dense层
model = Sequential() # 创建Sequential模型
model.add(Dense(64, input_dim=100)) # 添加Dense层,输入维度为100,定义神经元个数为64
model.add(Activaton('relu')) # 添加激活函数
model.add(Dense(10, activation='softmax')) # 添加Dense层,输出维度为10,激活函数为softmax
这个模型的含义是输入100维度的特征,经过64个神经元的全连接层,然后使用relu激活函数,再经过10个神经元的全连接层,输出10维度的概率分布。
作用是可以处理100个图片分成10类
函数式方法
inputs = Input(shape=(256,256,3)) # 定义输入层
tower1 = Conv2D(32, (3,3), padding='same')(inputs) # 定义一个卷积层
tower1 = Conv2D(64, (1,1), padding='same')(tower1)
通过输入生成一个Conv2D卷积,再改变卷积核的大小,重新得到卷积层
这里输入被当成参数传递给各层,实现了层之间的串联
模型的编译、训练、评估、预测
- compile:编译模型,指定优化器、损失函数、评估指标。
- fit:训练模型,指定训练数据、训练轮数、批次大小、验证集比例。
- evaluate:评估模型,指定测试数据。
- predict:预测模型,指定测试数据。
model.compile(optimizer=SGD(lr=0.01, momentum=0.9), loss='categorical_crossentropy', metrics=['accuracy']) # 编译模型
y_pred = model.predict(x_test) # 预测模型
编译
lr
:学习率(学习步长) 决定了模型更新权重的速度 此值越小,学习速度越慢,但更准确。越大,可能在靠近最优解时就震荡,难以收敛。
动态改变学习率,初始时较高,随着训练过程逐渐减小,以达到最优解。
momentum
:动量(梯度下降的加速度) 用于加速模型的收敛过程。
batch_size
:批次大小 用于控制每一次迭代训练的样本数量。它能减少内存占用,提高训练效率。
训练
训练模型步骤更为简单
model.fit(x_train, y_train, epochs=10, batch_size=32, validation_split=0.2) # 训练模型
x_train:训练数据
y_train:训练标签
epochs:训练轮数
batch_size:批次大小
validation_split:验证集比例
超参数调优
超参数是指模型训练过程中的参数,如学习率、动量、批次大小等。
超参数调优的目的,是为了找到最优的超参数,使模型在训练数据上的性能达到最佳。
常见的超参数调优方法有网格搜索法、随机搜索法、贝叶斯优化法、遗传算法等。
评估
评估模型更更简单,先前已经指定了评估方法,现在只需要给出测试数据和批次大小
model.evaluate(x_test, y_test,batch_size=128) # 评估模型
评估是为了防止过拟合等,比如常说的从训练集里拿出一部分作为验证集,在验证集上评估模型的性能。
预测
预测是我们的目的。
y_pred = model.predict(x_test) # 预测模型
到此一个基础的完整的模型构建过程也成功收敛了。
未完待续
此方悬停