zoukankan      html  css  js  c++  java
  • tensorflow基础重新巩固

    tensorflow框架整体结构

    用张量tensor表示数据;计算图graph表示任务;在会话session中执行context; 
    通过变量维护状态;通过feed和fetch可以任意的操作(arbitrary operation)、赋值、获取数据

    TensorFlow的基本使用(基本结构、变量管理、模型持久化)

    一.TensorFlow的基本结构

    #1.创建计算节点
    a = tf.constant([1.2, 1.2], name='a')
    b = tf.constant([1.0, 1.0], name='b')
    result = tf.add(a,b,name='add');
    #输出运算节点信息
    print(result)
    #2.创建会话
    sess = tf.Session()
    #3.运行计算图
    print( sess.run(result) )
    #计算张量的值
    print( result.eval(session = sess) )
    #4.关闭会话,释放资源
    sess.close()

    #1.创建计算节点
    a = tf.constant([1.2, 1.2], name='a')
    b = tf.constant([1.0, 1.0], name='b')
    result = tf.add(a,b,name='add');
    #输出运算节点信息
    print(result)
    #2.创建会话,通过python的上下文管理这个会话,上下文退出时会话关闭和资源释放自动完成
    sess = tf.Session()
    with sess.as_default():
    #3.运行计算图
    print( sess.run(result) )
    #计算张量的值
    print( result.eval() )
    基于TensorFlow线性回归算法的使用,训练集为鸢尾花的两个特征!!!

    #基于TensorFlow线性回归算法的使用,训练集为鸢尾花的两个特征
    import tensorflow as tf
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import datasets

    #获得数据集
    iris = datasets.load_iris().data
    print(type(iris))
    train = np.array([arr[3]for arr in iris])#花瓣宽度特征
    label = np.array([arr[0]for arr in iris])#花瓣长度特征

    #1.创建计算节点
    #定义占位变量
    x_data = tf.placeholder(shape = [None,1], dtype = tf.float32)
    y_data = tf.placeholder(shape = [None,1], dtype = tf.float32)

    w = tf.Variable(tf.random_normal([1,1]))
    b = tf.Variable(tf.random_normal([1,1]))

    #决策函数
    y = tf.add(tf.matmul(x_data, w), b)

    #均方差损失函数
    loss = tf.reduce_mean(tf.square(y_data - y))

    #优化算法
    train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

    #2.创建会话
    sess = tf.Session()

    #3.运行计算图
    init = tf.global_variables_initializer()
    sess.run(init)

    steps = 500
    batch = 5

    for i in range(steps):
    #获得batch的训练集和标签集
    rand_index = np.random.choice(len(train), size = batch)
    rand_x = np.transpose([train[rand_index]])
    rand_y = np.transpose([label[rand_index]])
    #训练模型参数
    sess.run(train_step, feed_dict = {x_data:rand_x,y_data:rand_y})
    if i%30==0:
    print(sess.run(loss, feed_dict = {x_data:rand_x,y_data:rand_y}))

    #获得模型参数
    [weight] = sess.run(w)
    [bias] = sess.run(b)

    #获得拟合结果
    result = []
    for i in train:
    result.append(i*weight+bias)

    #绘制拟合结果
    plt.plot(train, label, 'o', label = 'points')
    plt.plot(train, result, 'r-', label = 'result', linewidth=1)
    plt.xlabel('x')
    plt.ylabel('y')
    plt.show()

    #4.结束会话
    sess.close()
    二.TensorFlow的变量管理

    #创建变量,两种方式等价
    v1 = tf.get_variable("v1", shape=[1], initializer=tf.constant_initializer(1.0))
    # v1 = tf.Variable( tf.constant(1.0, shape=[1]), name='v1' )
    print( "变量名称:", v1.name )

    #生成上下文管理器,同时创建命名空间,在命名空间内创建变量
    with tf.variable_scope("space", reuse=False):
    v2 = tf.get_variable("v2", shape=[1], initializer=tf.constant_initializer(1.0))
    #在命名空间创建的变量,在变量名称前会加入命名空间的名称
    print( "变量名称:", v2.name )# :0便是这个变量时生成变量这个运算的第一个结果

    #嵌套命名空间,内层如果不指定reuse参数时,将会与外层reuse参数相同
    with tf.variable_scope("space_"):
    #获得reuse参数
    print( tf.get_variable_scope().reuse )
    v4 = tf.get_variable("v2", shape=[1])
    print( v4.name )

    #生成上下文管理器,在命名空间内获取已经创建过的变量
    with tf.variable_scope("space", reuse=True):
    v3 = tf.get_variable("v2", shape=[1])

    #创建一个名称为空的命名空间
    with tf.variable_scope("", reuse=True):
    #通过带命名空间名称的变量名获取其命名空间下的变量
    v5 = tf.get_variable( "space/v2", shape=[1] )

    #初始化变量
    init = tf.initialize_all_variables()

    #创建会话
    with tf.Session() as sess:
    sess.run( init )
    print( sess.run( v1 ) )
    print( sess.run( v2 ) )
    print( sess.run( v3 ) )
    print( sess.run( v4 ) )
    print( sess.run( v5 ) )
    三.TensorFlow模型持久化
    import tensorflow as tf

    #问题:保存TensorFlow模型
    #创建变量
    v1 = tf.Variable( tf.constant(1.0, shape=[1]), name='v1' )
    v2 = tf.Variable( tf.constant(2.0, shape=[1]), name='v2' )
    result = v1 + v2

    #初始化变量
    init = tf.initialize_all_variables()
    #声明tf.train.Saver类用于保存模型
    saver = tf.train.Saver()

    #创建会话
    with tf.Session() as sess:
    sess.run(init)
    print( sess.run(result) )
    #保存模型 model.ckpt.meta保存计算图的结构 model.ckpt保存每一个变量的取值
    #checkpoint保存一个目录下所有的模型文件列表
    saver.save( sess, "D:/Code_py/Neural/TensorFlow/model/model.ckpt" )

    #问题:加载已经保存的TensorFlow模型
    #声明变量
    v1 = tf.Variable( tf.constant(1.0, shape=[1]), name='v1' )
    v2 = tf.Variable( tf.constant(2.0, shape=[1]), name='v2' )
    result = v1 + v2

    #声明保存类
    saver = tf.train.Saver()

    #创建会话
    声明变量
    with tf.Session() as sess:
    #不需要运行变量的初始化过程,直接加载已经保存的变量
    saver.restore( sess, "D:/Code_py/Neural/TensorFlow/model/model.ckpt" )
    print( sess.run(result) )

    #问题:加载模型的同时变量重命名
    #声明变量
    v1 = tf.Variable( tf.constant(2.0, shape=[1]), name='other-v1' )
    v2 = tf.Variable( tf.constant(2.0, shape=[1]), name='other-v2' )

    #将原来名称为v1的变量加载到名称为'other-v1'变量v1中
    #将原来名称为v2的变量加载到名称为'other-v2'变量v2中
    saver = tf.train.Saver( {"v1":v1, "v2":v2} )

    #创建会话
    with tf.Session() as sess:
    #不需要运行变量的初始化过程,直接加载已经保存的变量
    saver.restore( sess, "D:/Code_py/Neural/TensorFlow/model/model.ckpt" )
    print( sess.run(v1) )
    所用知识:

    1.TensorFlow分为两个阶段:

    1)定义计算图中的计算;

    2)执行计算;

    2.TensorFlow中所有的数据都通过张量的形式来表示,零阶张量是标量,一阶张量是向量,n阶张量是n维数组。张量中并没有真正保存数字,保存的是如何得到这些数字的计算过程。一个张量保存了三个属性:name,shape,type。

    总而言之,计算图上的每一个节点代表一个运算,计算的结果保存在张量之中。

    3.TensorFlow目前支持的所有随机数生成器:

    tf.random_normal() 正态分布

    tf.truncated_normal() 正态分布,随机出来的值偏离平均值超过两个标准差,此数重新随机

    tf.random_uniform() 均匀分布

    tf.random_gamma() Gamma分布

    4.TensorFlow常用的优化算法:

    tf.train.GradientDescentOptimizer()

    tf.train.AdamOptimizer()

    tf.train.MomentumOptimizer()

    5.tf提供了通过变量名称来创建或者获取一个变量的机制。通过这个机制,在不同的函数中可以直接通过变量的名字来使用变量,而不需要将变量通过形参的形式传递到函数内。此机制通过tf.get_variable() tf.variable_scope()函数实现。

    tf.get_variable()用来创建或者获取变量。当其用于创建变量时,和tf.Variable()功能一样;当其用于获取已经创建的变量时,需要通过tf.variable_scope()函数来生成一个上下文管理器,在此管理器中,tf.get_variable()将直接获取已经创建的变量。

    参考资料:

    1.《TensorFlow实战Google深度学习框架》

    2.TensorFlow实现线性回归 https://blog.csdn.net/lilongsy/article/details/79360458

    3.Saver的用法 https://blog.csdn.net/u011500062/article/details/51728830
    ---------------------
    转载自:
    原文:https://blog.csdn.net/attitude_yu/article/details/80006243

  • 相关阅读:
    jquery 查找 新建元素
    sphinx中,直接取主键ID
    把一个文件夹下的多个csv文件合并到一个excel的多个sheet
    学习XOR
    数据结构C++,线性表的实现(数组方式)
    确定主机字节序
    TCP打开文件传输(客户端code)
    使用两个管道的客户服务器模型
    数据结构C++,栈的实现
    TCP打开文件传输(服务器端并发code)
  • 原文地址:https://www.cnblogs.com/ywheunji/p/11166367.html
Copyright © 2011-2022 走看看