目录
什么是TensorFlow
TensorFlow的特点
安装方法
在线安装
离线安装
案例1:Hello TensorFlow!
案例2:张量相加
TensorFlow体系结构
体系结构概述
单机模式与分布式模式
后端逻辑层次
基本概念
张量(Tensor)
数据流
操作(Operation, 简称OP)
图(Graph)和会话(Session)
变量(Variable)和占位符(Placeholder)
TensorFlow的基本操作
图及相关操作
案例3:查看默认图的属性
会话及相关操作
相关操作
会话常见的错误及原因
案例4:指定会话运行某个图
张量的阶与形状
张量的数据类型
张量常用属性
案例5:查看张量属性
案例6:生成张量
张量类型转换
案例7:张量类型转换
占位符及其用法
案例8:占位符使用
张量形状改变
案例9:修改张量形状
张量数学计算
案例10:张量数学计算
变量及其操作
案例11:变量使用示例
TensorFlow是由谷歌人工智能团队谷歌大脑开发和维护的开源深度学习平台,是目前人工智能领域主流的开发平台,在全世界有着广泛的用户群体。
安装tensorflow及依赖包:pip install tf-nightly
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ tensorflow
安装纯净包:pip install tensorflow
安装gpu版:pip install tf-nightly-gpu
https: //pypi. org/project/tensorflow/#files
import tensorflow as tf
hello = tf. constant("hello TensorFlow! ")#定义一个常量(张量)
sess = tf. session()#创建一个session用来执行操作
print(sess. run(hello))#用sess的run方法执行hello操作,并打印结果
sess. close()
import tensorflow as tf
a = tf. constant(5. 0)#张量a
b = tf. constant(1. 0)#张量b
c = tf. add(a, b)#张量相加
with tf. session as sess:
print(sess. run(c))
tensorflow属于"定义""运行"相分离的运行机制。从操作层面可以抽象为两种:模型构建和模型运行。
客户端:用户编程,执行使用
调度器master:用来与客户端交互并进行任务调度。
工作节点work process:每个work process的可以访问一到多个device。
设备device:tensorflow的计算核心执行计算。
TensorFlow的实现分为"单机实现"和"分布式实现"。
多维数组或向量,张量是数据的载体,包含名字、形状、数据类型等属性。
指专门执行计算的节点,tensorflow函数或api定义的都是操作。
常用操作包括:标量运算、向量运算、矩阵运算、带状态的运算、神经网络组件、存储、恢复、控制流、队列及同步运算等等。
import tensorflow as tf
os. environ['TF_CPP_MIN_LOG_LEVEL'] = '2'#调整警告级别
a = tf. constant (5. 0)
b = tf. constant (1. 0)
c = tf. add (a, b)
graph = tf. get_default_graph()#获取默认的图
with tf. Session() as ass:
print(sess. run(c))
print(a. graph)#打印张量的graph属性
print(c. graph)#打印操作c的graph属性
print(sess. graph)#打印session的graph属性
tf. Session()#使用默认图
- session. run.(fetches, feed_dict = None)
- 参数:fetches 图中的单个操作,或多个操作的列表
feed_dict 运行传入的参数构成的字典,可以覆盖之前的值
session. close()
调用run()方法时,可能会出现的错误及原因:
- RuntimeError:Session处于无效(如关闭)
- TypeError:fetches或feed_dict的键是不合适的值
- ValueError:fetches或feed_dict的键无效或引用的值不存在
import tensorflow as tf
os. environ['TF_CPP_MIN_LOG_LEVEL'] = '2'#调整警告级别
a = tf. constant (5. 0)
b = tf. constant (1. 0)
c = tf. add (a, b)
graph = tf. get_default_graph()#获取默认的图
print(graph)
#新创建一个图
graph2 = tf. Graph()
print(graph2)
with graph2. as_default_graph(): #设置默认图
d = tf. constant (11.0)#操作d属于graph2
with tf. Session(graph = graph2) as ass: #执行graph2
print(sess. run(c))#报错,因为c不在graph2中
print(sess. run(d))
print(a. graph)#打印张量的graph属性
print(c. graph)#打印操作c的graph属性
print(sess. graph)#打印session的graph属性
0维:() 1维: (5) 一行5个元素
2维: (2, 3)2行三列 3维: (2, 3, 4)两个3行4列的矩阵
import tensorflow as tf
os. environ['TF_CPP_MIN_LOG_LEVEL'] = '2'#调整警告级别
a = tf. constant(5. 0)
with tf. Session() as sess:
print(sess,. run(a))
print("name: ", a. name)
print("dtype: ", a. dtype)
print("shape:", a. shape)
print("op:", a. op)
print("graph:", a. graph)
import tensorflow as tf
os. environ['TF_CPP_MIN_LOG_LEVEL'] = '2'#调整警告级别
#创建一个值全部为0的张量
tensor_zeros = tf. zeros(shape = [2, 3], dtype ="float32")
#创建一个值全部为1的张量
tensor_ones = tf. ones(shape = [2, 3], dtype ="float32")
#创建正态分布随机张量
tensor_nd = tf. random_normal(shape = [10], mean = 1. 7, stddev = 0. 2, dtype = "floar32")
#创建一个形状和tensor_ones一样,值全为0的张量
tensor_zeros_like = tf. zeros_like(tensor_ones)
with tf. Session() as sess:
print(tensor_zeros. eval())#eval表示在session中执行计算,相当于sess. run(),但更便捷
print(tensor_ones. eval())
print(tensor_nd,. eval())
print(tensor_zeros_like. eval())
import tensorflow as tf
tensor_ones = tf. ones(shape =[2, 3], dtype ="int32")
tensor_float = tf. constant(1. 1, 2.2, 3. 3)
with tf. Session as sess:
print(tf. cast(tensor_ones, tf. float32). eval())#将tensor_ones转换为浮点型并打印
print(tf. cast(tensor_float, tf. string). eval())#类型不兼容的转换,不允许直接转换
placeholder节点被声明的时候是未初始化的,也不包含数据,如果没有为他提供数据,则tensorflow运算时会产生错误。
name = placeholder(dtype, shape = None, name = None)
import tensorflow as tf
#定义两个占位符
plhd = tf. placeholder(tf. float32, [2, 3])
plhd2 = tf. placeholder(tf. float32, [None, 3])
plhd3 = tf. placeholder(tf. float32, [None, 4])
with tf. Session as sess:
d = [[1, 2, 3], [4, 5, 6]]
print(sess. run(plhd, feed_dict = {plhd: d}))#执行占位符操作需要传入数据
print(sess. run(plhd2, feed_dict = {plhd2: d}))#定义为n行3列,执行时传入两行三列
print(sess. run(plhd3, feed_dict = {plhd3: d})#定义为n行4列,执行时传入2行3列,报错
tf. Tensor. get_shape(): 获取Tensor对象的静态形状
tf. Tensor. set_shape(): 更新Tensor对象的静态形状
#注意:更换静态形状的时候,1-D到1-D, 2-D到2-D,不能跨阶数改变形状;对于已经固定或者设置静态形状的变量或张量,不能再次设置静态形状。
tf. reshape(tf. Tensor, shape) : 梦见一个具有不同动态形状的新张量
可以跨纬度转换,如1-D到2-D, 1-D到3-D。
import tensorflow as tf
#静态形状:初始形状,只能设置一次,不能阶界设置
#动态形状:运行时的形状,可以多次设置,可以跨接设置,但元素总数要一样
pld = tf. placeholder(tf. float32, [None, 3])
pld. set_shape([4, 3])#设置静态形状,一旦固定,就不能再次改变
print(pld)
#pld. set_shape([5, 3])静态形状只能设置一次,再次设置系统会报错
#设置张量的动态形状,实际是创建一个新的张量
new_pld = tf. reshape(pld, [3, 4])#设置动态形状
print(new_pld)
new_pld = tf. reshape(pld, [2, 6]) #多次设置动态形状
print(new_pld)
#new_pld = tf. reshape(pld, [2, 4])元素数量不匹配,系统报错
with tf. Session() as sess:
pass
需要特别说明一下矩阵乘法的规则:
import tensorflow as tf
os. environ['TF_CPP_MIN_LOG_LEVEL'] = '2'#调整警告级别
x = td. constant([[1, 2], [3, 4]], dtype = tf. float32)
y = td. constant([[4, 3], [3, 2]], dtype = tf. float32)
x_add_y = tf. add(x, y)#张量相加
x_mul_y = tf. matmul(x, y)#张量矩阵相乘
log_x = tf. log(x)#求对数
x_sum_1 = tf. reduce_sum(x, axis = [1])#1表示在行方向 0表示在列方向
#张量计算片段和
data = tf. constant([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype = tf. float32)#定义原始张量
segment_idx = tf. constant([0, 0, 0, 1, 1, 2, 2, 2, 2, 2], dtype = tf. int32)#定义一个片段,几个元素相同元素为一组,上面相同数量的数字相加
x_seg_sum = tf. segment_sum(data, segment_ids)
with tf. Session as sess:
print(x_add_y. eval())
print(x_mul_y. eval())
print(log_x. eval())
print(x_sum. eval())#在指定维度上求和
print(x_seg_num. eval())
tf. Variable(initial_Value = None, name = None)
"""
1.变量是一种特殊的张量
2.变量可以进行持久化保存,张量则不可以
3.变量使用之前,要进行显式的初始化
"""
import tensorflow as tf
a = tf.costant([1,2,3,4])
var = tf.Variable(tf.random_normal([2,3],mean = 0.0,stddev = 1.0),
name = "var")
#在变量操作执行之前,要执行全局初始化(初始化也是一个OP,需要在Session的run方法中执行)
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
print(see.run(a))