计算机视觉和图像处理
Tensorflow入门
一、深度学习框架—TensorFlow
1.1 TensorFlow介绍
TensorFlow 是一个非常强大且流行的开源机器学习框架,可以让开发者轻松构建和部署各种类型的机器学习模型,包括但不限于深度学习模型。
TensorFlow 的主要组件
- Tensor:TensorFlow 中的基本数据结构,是一个多维数组,可以用来表示数据。
- Graph:TensorFlow 1.x 中使用的一种数据流图,用于描述计算过程。
- Session:TensorFlow 1.x 中用于执行 Graph 中的计算。
- Eager Execution:TensorFlow 2.x 引入的一种即时执行模式,允许开发者以更直观的方式编写和调试代码。
- Keras:一个高级神经网络 API,自 TensorFlow 2.0 开始集成到 TensorFlow 中,提供了易于使用的接口来构建和训练模型。
1.2 安装TensorFlow
- 创建虚拟环境
在Anaconda终端中创建虚拟环境tf_env
conda create --name tf_env
- 激活虚拟环境
conda activate tf_env
- 安装TensorFlow
pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple
- 查看是否安装成功
import tensorflow as tf
rf._version_
1.3 张量及其操作
1.3.1 张量Tensor
张量是⼀个多维数组。 与NumPy ndarray对象类似
import tensorflow as tf
import numpy as np
- 创建张量
# 创建0维张量,即标量(数字)
tf.constant(3)
# 创建一维张量
tf.constant([1.0, 2.0, 3.0])
# 创建二维张量
tf.constant([[1,2],[3,4],[5,6]],dtype=tf.float16)
# 创建三维张量
tf.constant([[[1,2,3,4,5],[6,7,8,9,10]],[[11,12,13,14,15],[16,17,18,19,20]],[[21,22,23,24,25],[26,27,28,29,30]]])
- 转换为numpy
tensor1 = tf.constant([1,2,3,4,5])
tensor1.numpy()
np.array(tensor1)
- 常用函数
a = tf.constant([[1,2],[3,4]])
b = tf.constant([[1,1],[1,1]])
# 加法
tf.add(a,b)
# 元素相乘
tf.multiply(a,b)
# 矩阵乘法
tf.matmul(a,b)
# 最大值
tf.reduce_max(a)
# 最大索引
tf.argmax(a)
# 平均值
tf.reduce_mean(a)
- 变量
var = tf.Variable([[1,2],[3,4]])
var
var.shape
var.dtype
var.numpy()
# 变量形状不可以改变,可以改变其中参数
var.assign([[6,7],[8,9]])
1.4 tf.keras介绍
tf.keras
是 TensorFlow
提供的一个高级 API,用于构建和训练深度学习模型。它旨在提供一个用户友好、模块化且易于扩展的接口,以便开发人员能够轻松地设计和训练复杂的神经网络模型。tf.keras
兼容 TensorFlow 2.x
,并且可以无缝地与其他 TensorFlow
功能集成。
1.4.1 tf.keras 的主要组件
- 模型
Sequential
:这是一个线性堆叠层的模型,适合简单的前馈网络。
Functional API
:这是一种更灵活的方法,允许创建具有任意拓扑结构的模型,包括多输入/多输出模型、共享层模型等。
Subclassing
:这是一种通过继承 tf.keras.Model 类来定义模型的方法,适用于更复杂的情况,例如循环网络或需要自定义训练循环的情况。 - 层
Dense
:全连接层,是最常用的层之一。
Convolutional Layers
:卷积层,用于处理图像和其他二维数据。
Pooling Layers
:池化层,用于降低数据的空间维度。
Recurrent Layers
:循环层,如 LSTM 和 GRU,用于处理序列数据。
Normalization Layers
:归一化层,如 Batch Normalization,用于加速训练过程。
Dropout Layer
:用于防止过拟合的层。 - 优化器
Adam
:一种自适应学习率优化算法,广泛用于深度学习。
SGD
:随机梯度下降优化器,适用于各种情况。
RMSprop
:另一种自适应学习率优化器,适用于训练 RNNs 和其他模型。 - 损失函数
Mean Squared Error (MSE)
:均方误差,用于回归任务。
Categorical Crossentropy
:多类别分类任务中常用的损失函数。
Binary Crossentropy
:二分类任务中常用的损失函数。 - 指标
Accuracy
:分类任务中最常用的指标之一。
Precision
:精确率,用于评估模型预测正例的能力。
Recall
:召回率,用于评估模型识别所有正例的能力。
1.4.2 tf.keras使用
- 使⽤tf.keras进⾏分类时的主要流程:数据处理-构建模型-模型训练-模型验证
- tf.keras中构建模型可通过squential()来实现并利⽤.fit()⽅法进⾏训练
- 使⽤evaluate()⽅法计算损失函数和准确率
详见快速入门模型 2.4
二、快速入门模型(iris)
2.1 导入相关库
# 导入相关库
import seaborn as sns
import numpy as np
import pandas as pd
# 机器学习sklearn
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegressionCV
# 深度学习tf.keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras import utils
2.2 数据处理
# 加载数据
iris = pd.read_csv('iris_data.csv')
iris.head()
# 数据展示
sns.pairplot(iris.drop("label",axis=1),hue='target')
# 获取数据集的特征值和目标值
# values返回 DataFrame 中的数据作为 NumPy 数组
x = iris.values[:,0:4]
y = iris.values[:,4]
#数据划分
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.4,random_state=2)
2.3 sklearn实现鸢尾花
# 使用逻辑回归
lr = LogisticRegressionCV()
lr.fit(x_train,y_train)
# 模型评估
lr.score(x_test,y_test)
2.4 tf.keras的实现
2.4.1 数据处理
# 目标值进行热编码
def one_hot_encode(arr):
# 获取目标值中的所有类别并进行热编码
# return_inverse返回arr每个原始数组元素在uniques唯一值数组中的索引位置,即ids
uniques,ids = np.unique(arr,return_inverse=True)
# to_categorical将整数数组dis转换为二进制(即 One-Hot)表示。
return utils.to_categorical(ids,len(uniques))
# 对训练集进行热编码
y_train_one = one_hot_encode(y_train)
y_train_one
# 对测试集进行热编码
y_test_one = one_hot_encode(y_test)
2.4.2 模型构建
# 通过sequential进行构建
model = Sequential([
# 隐藏层,激活函数relu
Dense(10,activation="relu",input_shape=(4,)),
# 隐藏层
Dense(10,activation="relu"),
# 输出层
Dense(3,activation="softmax")
])
# 查看模型的架构
model.summary()
# 查看模型的架构
utils.plot_model(model,show_shapes=True)
2.4.3 模型训练与预测
# 模型编译
# optimaizer优化策略,loss损失函数,metrics评估指标
model.compile(optimizer="adam",loss="categorical_crossentropy",metrics=["accuracy"])
# 类型转换
x_train = np.array(x_train,dtype=np.float32)
x_test = np.array(x_test,dtype=np.float32)
# 模型训练
# epochs训练轮次,batch_size每次更新权重所使用的样本数量为1,verbose训练过程的显示模式
model.fit(x_train,y_train_one,epochs=10,batch_size=1,verbose=1)
# 模型评估
loss,accuracy = model.evaluate(x_test,y_test_one,verbose=1)