TensorFlow学习心得与笔记

安装

​pip3 install tensorflow​


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

登录后复制

import osos.environ['TF_CPP_MIN_LOG_LEVEL']='2'1.2.

张量tensor

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

tensor的阶

tensorflow学习笔记一_权重

tensor的数据类型

tensorflow学习笔记一_tensorflow_02

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)])1.2.3.4.5.6.

生成张量

固定值张量

tensorflow学习笔记一_数据_03


随机张量

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


从正态分布中输出随机值,然后组成矩阵


提供给tensor的运行函数 ​
​javascript:void(0)​



数据流图

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

  • 节点(nodes) 表示计算单元,也可以是输入的起点或者输出的终点
  • 线(edges) 表示节点之间的输入/输出关系

    在 TensorFlow 中,每个节点都是用 tf.Tensor的实例来表示的,即每个节点的输入、输出都是Tensor,如下图中 Tensor 在 Graph 中的流动,形象的展示 TensorFlow 名字的由来
    tensorflow学习笔记一_tensorflow_04

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)1.2.3.4.

op

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

tensorflow学习笔记一_数据_05

会话

会话是用来运行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 + c1.2.3.4.5.6.




登录后复制
plt = tf.placeholder(tf.float32, [None, 2])with tf.Session() as sess:  print(sess.run(plt, feed_dict={plt:[[1,3], [2,4]]}))1.2.3.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 tfimport osos.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.FLAGSdef 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()1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.

tensorflow学习笔记一_数据_06

加了作用域之后

登录后复制

# !/usr/bin/env python# -*- coding:utf-8 -*-import tensorflow as tfimport ostf.app.flags.DEFINE_integer("max_step", 100, "模型训练的步数")tf.app.flags.DEFINE_string("model_dir", " ", "模型文件的加载的路径")# 定义获取命令行参数名字FLAGS = tf.app.flags.FLAGSdef 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 Noneif __name__ == "__main__":    myregression()1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.

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

tensorflow学习笔记一_权重_07





免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空