TensorFlow学习笔记(一)---graph,op,tensor,Session,Variables,Tensorboard

1.   机器学习                         深度学习

算法 分类:神经网络(简单)          神经网络(深度)
    回归                       图像:卷积神经网络
                               自然语言处理:循环神经网络
2.深度学习框架
    Internet,giant's,TensorFlow,software...
3.Tensorflow
        .Google Brain计划产物
        版本迭代快
    特点:
        1.真正的可移植性
        2.多语言支持
        3.高度的灵活性与效率
4.网站
    https://tensorflow.google.cn/install
5.TensorFlow安装:
    CPU:版本 pip install tensorflow
        参考博客:https://blog.csdn.net/qq_36853469/article/details/103586579
    GPU:参考其他
6.tensorflow图的结构
    tensor:张量,即数据
    operation(op):专门运算的操作节点,所有操作都是一个op
    graph:图:整个程序的结构
    Session():会话:运算程序

​
# -*- coding: UTF-8 -*-
'''
@Author :Jason
tensorflow版本为 1.14.0
版本2.0及以上
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

'''
# import tensorflow as tf
# print(tf.__version__)

# import tensorflow as tf
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2" #日志等级

# os.environ["TF_CPP_MIN_LOG_LEVEL"]='1' # 这是默认的显示等级,显示所有信息
# os.environ["TF_CPP_MIN_LOG_LEVEL"]='2' # 只显示 warning 和 Error
# os.environ["TF_CPP_MIN_LOG_LEVEL"]='3' # 只显示 Error

#实现一个加法运算运算
a = tf.constant(1.0)
b = tf.constant(1.0)
sum1 = tf.add(a,b)

print(sum1) #Tensor("Add:0", shape=(), dtype=float32)

with tf.Session() as sess:
    print(sess.run(sum1))#2.0

​

7.tensorflow日志级别
    import os
    os.environ["TF_CPP_MIN_LOG_LEVEL"]='1' # 这是默认的显示等级,显示所有信息
    os.environ["TF_CPP_MIN_LOG_LEVEL"]='2' # 只显示 warning 和 Error
    os.environ["TF_CPP_MIN_LOG_LEVEL"]='3' # 只显示 Error

8.   计算密集型         IO密集型
框架: tensorflow等     scrapy,web,
     cpu计算           http请求,读取,

 9.garph:图:定义计算
    图默认已经注册,一组表示tf.Operation计算单位的对象和tf.Tensor表示操作 之间流动的数据单元的对象;
    获取调用:
        1.tf.get_default_graph()
        2.op、sess或者tensorflow的graph属性

# -*- coding: utf-8 -*-
'''
@Author :Jason
图gragh:
    包含了 op 和 tensor
'''
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2" #日志等级

def graph1():
    #实现一个加法运算运算
    a = tf.constant(1.0)
    b = tf.constant(1.0)
    sum1 = tf.add(a,b)

    #默认的这张图,相当于给程序分配一段内存
    graph = tf.get_default_graph()
    print("graph图:",graph)#graph图: <tensorflow.python.framework.ops.Graph object at 0x000001A566840FD0>
    with tf.Session() as sess:
        print(sess.run(sum1))#2.0

        #上面程序的参数,运算都在该内存中(即这张图),所以值都一样
        print(a.graph) #<tensorflow.python.framework.ops.Graph object at 0x0000028881C4EFD0>
        print(sum1.graph) #<tensorflow.python.framework.ops.Graph object at 0x0000028881C4EFD0>
        print(sess.graph) #<tensorflow.python.framework.ops.Graph object at 0x0000028881C4EFD0>


def graph2():
    #创建一张图,上下文环境
    g = tf.Graph()
    print(g) #<tensorflow.python.framework.ops.Graph object at 0x00000271A8395128>
    with g.as_default():
        c = tf.constant(110)
        print(c.graph) #<tensorflow.python.framework.ops.Graph object at 0x00000271A8395128>

def session1():
    g = tf.Graph()
    with g.as_default():
        c = tf.constant(110)
        print(c.graph)

    a = tf.constant(1.0)
    b = tf.constant(1.0)
    sum1 = tf.add(a, b)

    # 默认的这张图,相当于给程序分配一段内存
    default = tf.get_default_graph()#获取默认的图

    #只能运行一个图,可以指定图,参数 graph=
    with tf.Session(graph=g,config=tf.ConfigProto(log_device_placement=True)) as sess:
        # print(sess.run(c))#...is not an element of this graph
        # 未指定g图报错原因,c不是默认图中的元素.默认的是default
        print(sess.run(c)) #110

if __name__ == "__main__":
    session1()

10.op:只要使用tensorflow的API定义的函数都是OP

 

11.tensor:张量,就指代的是数据

tensorflow依赖的是numpy
张量的阶和数据类型
    Tensorflow基本的数据格式
    一个类型化的N维数组(tf.Tensor)
    三部分:名字(op类型),形状(几阶,即几维),数据类型

                                       

形状:tensorflow:打印出来的形状表示
    0维:() 1维:(5) 2维:(3,6) 3维:(2,3,5)
张量的属性
    graph 张量所属的默认图
    op 张量的操作名
    name 张量的字符串描述
    shape 张量的形状
张量的动态形状与静态形状:在于有没有生成一个新的张量数据
    Tensorflow中,张量具有静态形状和动态形状
    静态形状:
        创建一个张量,初始状态的形状
            tf.Tensor.get_shape():获取静态形状
            tf.Tensor.set_shape():更新Tensor对象的静态形状,通常用于在不能直接推断的情况下。
    动态形状:
        一种描述原始张量在执行过程中的一种形状(动态变化)
        tf.reshape:创建一个具有不同动态形状的新张量。
        对比:numpy中的reshape转置是改变本身
    要点:
        1,转换静态形状的时候,1-D到1-D,2-D到2—D,不能跨阶数改变形状
        2,对于已经固定或者设置静态形状的张量/变量,不能再次设置静态形状
        3,tf.reshape()动态创建新张量时,元素个数不能不匹配

# -*- coding: utf-8 -*-
'''
@Author :Jason
张量:张量的属性
    静态形状 和 动态形状
'''
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

a = tf.constant(1.0)
b = tf.constant(2.0)
plt = tf.placeholder(tf.float32,[None,100])

#张量的属性
# with tf.Session() as sess:
#     print(a.graph)
#     print("=================")
#     print(a.shape)
#     print(plt.shape)
#     print("=================")
#     print(a.name)
#     print("=================")
#     print(a.op)
#     '''
#     <tensorflow.python.framework.ops.Graph object at 0x0000021B10D6FF60>
#     =================
#     ()
#     (?, 100)
#     =================
#     Const:0
#     =================
#     name: "Const"
#     op: "Const"
#     attr {
#       key: "dtype"
#       value {
#         type: DT_FLOAT
#       }
#     }
#     attr {
#       key: "value"
#       value {
#         tensor {
#           dtype: DT_FLOAT
#           tensor_shape {
#           }
#           float_val: 1.0
#         }
#       }
#     }
#
#     '''
#


plt = tf.placeholder(tf.float32,[None,100])
print(plt) #Tensor("Placeholder_1:0", shape=(?, 100), dtype=float32)

plt.set_shape([75,100]) #某个固定的维度是不能再变的
print(plt) #Tensor("Placeholder_1:0", shape=(75, 100), dtype=float32)

#对于静态形状来说,一旦张量形状固定了,不能再次设置静态形状
# plt.set_shape([100,100]) #ValueError: Dimension 0 in both shapes must be equal, but are 75 and 100. Shapes are [75,100] and [100,100].

#但是动态形状可以去创建一个新的张量,注意元素数量要相等,不能变
plt_reshape = tf.reshape(plt,[100,75])
print(plt_reshape) #Tensor("Reshape:0", shape=(100, 75), dtype=float32)
with tf.Session() as sess:
    pass

张量操作-生成张量

                              

除了上面的,还有

tf.truncated_normal(shape,mena=0.0,stddev=1.0,dtype=tf.float32,seed=None,name=None)

从截断的正态分布中输出随机值,所有的数字都不超过两个标准差

 tf.random_normal(shape,mean=0.0,stddev=1.0,dtype=tf.float,seed=None,name=None)

从正态分布中输出随机值,由随机正态分布的数字组成的矩阵。

张量变换

                                                  

12.Session:会话:执行计算。一次只能运行一张图,可以在会话当中指定图去运行,不指定默认
       with tf.Seeeion(graph="指定图") as sess:
       作用:
           1.运行图的结构
           2.分配资源计算
           3.掌握资源(变量的资源,队列,线程)
       调用:
           1.sess = tf.Session(), sess.run(),sess.close()
           2.上下文管理器:with tf.Session() as sess:
                               sess.run()#程序结束自动关闭会话
       参数:
           graph:指定graph
           config=tf.ConfigProto(log_device_placement=True):在某个设备(CPU等)运行
       交互式:tf.InteractiveSession()
              只要有上下文交互环境,之前的sum就可以由
              sess.run(sum1)改为sum.eval()

13.会话的run()方法:运行ops 和 计算张量
   run(fetches,feed_dict=None,graph=None)
       .嵌套列表,元组
           namedtuple,dict或者OrderedDict(重载的运算符也能运算)
       .feed_dict
           允许调用者覆盖图中指定张量的值,提供给placeholder使用
       .返回值异常
           RuntimeError:如果Session出于无效转态(例如已关闭)
           TypeError:如果fetcher或者feed_dict 键是不合适的类型
           ValueError:键无效 或 引用Tensor不存在

# -*- coding: UTF-8 -*-
'''
@Author :Jason
Session的run()方法
'''
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()


a = tf.constant(1.0)
b = tf.constant(2.0)

sum1 = tf.add(a,b)

c = 1
d = 2
sum2 = c + d

#训练模型
#实时的提供数据去训练
#placeholder 是一个占位符,feed_dict一个字典
plt = tf.placeholder(tf.float32,[3,2])#3行2列,若不知道行列,用None替换,例如 [None,2], 行可以任意
print(plt) #Tensor("Placeholder:0", shape=(3, 2), dtype=float32)
with tf.Session() as sess:
    # print(sess.run([a,b,sum1])) #1.0, 2.0, 3.0]

    # 不是op不能运行
    # print(sess.run(sum2)) #报错TypeError: Fetch argument 3 has invalid type <class 'int'>, must be a string or Tensor. (Can not convert a int into a Tensor or Operation.)


    # #有重载的机制,默认会将运算符重载成op类型
    # sum3 = a + c
    # print(sess.run(sum3)) #2.0

    print(sess.run(plt,feed_dict = {plt:[[1,2],[3,4],[5,6]]}))
    '''
    [[1. 2.]
     [3. 4.]
     [5. 6.]]
    '''

 15.变量
    变量也是一种op,是一种特殊的张量,能够进行存储持久化,它的值就是张量,默认被训练。
    变量的创建
        tf.Variable(initial_value=None,name=None,trainable=True)
        创建一个带值initial_value的新变量
        assign(value)-----为变量分配一个新值,返回新值
        eval(session=None)------计算并返回此变量的值
        name属性表示变量的名字
    变量的初始化
        tf.global_variables_initializer()
        添加一个初始化所有变量的op,在会话中开启。

# -*- coding: utf-8 -*-
'''
@Author :Jason
变量
    1、变量op持久化保存,普通张量op不行
    2.当定义一个变量op的时候,一定要在会话当中去运行初始化
'''
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
#变量
a = tf.constant([1,2,3,4,5])
var = tf.Variable(tf.random_normal([2,3],mean=0.0,stddev=1.0))
# print(a,var) #Tensor("Const:0", shape=(5,), dtype=int32) <tf.Variable 'Variable:0' shape=(2, 3) dtype=float32_ref>

#必须做显示初始化
init_op = tf.global_variables_initializer()

with tf.Session() as sess:
    #必须运行初始化op
    sess.run(init_op)
    print(sess.run([a,var]))
    #未显示初始化的话...uninitialized ...未定义
    #[array([1, 2, 3, 4, 5]), array([[-0.5577389, -1.0026547, -2.323526],
    #                                [-0.80823505, -0.20104903, 0.7990945]], dtype=float32)]

16.可视化学习Tensorboard:增加变量显示
    数据序列化-events文件
        Tensorboard通过读取TensorFlow的事件文件来运行
    tf.summary.FileWriter("/tmp/tensorflow/summary/test/",graph=)
        返回filerwriter,写入事件文件到指定目录(最好用绝对路径),以提供给tensorboard使用
    开启
        tensorboard --logdir="/tmp/tensorflow/summary/test/"
    一般浏览器打开为127.0.0.1:6006
    注:修改程序后,在保存一遍会有新的事件文件,打开默认最新

# -*- coding: utf-8 -*-
'''
@Author :Jason
变量
    1、变量op持久化保存,普通张量op不行
    2.当定义一个变量op的时候,一定要在会话当中去运行初始化
    3.name参数:在tensorboard使用的时候显示名字,可以让相同op名字进行区分
'''
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

#变量
a = tf.constant([1,2,3,4,5])

b = tf.constant(1.0)
c = tf.constant(2.0)
d = tf.constant(3.0)
sum = tf.add(b,c,name="bc")
sum1= tf.add(b,d,name="bd")
var = tf.Variable(tf.random_normal([2,3],mean=0.0,stddev=1.0))
# print(a,var) #Tensor("Const:0", shape=(5,), dtype=int32) <tf.Variable 'Variable:0' shape=(2, 3) dtype=float32_ref>

#必须做显示初始化
init_op = tf.global_variables_initializer()

with tf.Session() as sess:
    #必须运行初始化op
    sess.run(init_op)

    #把程序的图结构写入事件文件,graph把指定的图写进时间文件当中
    filewtiter = tf.summary.FileWriter("./tmp/summary/test/",graph=sess.graph)
    print(sess.run([sum,sum1,var]))
    #未显示初始化的话...uninitialized ...未定义
    #[array([1, 2, 3, 4, 5]), array([[-0.5577389, -1.0026547, -2.323526],
    #                                [-0.80823505, -0.20104903, 0.7990945]], dtype=float32)]

访问localhost:6006查看相应的图,op等可视化信息

发布了128 篇原创文章 · 获赞 95 · 访问量 35万+

猜你喜欢

转载自blog.csdn.net/qq_36853469/article/details/103625439