美文网首页
tensorflow的逐步理解

tensorflow的逐步理解

作者: 青元子cyan | 来源:发表于2019-05-07 17:21 被阅读0次

学习TensorFlow和PyTorch有几个月了,这里总结一下自己学tensorflow时用到的东西

1,对tf.app.run()的理解:

按照args里面的超参数来运行main函数,有两种情况:

如果你的代码中的入口函数不叫main(),而是一个其他名字的函数,如test(),则你应该这样写入口tf.app.run(test)
如果你的代码中的入口函数叫main(),则你就可以把入口写成tf.app.run()

if __name__ == '__main__':
    tf.app.run()

2,tf.reset_default_graph函数

用于清除默认图形堆栈并重置全局默认图形.说白了,就是每轮要清楚无效的计算图。
注意:要放在 tf.Session() 前面

3,为什么要写 tf.Graph().as_default()

引自: 为什么要写 tf.Graph().as_default()

tf.Graph() 表示实例化了一个类,一个用于 tensorflow 计算和表示用的数据流图,通俗来讲就是:在代码中添加的操作(画中的结点)和数据(画中的线条)都是画在纸上的“画”,而图就是呈现这些画的纸,你可以利用很多线程生成很多张图,但是默认图就只有一张。

tf.Graph().as_default() 表示将这个类实例,也就是新生成的图作为整个 tensorflow 运行环境的默认图,如果只有一个主线程不写也没有关系,tensorflow 里面已经存好了一张默认图,可以使用tf.get_default_graph() 来调用(显示这张默认纸),当你有多个线程就可以创造多个tf.Graph(),就是你可以有一个画图本,有很多张图纸,这时候就会有一个默认图的概念了。

as_default()函数的作用在于,返回一个上下文管理器,使得当前图对象成为当前默认的图对象。
get_default_graph()函数是获取当前默认图对象的句柄(这里的句柄, 可以简单理解为某个事物的唯一标识,就像学生学号)。

4,会话Session的三个参数:

4.1 会话的由来:
Tensorflow的内核使用更加高效的C++作为后台,Tensorflow把前台(Python程序)与后台之间的链接叫“会话”。
4.2 参数

1,target(可选):指定链接的执行引擎。如果这个值不为空,多用于分布式环境中。
2,graph(可选):指定要在Session对象中参与计算的图。默认值:None。
当在同一个进程中永乐很多图时,需要为不用的图使用不同的Session,需要指点graph参数
3 config(可选):辅助配置Session对象所需参数,如限制CPU或GPU的使用数目、为数据流图设置优化参数以及设置日志选项等。

5,Session中的run方法:

run(fetches, feed_dict=None, options=None, run_metadata=None)
后两个参数暂时不用

fetches参数:
表示数据流图中能接收的任意数据流图元素,要么是各类Op,要么是各种Tensor对象。一般是Tensor
若输入为Op, run()返回None
若输入为Tensor对象,则run返回NumPy数组

feed_dict参数(可选):
功能:给数据流图提供运行时的数据。feed_dict 的数据结构就是Python中的字典,其元素就是"键值对"(Key-Value)。
“Key”就是各种Tensor对象的句柄
“Value”可以是字符串、列表、NumPy数组等

6,TensorFlow中的placeholder

占位符,placeholder(dtype, shape=None, name=None)
三个参数:不解释了

7,TensorFlow中的Variable对象

数据流图中的Tensor对象和Op对象都是不可变的(immutable),Variable就是一个常驻内存、不会被轻易回收的Tensor
实例:

import tensorflow as tf

my_state = tf.Variable(0, name="counter")       # 初始化一个Op变量my_state,初始化值为0(仅仅构思,还未执行)
one = tf.constant(1)                            # 常量Op,赋值为1
new_value = tf.add(my_state, one)               # my_state+1
update = tf.assign(my_state, new_value)         # assign函数,将new_value的值赋给my_state

init_Op = tf.global_variables_initializer()     # global_variables_initializer()会返回一个操作:初始化计算图中所有的TensorFlow中的Variable对象
                                                # 需注意,此时代码执行到这里也仅仅是构思,还未实现
with tf.Session() as session:
    session.run(init_Op)                        # 实施初始化操作,即将my_state初始化为0. 且Session会记录下Varibale的变化
    print(session.run(my_state))                # 输出0
    for _ in range(3):                          # _代表垃圾变量,即虽然有但是不需要的变量
        session.run(update)                     # 循环三次
        print(session.run(my_state))            # 依次输出1,2,3

8,TensorFlow中的名称作用域(name_scope)

name_scope的作用有点像C++中的“命名空间(namespace)”,或者Java中的“包(package)”
在不同空间中,可以起相同的变量名而不冲突。(如果神经网络很复杂,想变量名都得想很久,name_scope解决了这个问题)
以实例说明:

import tensorflow as tf

with tf.name_scope('hidden') as scope:                                               # hidden意为隐含层
    a = tf.constant(5, name='alpha')
    print(a.name)                                                                    # 输出:hidden/alpha:0
    weights = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0), name='weights')      #从(-1,1)的均匀分布中取数,然后返回一个shape为(1, 2)的随机矩阵,(1, 2)表示一行两列
    print(weights.name)
    bias = tf.Variable(tf.zeros([1]), name='biases')
    print(bias.name)

with tf.name_scope('conv1') as scope:                                                # conv1意为一维卷积层
    weights = tf.Variable([1.0, 2.0], name='weights')
    print(weights.name)
    bias = tf.Variable([0.3], name='biases')
    print(bias.name)

sess = tf.Session()
writer = tf.summary.FileWriter('./my_graph/2', sess.graph)                             # 功能:把数据流图写入运行当前程序的子文件夹“./my_graph/2”中
                                                                                       # 在命令行输入: tensorboard --logdir=./my_graph/2,可启动TensorBoard来查看相应的可视化
输出:
hidden/alpha:0
hidden/weights:0
hidden/biases:0
conv1/weights:0
conv1/biases:0

9,TensorFlow中的reduce(reduce_sum,reduce_mean,reduce_max和reduce_min)

留空

10,tf.contrib模块

此模块下面有着及其丰富的功能子模块,具体可参见TensorFlow 的常用模块介绍

layers,(类似 nn 里面的函数,一些经典 CNN 方法的重构)
keras
image
slim
tensorboard 等。

10.1 tf.contrib.layers.xavier_initializer的参数说明
xavier_initializer(
uniform=True,
seed=None,
dtype=tf.float32
)

该函数返回一个用于初始化权重的初始化程序 “Xavier” 。
这个初始化器是用来保持每一层的梯度大小都差不多相同。
参数:

  • uniform: 使用uniform或者normal分布来随机初始化。
  • seed: 可以认为是用来生成随机数的seed
  • dtype: 只支持浮点数。
    返回值:
  • 初始化权重矩阵

11,TensorFlow中CNN的两种padding方式“SAME”和“VALID”

参考TensorFlow中CNN的两种padding方式“SAME”和“VALID”

当CNN用于文本中时,一般卷积层设置卷积核的大小为n×k,其中k为输入向量的维度(即[n,k,input_channel_num,output_channel_num]),这时候我们就需要选择“VALID”填充方式,这时候窗口仅仅是沿着一个维度扫描而不是两个维度。可以理解为统计语言模型当中的N-gram。

对于VALID,输出的形状计算如下:


0.jpg

对于SAME,输出的形状计算如下:


1.jpg

其中,W 为输入的size,F 为filter的size,S 为步长,⌈ ⌉为向上取整符号。

例子如下,详细的注释以后再写。

import tensorflow as tf
import numpy as np
input_forward = tf.random_normal([50, 60, 310, 1])
filt = tf.random_normal([3, 310, 1, 300])
conv = tf.nn.conv2d(
                input_forward,
                # 具有[batch, in_height, in_width, in_channels]这样的shape,
                # 具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数]
                filt,
                strides=[1, 1, 1, 1],
                padding='VALID',
                name='conv')
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(conv)
    print(conv.shape)

输出:

Tensor("conv:0", shape=(50, 58, 1, 300), dtype=float32)
(50, 58, 1, 300)

输出里面的58和1的来历就是根据上面的公式计算的。注意,如果输入和卷积核都是矩形,那么输出的形状的长和宽分别用上面的公式计算即可。

相关文章

  • tensorflow的逐步理解

    学习TensorFlow和PyTorch有几个月了,这里总结一下自己学tensorflow时用到的东西 1,对tf...

  • TensorFlow的Basic Usage

    翻译自TensorFlow Basic Usage官方教程 为了使用TensorFlow,我们需要理解以下5点: ...

  • 2018-04-18 第四周

    参数设计好之后,需要理解tensorflow存储数据的方式:使用占位符(参考tensorflow的英文文档) # ...

  • Tensorflow实现手写识别

    前言 这是Tensorflow的手写数字识别,根据之前的理论更好的理解tensorflow 结构 1、定义图结构2...

  • 理解Tensorflow的shape

    Tensorflow中的shape应该怎么理解,怎么记住呢? 以上面这段代码为例为例。首先,单看[1,2,3],这...

  • 理解TensorFlow的Queue

    这篇文章来说说TensorFlow里与Queue有关的概念和用法。 其实概念只有三个: Queue是TF队列和缓存...

  • TensorFlow笔记1

    文章仅用于记录个人TensorFlow学习的问题和自己的理解。 今天的歌如约而至 TensorFlow,Googl...

  • 深入理解tensorflow的L2函数

    深入理解所有的tensorflow工具箱工具

  • 深度学习相关文章

    1.TensorFlow简介2.线性回归-理解TensorFlow中wb参数的含义3.TFIDF简介4.动态规划原...

  • TensorFLow的基本用法

    为了使用TensorFlow你需要理解一下几个方面:TensorFlow是如何 把运算表示为图 在 Session...

网友评论

      本文标题:tensorflow的逐步理解

      本文链接:https://www.haomeiwen.com/subject/qqweoqtx.html