zoukankan      html  css  js  c++  java
  • tensorflow学习笔记一

    安装

    pip3 install tensorflow
    或者源码编译安装,源码编译安装的方式能充分利用CPU的计算性能,这是和pip安装的一点不同。pip安装运行的时候会有警告,解决办法如下

    import os
    os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
    

    张量tensor

    张量是tensorflow中的名词,代表的是数据。张量是在我们熟悉的标量、向量之上定义的,详细的定义比较复杂,我们可以先简单的将它理解为一个多维数组。说的更明白一点,张量就是tensorflow中的基本数据格式,是一个类型化的N维度数组(tf.Tensor),这种类型包含三部分:名字,形状,数据类型

    tensor的阶

    tensor的数据类型

    tensor对象的属性

    • graph:张量所属的默认图
    • op:张量的操作名
    • name:张量的字符串描述
    • shape:张量形状

    对其中的op和graph做一点说明:因为op是接收tensor返回tensor的操作,所以一个tensor就有对应的op。tensorflow的编程方式其实就是在画图,定义的tensor就在这张图里面,所以tensor有图属性

    张量的形状改变

    一个张量既然是可以看做是多维数组,那么数组就设计到形状的改变,在tensorflow中tensor具有两种形状,静态形状和动态形状

    静态形状

    创建一个张量或者由操作推导出一个张量时,初始状态的形状

    • tf.Tensor.get_shape:获取静态形状
    • tf.Tensor.set_shape():更新Tensor对象的静态形状,通常用于在不能直接推断的情况下

    动态形状

    一种描述原始张量在执行过程中的一种形状

    • tf.reshape:创建一个具有不同动态形状的新张量

    静态形状和动态形状的区别就是原tensor对象是否发生改变。通过上述API的调用者就能看出不同。

    转换要点

    1、转换静态形状的时候,1-D到1-D,2-D到2-D,不能跨阶数改变形状
    2、 对于已经固定或者设置静态形状的张量/变量,不能再次设置静态形状
    3、tf.reshape()动态创建新张量时,元素个数不能不匹配,但是能改变阶数

    In [2]: plt = tf.placeholder(tf.float32,[None,2])
    
    In [3]: plt.set_shape([100,2])
    
    In [4]: plt.get_shape()
    Out[4]: TensorShape([Dimension(100), Dimension(2)])
    

    生成张量

    固定值张量

    随机张量
    tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
    从正态分布中输出随机值,然后组成矩阵
    提供给tensor的运行函数 https://images2018.cnblogs.com/blog/1112571/201807/1112571-20180723144733413-1002665134.png

    数据流图

    数据流是一种常用的并行计算编程模型,数据流图是由节点(nodes)和线(edges)构成的有向图:

    • 节点(nodes) 表示计算单元,也可以是输入的起点或者输出的终点
    • 线(edges) 表示节点之间的输入/输出关系
      在 TensorFlow 中,每个节点都是用 tf.Tensor的实例来表示的,即每个节点的输入、输出都是Tensor,如下图中 Tensor 在 Graph 中的流动,形象的展示 TensorFlow 名字的由来

    tensorflow = tensor + flow

    变量

    变量也是一种OP,是一种特殊的张量,能够进行存储持久化,可以修改里面的值,它的值就是张量
    tf.Variable(initial_value=None,name=None) 创建一个带值initial_value的新变量,name属性表示变量名字
    tf.variable.assign(value) 为变量分配一个新值,返回新值
    tf.variable.eval(session=None) 计算并返回此变量的值

    定义变量需要注意的一点:添加一个初始化所有变量的op tf.global_variables_initializer() 在会话中开启

    在我们tensorflow中,图是核心,如同我们在建造浩大工程的时候需要先设计图纸一样。tensorflow的程序就可以看做是"一张图纸",而这张图纸可以看做是计算机中的一块内存。我们编写的tensorflow的程序中图默认已经注册,一组表示 tf.Operation计算单位的对象和tf.Tensor表示操作之间流动的数据单元的对象,当然我们也可以自己创建一块内存空间,也就是自己创建一张图
    获取调用:tf.get_default_graph();op、sess或者tensor 的graph属性

    g = tf.Graph()
    with g.as_default():
          # 在这块图(内存)中定义变量
          a = tf.constant(1.0)
    

    op

    所有的tensorflow的API都可以看做是op

    会话

    会话是用来运行TensorFlow操作图的类,使用默认注册的图(可以指定运行图),会话可能拥有很多资源,如 tf.Variable,tf.QueueBase和tf.ReaderBase,会话结束后需要进行资源释放
    在ipython中的交互式 tf.InteractiveSession()
    run(fetches, feed_dict=None,graph=None) 运行ops和计算tensor
    fetches:
    嵌套列表,元组,
    namedtuple,dict或OrderedDict(重载的运算符也能运行)

    feed_dict 允许调用者覆盖图中指定张量的值,提供给
    placeholder使用

    返回值异常
    RuntimeError:如果它Session处于无效状态(例如已关闭)。
    TypeError:如果fetches或feed_dict键是不合适的类型。
    ValueError:如果fetches或feed_dict键无效或引用 Tensor不存在。

    a = tf.constant(1)
    b = tf.constant(2)
    c = 3
    # 原本tensorflow中的加法借助api:add,现在用 + , + 被重载了
    s1 = tf.add(a,b)
    s2 = a + c
    
    plt = tf.placeholder(tf.float32, [None, 2])
    
    with tf.Session() as sess:
      print(sess.run(plt, feed_dict={plt:[[1,3], [2,4]]}))
    

    可视化学习Tensorboard

    • 数据序列化-events文件
      TensorBoard 通过读取 TensorFlow 的事件文件来运行
    • tf.summary.FileWriter('/tmp/tensorflow/summary/test/', graph=default_graph)
      返回filewriter,写入事件文件到指定目录(最好用绝对路径),以提供给tensorboard使用
    • 开启
      tensorboard --logdir=/tmp/tensorflow/summary/test/

    一般浏览器打开为127.0.0.1:6006

    注:修改程序后,再保存一遍会有新的事件文件,打开默认为最新

    增加变量显示

    目的:在Tensorboard中观察模型的参数、损失值等变量值的变化。本质就是把变量的值合并到event文件中

    分两步

    收集变量

    tf.summary.scalar(name=’’,tensor) 收集对于损失函数和准确率等<font color=;red'>单值变量,name为变量的名字,tensor为值
    tf.summary.histogram(name=‘’,tensor) 收集<font color=;red'>高维度的变量参数

    合并

    merged = tf.summary.merge_all()
    运行合并:summary = sess.run(merged),每次迭代都需运行
    添加:FileWriter.add_summary(summary,i),i表示第几次的值

    用tensorflow执行线性回归

    import tensorflow as tf
    import os
    
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
    
    tf.app.flags.DEFINE_integer("max_step", 100, "模型训练的步数")
    tf.app.flags.DEFINE_integer("model_dir", '', "模型存储目录")
    
    FLAGS = tf.app.flags.FLAGS
    
    def myregression():
        # 数据
        x = tf.random_normal([100, 1], mean=1.7, stddev=0.5, name='x_data')
        y_true = tf.matmul(x, [[0.7]]) + 0.5
    
        # 权重和偏置
        weight = tf.Variable(tf.random_normal([1, 1], mean=0, stddev=0.5), name='weight')
        bias = tf.Variable(1.0, name='bias')
    
        # 预测值
        y_predict = tf.matmul(x, weight) + bias
    
        # 均方误差,得到的是确定的值,不是一个tensor
        loss = tf.reduce_mean(tf.square(y_true - y_predict))
    
        tf.summary.scalar('losser', loss)
        tf.summary.histogram('weight', weight)
        merged = tf.summary.merge_all()
        # 0.1 是学习率,通过一次梯度下降得到新的weight bias
        train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
        init_op = tf.global_variables_initializer()
        # 模型储存
        saver = tf.train.Saver(max_to_keep=10)
    
        with tf.Session() as sess:
            sess.run(init_op)
            filewriter = tf.summary.FileWriter("./tmp/", graph=sess.graph)
    
            if os.path.exists('./tmp/ckpt/checkpoint'):
                saver.restore(sess, './tmp/ckpt/')
            # 根据学习率梯度下降500次,得到weight和bias
            for i in range(500):
                sess.run(train_op)
                # 这里用%f, 可以把一阶的数据转为单值显示
                print("第%d次优化的参数权重为:%f, 偏置为:%f" % (i, weight.eval(), bias.eval()))
                summary = sess.run(merged)
                filewriter.add_summary(summary, i)
            saver.save(sess, './tmp/ckpt/')
    
    
    if __name__ == '__main__':
        myregression()
    

    加了作用域之后

    
    # !/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    import tensorflow as tf
    import os
    
    tf.app.flags.DEFINE_integer("max_step", 100, "模型训练的步数")
    tf.app.flags.DEFINE_string("model_dir", " ", "模型文件的加载的路径")
    
    # 定义获取命令行参数名字
    FLAGS = tf.app.flags.FLAGS
    
    def myregression():
        """
        自实现一个线性回归预测
        :return: None
        """
        with tf.variable_scope("data"):
            # 1、准备数据,x 特征值 [100, 1]   y 目标值[100]
            x = tf.random_normal([100, 1], mean=1.75, stddev=0.5, name="x_data")
    
            # 矩阵相乘必须是二维的
            y_true = tf.matmul(x, [[0.7]]) + 0.8
    
        with tf.variable_scope("model"):
            # 2、建立线性回归模型 1个特征,1个权重, 一个偏置 y = x w + b
            # 随机给一个权重和偏置的值,让他去计算损失,然后再当前状态下优化
            # 用变量定义才能优化
            # trainable参数:指定这个变量能跟着梯度下降一起优化
            weight = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name="w")
            bias = tf.Variable(0.0, name="b")
    
            y_predict = tf.matmul(x, weight) + bias
    
        with tf.variable_scope("loss"):
            # 3、建立损失函数,均方误差
            loss = tf.reduce_mean(tf.square(y_true - y_predict))
    
        with tf.variable_scope("optimizer"):
            # 4、梯度下降优化损失 leaning_rate: 0 ~ 1, 2, 3,5, 7, 10
            train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
    
        # 1、收集tensor
        tf.summary.scalar("losses", loss)
        tf.summary.histogram("weights", weight)
    
        # 定义合并tensor的op
        merged = tf.summary.merge_all()
    
        # 定义一个初始化变量的op
        init_op = tf.global_variables_initializer()
    
        # 定义一个保存模型的实例
        saver = tf.train.Saver()
    
        # 通过会话运行程序
        with tf.Session() as sess:
            # 初始化变量
            sess.run(init_op)
    
            # 打印随机最先初始化的权重和偏置
            print("随机初始化的参数权重为:%f, 偏置为:%f" % (weight.eval(), bias.eval()))
    
            # 建立事件文件
            filewriter = tf.summary.FileWriter("./tmp/", graph=sess.graph)
    
            # 加载模型,覆盖模型当中随机定义的参数,从上次训练的参数结果开始
            if os.path.exists("./tmp/ckpt/checkpoint"):
                saver.restore(sess, FLAGS.model_dir)
    
            # 循环训练 运行优化
            for i in range(FLAGS.max_step):
    
                sess.run(train_op)
    
                # 运行合并的tensor
                summary = sess.run(merged)
    
                filewriter.add_summary(summary, i)
    
                print("第%d次优化的参数权重为:%f, 偏置为:%f" % (i, weight.eval(), bias.eval()))
    
            saver.save(sess, FLAGS.model_dir)
        return None
    
    
    if __name__ == "__main__":
        myregression()
    

    运行:python3 luhn.py --max_step=500 --model_dir='tmp/ckpt/'

  • 相关阅读:
    每日一题 为了工作 2020 0412 第四十一题
    每日一题 为了工作 2020 04011 第四十题
    每日一题 为了工作 2020 0410 第三十九题
    每日一题 为了工作 2020 0409 第三十八题
    每日一题 为了工作 2020 0408 第三十七题
    每日一题 为了工作 2020 0407 第三十六题
    每日一题 为了工作 2020 0406 第三十五题
    每日一题 为了工作 2020 0405 第三十四题
    学习总结(二十四)
    学习总结(二十三)
  • 原文地址:https://www.cnblogs.com/longyunfeigu/p/9354593.html
Copyright © 2011-2022 走看看