TensorFlow的学习笔记(一)

1.TensorFlow简介

1.1 定义

  TensorFlow 是一个端到端开源机器学习平台, 它允许将深度神经网络的计算部署到任意数量的 CPU 或 GPU 的服务器、PC 或移动设备上,且只利用一个 TensorFlow API。TensorFlow最初由谷歌大脑团队开发,用于Google的研究和生产,于2015年11月9日在Apache 2.0开源许可证下发布。

1.2 特性

  • 支持所有流行语言,如 Python、C++Java、R和Go。
  • 可以在多种平台上工作,甚至是移动平台和分布式平台。
  • 它受到所有云服务(AWS、Google和Azure)的支持。
  • Keras——高级神经网络 API,已经与 TensorFlow 整合。
  • 与 Torch/Theano 比较,TensorFlow 拥有更好的计算图表可视化。
  • 允许模型部署到工业生产中,并且容易使用。
  • 有非常好的社区支持。
  • TensorFlow 不仅是一个软件库,它是一套包括TensorFlow,TensorBoard 和 TensorServing 的软件。

2.TensorFlow环境搭建

参考链接:在Windows系统搭建TensorFlow2.x-GPU环境

3.第一个TensorFlow程序

# 导入tensorflow
import tensorflow as tf

# 打印信息为字符串常量,因此使用tf.constant
message = tf.constant('Welcome to the exciting world of Deep Neural Networks!')

# 利用with语句定义Session,并使用run来运行执行计算图
with tf.Session() as sess:
    print(sess.run(message).decode())
# 输出信息:
2022-01-07 17:19:23.942834: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_100.dll
# 提示 tf.Session过期了,使用tf.compat.v1.Session
WARNING:tensorflow:From C:/develop/DataStructure/Tensorflow/HelloWorld.py:9: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.

2022-01-07 17:19:27.172351: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library nvcuda.dll
2022-01-07 17:19:28.172179: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1618] Found device 0 with properties: 
name: NVIDIA GeForce MX450 major: 7 minor: 5 memoryClockRate(GHz): 0.93
pciBusID: 0000:01:00.0
2022-01-07 17:19:28.172361: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_100.dll
2022-01-07 17:19:28.195329: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cublas64_100.dll
2022-01-07 17:19:28.212785: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cufft64_100.dll
2022-01-07 17:19:28.218871: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library curand64_100.dll
2022-01-07 17:19:28.249342: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cusolver64_100.dll
2022-01-07 17:19:28.266270: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cusparse64_100.dll
2022-01-07 17:19:28.319653: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudnn64_7.dll
2022-01-07 17:19:28.320217: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1746] Adding visible gpu devices: 0
2022-01-07 17:19:28.321009: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
2022-01-07 17:19:28.323689: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1618] Found device 0 with properties: 
name: NVIDIA GeForce MX450 major: 7 minor: 5 memoryClockRate(GHz): 0.93
pciBusID: 0000:01:00.0
2022-01-07 17:19:28.323987: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_100.dll
2022-01-07 17:19:28.324137: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cublas64_100.dll
2022-01-07 17:19:28.324295: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cufft64_100.dll
2022-01-07 17:19:28.324448: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library curand64_100.dll
2022-01-07 17:19:28.324606: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cusolver64_100.dll
2022-01-07 17:19:28.324769: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cusparse64_100.dll
2022-01-07 17:19:28.324923: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudnn64_7.dll
2022-01-07 17:19:28.325100: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1746] Adding visible gpu devices: 0
################################结果######################################
Welcome to the exciting world of Deep Neural Networks!
##########################################################################
2022-01-07 17:19:30.169506: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1159] Device interconnect StreamExecutor with strength 1 edge matrix:
2022-01-07 17:19:30.169628: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1165]      0 
2022-01-07 17:19:30.169690: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1178] 0:   N 
2022-01-07 17:19:30.171814: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1304] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 1269 MB memory) -> physical GPU (device: 0, name: NVIDIA GeForce MX450, pci bus id: 0000:01:00.0, compute capability: 7.5)

Process finished with exit code 0
# 忽略级别 2 及以下的消息(级别 1 是提示,级别 2 是警告,级别 3 是错误)
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'

输出结果:

在这里插入图片描述

4.TensorFlow的程序结构

4.1 计算图定义和执行

  首先将程序分为两个独立的部分,构建任何神经网络的图计算,均包括计算图的定义及其执行。

计算图:包含节点和边的网络。后续定义所有要使用的数据,也就是张量(tensor)对象(常量、变量和占位符),同时定义要执行的所有计算,即运算操作对象(Operation Object,简称 OP)。

  • 每个节点可以有零个或多个输入,但只有一个输出。网络中的节点表示对象(张量和运算操作),边表示运算操作之间流动的张量。

计算图的执行:使用会话对象来实现计算图的执行。

  • 会话对象封装了评估张量和操作对象的环境。这里真正实现了运算操作并将信息从网络的一层传递到另外一层。不同张量对象的值仅在会话对象中被初始化、访问和保存。

  • 在此之前张量对象只被抽象定义,在会话中才被赋予实际的意义。

4.2 案例实践

在这里插入图片描述

需求:两个向量 v_1 和 v_2 将作为输入提供给 Add 操作

# 1.计算图的构建非常简单。添加变量和操作,并按照逐层建立神经网络的顺序传递它们(让张量流动)。
# 2.定义tf.compat.v1.Session()对象,执行run方法
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
# 导入tensorflow环境
import tensorflow as tf

# 定义张量对象
v_1 = tf.constant([1, 2, 3, 4])
v_2 = tf.constant([5, 6, 7, 8])
v_add = tf.add(v_1, v_2)
# 执行会话图
with tf.compat.v1.Session() as sess:
    print(sess.run(v_add))
    
# 输出结果:
[ 6  8 10 12]

5.TensorFlow常量、变量和占位符详解

[TensorFlow](http://c.biancheng.net/tensorflow/) 提供了一个库来定义和执行对张量的各种数学运算。`张量`,可理解为一个n维矩阵,所有类型的数据,包括标量、矢量和矩阵等都是特殊类型的张量。

在这里插入图片描述

TensorFlow 支持以下三种类型的张量:

  • 常量:其值不能改变的张量。
  • 变量:当一个量在会话中的值需要更新时,使用变量来表示。
    • 例如,在神经网络中,权重需要在训练期间更新,可以通过将权重声明为变量来实现。
    • 变量在使用前需要被显示初始化
    • 常量存储在计算图的定义中,每次加载图时都会加载相关变量。换言之,它们是占用内存的。另一方面,变量又是分开存储的。它们可以存储在参数服务器上。
  • 占位符:用于将值输入 TensorFlow 图中。
    • 它们可以和 feed_dict 一起使用来输入数据。
    • 在训练神经网络时,它们通常用于提供新的训练样本。在会话中运行计算图时,可以为占位符赋值。这样在构建一个计算图时不需要真正地输入数据。需要注意的是,占位符不包含任何数据,因此不需要初始化它们。

5.1 TensorFlow 常量

声明标量常量

t_1 = tf.constant(4)
t_1
# <tf.Tensor 'Const_1:0' shape=() dtype=int32>

声明向量常量

t_2 = tf.constant([4,3,2])
t_2
# <tf.Tensor 'Const_2:0' shape=(3,) dtype=int32>

声明所有元素为零的张量

zero_t = tf.zeros([2,3],tf.int32)
zero_t
# <tf.Tensor 'zeros:0' shape=(2, 3) dtype=int32>

声明所有元素为1的张量

ones_t = tf.ones([2,3],tf.int32)
ones_t
# <tf.Tensor 'ones:0' shape=(2, 3) dtype=int32>

声明等差序列的张量

range_t = tf.linspace(2.0,5.0,5)
range_t
# <tf.Tensor 'LinSpace:0' shape=(5,) dtype=float32>

声明数字序列张量

range_t = tf.range(10)
range_t
# <tf.Tensor 'range:0' shape=(10,) dtype=int32>

创建具有不同分布的随机张量

# 创建一个具有一定均值(默认值=0.0)和标准差(默认值=1.0)、形状为 [M,N] 的正态分布随机数组
t_random = tf.random_normal([2,3], mean=2.0, stddev=4, seed=12)
t_random
# <tf.Tensor 'random_normal:0' shape=(2, 3) dtype=float32>
#result: [[ 0.25347447  5.37991     1.9527606 ]
# [-1.5376031   1.2588985   2.8478067 ]]

#创建一个具有一定均值(默认值=0.0)和标准差(默认值=1.0)、形状为[M,N]的截尾正态分布随机组:
t_random = tf.truncated_normal([1,5], stddev=2, seed=12)
# <tf.Tensor 'truncated_normal:0' shape=(1, 5) dtype=float32>
# result: [[-0.87326276  1.689955   -0.02361972 -1.7688016  -3.87749]]
# 在种子的[minval(default=0),maxval]范围内创建形状为[M,N]的给定伽马分布随机数组:
t_random = tf.random_uniform([2,3], maxval=4, seed=12)
# <tf.Tensor 'random_uniform:0' shape=(2, 3) dtype=float32>
# result:[[2.54461   3.6963658 2.7051091]
 #[2.0085006 3.8445983 3.5426888]

5.2 TensorFlow 变量

通过使用变量类来创建。变量的定义还包括应该初始化的常量/随机值

注意:变量通常在神经网络中表示权重和偏置。

# ① 创建了两个不同的张量变量 t_a 和 t_b。两者将被初始化为形状为 [50,50] 的随机均匀分布,最小值=0,最大值=10:
rand_t = tf.random_uniform([50,50],0,10,seed=0)
t_a=tf.Variable(rand_t)
t_b=tf.Variable(rand_t)
# Tensor("random_uniform_2:0", shape=(50, 50), dtype=float32)
# <tf.Variable 'Variable:0' shape=(50, 50) dtype=float32_ref>
# <tf.Variable 'Variable_1:0' shape=(50, 50) dtype=float32_ref>


# ② 定义两个变量的权重和偏置。权重变量使用正态分布随机初始化,均值为 0,标准差为 2,权重大小为 100×100。偏置由 100 个元素组成,每个元素初始化为 0。
weights = tf.Variable(tf.random_normal([100,100], stddev=2))
# <tf.Variable 'Variable_10:0' shape=(100, 100) dtype=float32_ref>
bias = tf.Variable(tf.zeros([100]), name='biases')
# <tf.Variable 'biases_1:0' shape=(100,) dtype=float32_ref>

# ③ 指定一个变量来初始化另一个变量
weight2 = tf.Variable(weights.initialized_value(), name='w2')
# <tf.Variable 'w2:0' shape=(100, 100) dtype=float32_ref>


# ④ 变量的定义将指定变量如何被初始化,但是必须显式初始化所有的声明变量。在计算图的定义中通过声明初始化操作对象来实现:
initial_op = tf.global_variables_initializer()
# <tf.Operation 'init' type=NoOp>

# 每个变量也可以在运行图中单独使用 tf.Variable.initializer 来初始化:
bias = tf.Variable(tf.zeros([100,100]))
	with tf.compat.v1.Seesion() as sess:
        ses.run(bias.initializer)

变量保存:

saver = tf.train.Saver()

5.3 TensorFlow 占位符

占位符用于将数据提供给计算图

定义:

# dtype 定占位符的数据类型,并且必须在声明占位符时指定
tf.placeholder(dtype,shape=None,name=None)

案例:

# 为x定义一个占位符并计算 y=2*x,使用 feed_dict 输入一个随机的 4×5 矩阵:
x = tf.placeholder("float")
y = 2 * x
data = tf.random_uniform([4,5],10)
with tf.compat.v1.Session() as sess:
    x_data = sess.run(data)
    print(sess.run(y, feed_dict = {x:x_data}))

# result:[[12.158809  18.582188  12.130547   9.262866   5.6432724]
# [10.886764   8.388267  15.074805   4.576146  18.596395 ]
# [ 2.9776287  7.8228397  4.0424137  8.951438  14.3964815]
# [18.080265  17.428185  15.868042   2.779602  12.115258 ]]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值