文章目录
tensorflow的安装
tensorflow有1.x和2.x,CPU和GPU版本的
这里我安装的是tensorflow1.15.0CPU版本
步骤:
1.创建一个虚拟环境
打开cmd终端,输入命令:
conda create -n pachong python==3.6.5
这条命令就创建了一个名字为pachong,基于python版本3.6.5的环境
2.查看anaconda环境下所有的虚拟环境
conda info --envs
3.安装tensorflow1.15.0
激活当前环境
activate pachong
在当前环境安装1.15.0版本的tensorflow
conda install -n pachong tensorflow==1.15.0
4.在pycharm中配置当前的虚拟环境
tensorflow结构分析
TensorFlow程序通常被组织成一个构建图阶段和一个执行图阶段。
在构建阶段,数据与操作的执行步骤被描述成一个图。
在执行阶段,使用会话执行构建好的图中的操作。
图和会话︰
-----------图:这是TensorFlow将计算表示为指令之间的依赖关系的一种表示法。
-----------会话: TensorFlow跨一个或多个本地或远程设备运行数据流图的机制
张量:TensorFlow中的基本数据对象
节点:提供图当中执行的操作
数据流图:
TensorFlow: Tensor - 张量 - 数据 Flow - 流动
TensorFlow是一个采用数据流图(data flow graphs),用于数值计算的开源框架。 节点(Operation)在图中表示数学操作,线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor) 。
tensorflow实现一个简单的加法运算:
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
def tensorflow_demo():
"""
TensorFlow的基本结构
:return:
"""
# 原生python加法运算
a = 2
b = 3
c = a + b
print("普通加法运算的结果:\n", c)
# TensorFlow实现加法运算
a_t = tf.constant(2)
b_t = tf.constant(3)
c_t = a_t + b_t
print("TensorFlow加法运算的结果:\n", c_t)
# 开启会话
with tf.Session() as sess:
c_t_value = sess.run(c_t)
print("c_t_value:\n", c_t_value)
return None
图与会话
什么是图结构
图包含了一组tf.Operation代表的计算单元对象和tf.Tensor代赛的计算单元之间流动的数据。
图结构:数据(Tensor) + 操作(Operation)
图相关操作
1 默认图 通常TensorFlow会默认帮我们创建一张图。
查看默认图的两种方法:
通过调用tf.get_default_graph()访问,要将操作添加到默认图形中,直接创建OP即可。
op、sess都含有graph属性,默认都在一张图中
上面我们的代码有了一个加法运算,明明已经有了数据和对应的操作,但是图在哪里呢?
其实刚才的运算是使用的默认图
#tensorflow 实现加法运算
a=tf.constant(2)
b=tf.constant(3)#数据是3
c=a+b#操作是加法
print("tensorflow加法运法的结果:\n",c)
这个代码tensorflow会自动生成对应的默认图
查看默认图的两种方式:
#方法一:调用方法
default_g=tf.get_default_graph()
print("default_g:\n",default_g)
#方法二:查看属性
print("a的图属性:\n",a.graph)
print("c的图属性:\n", c.graph)
with tf.Session() as sess:
c_value=sess.run(c)
print("c_value:\n",c_value)
print("sess的图属性:\n", sess.graph)
创建自定义的图 tf.Graph()
#创建自定义图
new_g=tf.Graph()
在自己的图中定义数据和操作,借用上下文管理器tf.Graph.as_default()
with new_g.as_default():
a_new=tf.constant(20)
b_new=tf.constant(30)
c_new=a_new+b_new
print("c_new=\n",c_new)
会话的两种开启方式
tf.Session:用于完整的程序当中
tf.InteractiveSession:用于交互式上下文中的
__init__(target=", graph=None, config=None)
"""
初始化会话对象时的参数:
target:如果将此参数留空(默认设置),会话将仅使用
本地计算机中的设备。可以指定grpc://网址,蚁便指
定TensorFlow服务器的地址,这使得会话可以访问该
服务器控制的计算机上的所有设备。
graph:默认情况下,新的tf.Session将绑定到当前的
默认图。
config:此参数允许您指定一个tf.ConfigProto 以
便控制会话的行为。例如,ConfigProto协议用于打
印设备使用信息
"""
"""
2会话的run()
run(fetches,feed_dict=None, options=None, run_metadata=None)
-通过使用sess.run()来运行operation
-fetches:单一的operation,或者列表、元组(其它不
属于tensorflow的类型不行)
-feed_dict:参数允许调用者覆盖图中张量的值,运行时
赋值
-----------与tf.placeholder搭配使用,则会检查值
的形状是否与占位符兼容。
使用tf.operation.eval()也可运行operation,但需要在会话中运行
"""
#上下文管理器开启会话,它会自动回收资源,不用手动回收
with tf.Session(config=tf.ConfigProto(allow_soft_placement=True,
log_device_placement=True)) as sess:
# 同时执行多个tensor
print(sess.run([a, b, c]))#[2, 3, 5]
a_t,b_t,c_t=sess.run([a, b, c])
print("abc:\n",a_t,b_t,c_t)
# abc:
# 2 3 5
# 也可以用eval 查看值
print('用eval查看计算的值', a.eval())
print('会话的属性:\n', sess.graph)
#定义占位符tf.placeholder()
a1 = tf.placeholder(tf.float32, shape=[])
b1= tf.placeholder(tf.float32, shape=[])
c1 = tf.constant([1,2,3])
with tf.Session() as sess:
a2,b2,c2 = sess.run([a1,b1,c1],feed_dict={a: 1, b: 2,c:[4,5,6]})
print(a2,b2,c2)
#传统会话定义,要关闭会话资源
sess=tf.Session()
sum_t=sess.run(c)
print("sum_t:\n",sum_t)
sess.close()#关闭会话资源
OP
1 常见op
接下来我们要区分一下操作函数和操作对象
# 操作函数:
# tf.constant(Tensor对象)
# f.add(Tensor对象1, Tensor对象2)
# 操作对象:(在调用操作函数时会生成一个操作对象)
# 输入Tensor对象-Const对象-输出Tensor对象
# 输入Tensor1、2对象 -Add对象-输出Tensor对象
#个人理解:
# 输入一个tensor对象来调用tf.constant()
# 操作函数,在调用操作函数的过程中会生成一个const操
# 作对象,这个操作对象的作用就是定义一个数,当操作对
# 象完成操作后就可以输出tensor对象,这个输出的tensor
# 对象是以返回值的形式输出的,即操作函数的返回值
#
#官方解释:
# 一个操作对象(Operation)是TensorFlow图中的
# 一个节点,可以接收0个或者多个输入Tensor,并
# 且可以输出o个或者多个Tensor,Operation对
# 象是通过op构造函数(如tf.matmul0)创建的。
# 例如: c = tf.matmul(a, b)创建了一个
# Operation对象,类型为MatMul类型,它将张量
# a, b作为输入,c作为输出,,并且输出数据,打
# 印的时候也是打印的数据。其中tf.matmul)是
# 函数,在执行matmul函数的过程中会通过MatMul
# 类创建一个与之对应的对象(就是MatMul操作对象)
#
import tensorflow as tf
con_a=tf.constant(3.0,name="con_a")
con_b=tf.constant(4.0,name="con_b")
sum_c=tf.add(con_a,con_b,name="sum_c")
print("打印con_a:\n",con_a)
print("打印con_b:\n",con_b)
print("打印sum_c:\n",sum_c)
import tensorflow as tf
con_a=tf.constant(3.0,name="con_a")
con_b=tf.constant(4.0,name="con_b")
sum_c=tf.add(con_a,con_b,name="sum_c")
print("打印con_a:\n",con_a)
print("打印con_b:\n",con_b)
print("打印sum_c:\n",sum_c)
# 打印con_a:
# Tensor("con_a:0", shape=(), dtype=float32)
# 打印con_b:
# Tensor("con_b:0", shape=(), dtype=float32)
# 打印sum_c:
# Tensor("sum_c:0", shape=(), dtype=float32)
# 注意,打印出来的是张量值,可以理解成OP当中包含了
# 这个值。并且每一个OP指令都对应一个唯一的名称,如
# 上面的Const:0,这个在TensorBoard上面也可以显示
# 请注意,tf.Tensor对象以输出该张量的tf.Operation
# 明确命名。张量名称的形式为“<OP_NAME>:<i>",其中:
# "<OP_NAME>”是生成该张量的指令的名称
# "<i>”是一个整数,它表示该张量在指令的输出中的索引
指令名称
# 2.指令名称
# 一张图有一个命名空间
# 每个创建的新的tf.Operation或返回新的
# tf.Tensor的API函数可以接受可选的name
# 参数,就是说指令名称是可以更改的
# 例如,tf.constant(42.0,name="answer")创建了一个
# 名为"answer”的新tf.Operation并返回一个名为"
# "answer:0”的tf.Tensor。如果默认图已包含名为"
# "answer”的指令,则TensorFlow 会在名称上附加
# "1"、“2”等字符,以便让名称具有唯一性。
张量
# TensorFlow用张量这种数据结构来表示所有的数据.
# 你可以把一个张量想象成一个n维的数组或列表.一个张
# 量有一个静态类型和动态类型的维数.张量可以在图中的
# 节点之间流通.其实张量更代表的就是一种多位数组。
# 张量 在计算机当中如何存储?
# 标量 一个数字 0阶张量
# 向量 一维数组 [2, 3, 4] 1阶张量
# 矩阵 二维数组 [[2, 3, 4], 2阶张量
# [2, 3, 4]]
# ……
# 张量 n维数组 n阶张量
# 1 张量的类型
# 2 张量的阶
# 创建张量的时候,如果不指定类型
# 默认 tf.float32
# 整型 tf.int32
# 浮点型 tf.float32
1 张量的类型
2 张量的阶
import tensorflow as tf
#张量演示
tensor1 = tf.constant(4.0)
tensor2 = tf.constant([1, 2, 3, 4])
linear_squares = tf.constant([[4], [9], [16], [25]], dtype=tf.int32)
print("tensor1:\n", tensor1)
print("tensor2:\n", tensor2)
print("linear_squares_before:\n", linear_squares)
with tf.Session() as sess:
print("tensor1:\n", type(tensor1.eval()))#<class 'numpy.float32'>
print("tensor2:\n", tensor2.eval())
print("linear_squares_before:\n", linear_squares.eval())
创建张量的指令
1 . 固定值张量
tf.zeros(shape, dtype=tf.float32, name=None)
创建所有元素设置为零的张量。此操作返回一个dtype具有形状shape和所有元素设置为零的类型的张量。
tf.zeros_like(tensor, dtype=None, name=None)
给tensor定单张量(),此操作返回tensor与所有元素设置为零相同的类型和形状的张量。
tf.ones(shape, dtype=tf.float32, name=None)
创建一个所有元素设置为1的张量。此操作返回一个类型的张量,dtype形状shape和所有元素设置为1。
tf.ones_like(tensor, dtype=None, name=None) 给tensor定单张量(),此操作返回tensor与所有元素设置为1相同的类型和形状的张量。
tf.fill(dims, value, name=None)
创建一个填充了标量值的张量。此操作创建一个张量的形状dims并填充它value。
tf.constant(value, dtype=None, shape=None, name='Const')
创建一个常数张量。
2 . 随机值张量
一般我们经常使用的随机数函数Math.random() 产生的是服从均匀分布的随机数,能够模拟等概率出现的况,例如扔一个骰子,1到6点的概率应该相等,但现实生活中更多的随机现象是符合正态分布的,例如20岁成年人的体重分布等。
假如我们在制作一个游戏,要随机设定许许多多NPC的身高,如果还用Math.random(),生成从140到22之间的数字,就会发现每个身高段的人数是一样多的,这是比较无趣的,这样的世界也与我们习惯不同,玛实应该是特别高和特别矮的都很少,处于中间的人数最多,这就要求随机函数符合正态分布。
tf.truncated_normal[shape, mean=0.0, stddev=1.0, ctype=tf.float32, seed=None, name=None)
从截断的正态分布中输出随机值,和 tf.random_normal)一样,但是所有数字都不超过两个标准差
tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32,seed=None, name=None)
从正态分布中输出随机值,由随机正态分布的数字组成的矩阵