tensorflow第一天

文章目录


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中的基本数据对象
节点:提供图当中执行的操作

数据流图:
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

tensorflow第一天

图与会话

什么是图结构
图包含了一组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
tensorflow第一天
接下来我们要区分一下操作函数和操作对象

tensorflow第一天

#     操作函数:
#     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 张量的类型

tensorflow第一天
2 张量的阶
tensorflow第一天

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())

tensorflow第一天
tensorflow第一天
创建张量的指令
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) 从正态分布中输出随机值,由随机正态分布的数字组成的矩阵

上一篇:关于强化学习策略梯度的一个简单例子


下一篇:2021-09-13