深度学习框架TensorFlow2快速入门教程

01 深度学习框架TensorFlow2快速入门教程

目录结构

01 概述

02 准备OVF虚拟机镜像

03 导入Ubuntu22的初始化环境

04 使用VMWare拍摄快照进行备份

05 Docker环境的测试和使用

06 安装Nvidia容器工具包

07 GPU支持的TensorFlow的环境搭建和踩坑

08 拉取非GPU支持的TensorFlow镜像

09 启动TensorFlow环境并访问测试

10 优化TensorFlow环境

11 导出TensorFlow环境为OVF镜像

12 在Ubuntu22中安装Anaconda3

13 在Ubuntu22中安装Vscode

14 在Ubuntu22中使用pip安装tensorflow

15 在Ubuntu22中安装CUDA驱动

16 导出支持GPU的TensorFlow环境为OVF镜像

17 创建各种维度的张量

18 将张量转换为numpy

19 将两个张量相加

20 将两个张量进行元素相乘

21 将两个张量进行矩阵相乘

22 张量的一些简单的聚合运算

23 变量的基本用法

24 总结

视频教程

环境搭建

安装

官方地址:https://tensorflow.google.cn/install?hl=zh-cn

通过pip安装

请从 PyPI 中选择以下某个 TensorFlow 软件包进行安装:

  • tensorflow:支持 CPU 和 GPU 的最新稳定版(适用于 Ubuntu 和 Windows)。
  • tf-nightly:预览 build(不稳定)。Ubuntu 和 Windows 均包含 GPU 支持。
  • tensorflow==1.15:TensorFlow 1.x 的最终版本。
bash 复制代码
pip install tensorflow

安装驱动包

参考地址:https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html

Configure the production repository:

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

Optionally, configure the repository to use experimental packages:

sudo sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list

Update the packages list from the repository:

sudo apt-get update

Install the NVIDIA Container Toolkit packages:

sudo apt-get install -y nvidia-container-toolkit

添加GPU支持

Docker 是在 GPU 上运行 TensorFlow 的最简单方法,因为主机只需安装 NVIDIA® 驱动程序,而不必安装 NVIDIA® CUDA® 工具包。

安装 Nvidia 容器工具包以向 Docker 添加 NVIDIA® GPU 支持。nvidia-container-runtime 仅适用于 Linux。

检查 GPU 是否可用:

bash 复制代码
lspci | grep -i nvidia

验证 nvidia-docker 安装效果:

bash 复制代码
docker run --gpus all --rm nvidia/cuda nvidia-smi

通过Docker安装

官方 TensorFlow Docker 映像位于 tensorflow/tensorflow Docker Hub 代码库中。映像版本按照以下格式进行标记:

标记 说明
latest TensorFlow CPU 二进制映像的最新版本。(默认版本)
nightly TensorFlow 映像的每夜版。(不稳定)
version 指定 TensorFlow 二进制映像的版本,例如:2.1.0
devel TensorFlow master 开发环境的每夜版。包含 TensorFlow 源代码。
custom-op 用于开发 TF 自定义操作的特殊实验性映像。

每个基本标记都有会添加或更改功能的变体:

标记变体 说明
tag -gpu 支持 GPU 的指定标记版本。
tag -jupyter 针对 Jupyter 的指定标记版本(包含 TensorFlow 教程笔记本)

下载支持GPU的TensorFlow:

bash 复制代码
docker pull tensorflow/tensorflow:latest-gpu-jupyter

TensorFlow Docker 映像已经过配置,可运行 TensorFlow。Docker 容器可在虚拟环境中运行,是设置 GPU 支持的最简单方法。

bash 复制代码
docker run -it -p 8888:8888 tensorflow/tensorflow:latest-gpu-jupyter

浏览器访问:http://localhost:8888

使用非GPU支持的TensorFlow:

bash 复制代码
docker pull tensorflow/tensorflow:latest-jupyter
docker run -it -p 8888:8888 tensorflow/tensorflow:latest-jupyter

之前的命令有两个问题:

  • 不能开机自动启动的
  • 每次关闭以后,会有一个垃圾容器存在,需要手动的去删除

这两个问题怎么优化呢?

bash 复制代码
docker run --restart=always --name tensorflow -itd -p 8888:8888 tensorflow/tensorflow:latest-jupyter

这个时候有个新的问题,怎么获取token?

bash 复制代码
docker logs -f --tail=100 tensorflow

使用pip安装tensorflow

命令:

bash 复制代码
pip install tensorflow

在Ubuntu22中安装CUDA驱动:

bash 复制代码
# 第一步:安装gcc
sudo apt install gcc -y

# 第二步:下载CUDA
wget https://developer.download.nvidia.com/compute/cuda/11.7.1/local_installers/cuda_11.7.1_515.65.01_linux.run

# 第三步:安装
sudo sh cuda_11.7.1_515.65.01_linux.run

# 第四步:配置环境变量
export PATH=/usr/local/cuda-11.7/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.7/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

# 第五步:安装依赖
sudo apt install nvidia-cuda-toolkit

# 第六步:检查
nvcc -V

张量

张量基本用法

张量本质上是一种数组。

导入依赖:

bash 复制代码
import tensorflow as tf
import numpy as np

创建基础的张量:

python 复制代码
# 创建int32类型的0维张量
rank_0_tensor = tf.constant(4)
print(rank_0_tensor)

# 创建float32类型的1维张量
t1 = tf.constant([2.0, 3, 4])
print(t1)

# 创建二维张量
t2 = tf.constant([[1,2],[3,4],[5,6]], dtype=tf.float32)
print(t2)

创建一个三维的张量:

python 复制代码
t3 = tf.constant([[[1],[2]],[[3],[4]],[[5],[6]]])
print(t3)

张量是通过tf.constant()创建,闯入的值是一个数组,这个数组是几维的,张量就是几维。比较特殊的是,如果传入的是一个常量,那么这个张量,就是0维的张量。

张量转Numpy

方法1:

python 复制代码
np.array(t2)

方法2:

bash 复制代码
t2.numpy()

张量求和

要求两个张量的形状是一样的。会让对应索引的元素分别相加。

举例:

bash 复制代码
a = [[1,2],[3,4]]
b = [[3,3],[4,4]]

a + b = 每个索引位置对应相加 [[1+3,2+3],[3+4,4+4]] = [[4,5],[7,8]]

示例代码:

python 复制代码
a = tf.constant([[1,2],[3,4]])
b = tf.constant([[3,3],[4,4]])

tf.add(a, b)

张量元素乘法

指的是让每个对应索引的元素分别相乘。

距离:

bash 复制代码
a = [[1,2],[3,4]]
b = [[3,3],[4,4]]

a + b = 每个索引位置对应相乘 [[1x3,2x3],[3x4,4x4]] = [[3,6],[12,16]]

示例代码:

python 复制代码
a = tf.constant([[1,2],[3,4]])
b = tf.constant([[3,3],[4,4]])

tf.multiply(a, b)

张量矩阵乘法

矩阵的乘法比较复杂,我们从简单到难度去记忆。

当一个矩阵和一个向量相乘的时候,要求矩阵行的元素个数等于向量的元素个数。结果是矩阵的每行和向量相乘,然后求和,这些和组成的新的一列,形成最后的结果。这个说起来比较复杂,举个简单的例子:

bash 复制代码
[[1,2],[3,4]] 乘 [3,3]

= [1, 2] 乘 [3, 3] = [1*3 + 2*3] = 9
= [3, 4] 乘 [3, 3] = [3*3 + 4*3] = 21

所以结果是:[9, 21]

当一个矩阵和另一个矩阵相乘的时候,要求矩阵和行数和列数是相同的。然后用矩阵的每一行与另一个矩阵的每一列相乘再相加,最终得到一个新的矩阵。还是举个简单的例子:

bash 复制代码
[[1,2],[3,4]] 乘 [[2,3],[2,1]]

= [1,2] 乘 [2,2] , [1,2] 乘 [3,1] = [6,5]
= [3,4] 乘 [2,2] , [3,4] 乘 [3,1] = [14,13]

所以结果是:[[6,5],[14,13]]

举例2:

bash 复制代码
a = 
[
	[1,2],
	[3,4]
]

b = [
	[3,3],
	[4,4]
]

===
[
	[1,2]x[3,4],[1,2]x[3,4],
	[3,4]x[3,4],[3,4]x[3,4]
]

===
[
	[1x3+2x4, 1x3+2x4],
	[3x3+4x4, 3x3+4x4]
]

===
[
	[11, 11],
	[25, 25]
]

示例代码:

python 复制代码
# 矩阵乘以矩阵
a = tf.constant([[1,2],[3,4]])
b = tf.constant([[2,3],[2,1]])
tf.matmul(a, b)

# 矩阵乘以矩阵
a = tf.constant([[1,2],[3,4]])
b = tf.constant([[3,3],[4,4]])
tf.matmul(a, b)

张量求最大值

python 复制代码
cst = tf.constant([[1,2,3],[3,33,333]])
tf.reduce_max(cst)

张量求最小值

python 复制代码
cst = tf.constant([[1,2,3],[3,33,333]])
tf.reduce_min(cst)

张量求和

python 复制代码
cst = tf.constant([[1,2,3],[3,33,333]])
tf.reduce_sum(cst)

张量求平均值

python 复制代码
cst = tf.constant([[1,2,3],[3,33,333]])
tf.reduce_mean(cst)

张量求最大值索引

python 复制代码
cst = tf.constant([[1,2,3],[3,33,333]])
tf.argmax(cst)

张量求最小值索引

python 复制代码
cst = tf.constant([[1,2,3],[3,33,333]])
tf.argmin(cst)

变量

TensorFlow中的变量是一种特殊的张量,形状不可以改变,但是可以改变其中的参数值。定义的方法是:

bash 复制代码
tv = tf.Variable([[1,2],[3,4]])
tv

通过.shape可以查看形状,通过.dtype可以查看数据类型,通过.numpy可以转换为numpy的数组类型。

python 复制代码
print(tv.dtype)
print(tv.shape)
print(tv.numpy)

通过.assign(数组)的方式,可以修改变量的内容。需要注意的是,新的数组必须和旧数组的形状是一样的。

bash 复制代码
tv.assign([[2,2],[3,4]])
相关推荐
埃菲尔铁塔_CV算法26 分钟前
人工智能图像算法:开启视觉新时代的钥匙
人工智能·算法
EasyCVR26 分钟前
EHOME视频平台EasyCVR视频融合平台使用OBS进行RTMP推流,WebRTC播放出现抖动、卡顿如何解决?
人工智能·算法·ffmpeg·音视频·webrtc·监控视频接入
打羽毛球吗️33 分钟前
机器学习中的两种主要思路:数据驱动与模型驱动
人工智能·机器学习
好喜欢吃红柚子1 小时前
万字长文解读空间、通道注意力机制机制和超详细代码逐行分析(SE,CBAM,SGE,CA,ECA,TA)
人工智能·pytorch·python·计算机视觉·cnn
小馒头学python1 小时前
机器学习是什么?AIGC又是什么?机器学习与AIGC未来科技的双引擎
人工智能·python·机器学习
神奇夜光杯1 小时前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
正义的彬彬侠1 小时前
《XGBoost算法的原理推导》12-14决策树复杂度的正则化项 公式解析
人工智能·决策树·机器学习·集成学习·boosting·xgboost
Debroon1 小时前
RuleAlign 规则对齐框架:将医生的诊断规则形式化并注入模型,无需额外人工标注的自动对齐方法
人工智能
羊小猪~~1 小时前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
AI小杨1 小时前
【车道线检测】一、传统车道线检测:基于霍夫变换的车道线检测史诗级详细教程
人工智能·opencv·计算机视觉·霍夫变换·车道线检测