1、如何理解 tf.reduce_max或者 tf.reduce_mean中对Tensor和高维矩阵的坐标轴axis的选择的操作

tf.reduce_mean(
    input_tensor,
    axis=None,
    keepdims=None,
    name=None,
    reduction_indices=None,
    keep_dims=None
)
x = tf.constant([[1., 1.], [2., 2.]])
tf.reduce_mean(x)  # 1.5
tf.reduce_mean(x, 0)  # [1.5, 1.5]
tf.reduce_mean(x, 1)  # [1.,  2.]

  从上计算结果中也可以看到,如果axis为None,默认将所有的维度都降1,最后剩下个0维的数子。

  一个不是很简单,但是很好理解的方法是:你的输入矩阵的shape是(2,3,4),那么当axis=0时,就是在第一个dimension上进行求均值,最后得到的结果的shape就是去掉第一个dimension后的shape,也就是(3,4)。所以,我们例子中的x是shape为(2,2),axis=0时,剩下第二个维度--列,所以沿着第一个维度方向上--行对所有列求均值。

 

2、Tensorflow里的eval()是什么意思

  今天看到一个用法

with tf.Session() as sess:
    print(tf.nn.embedding_lookup(wordVectors,firstSentence).eval().shape)

  一般tensorflow不都是要在Session里run一下才能执行吗,这里怎么直接print出来了,还多了一个eval()。

  经查,eval() 其实就是tf.Tensor的Session.run() 的另外一种写法。但是要注意的是,eval()只能用于tf.Tensor类对象,也就是有输出的Operation。对于没有输出的Operation, 可以用.run()或者Session.run()。Session.run()没有这个限制。所以上述其实也可以等效地表示为

with tf.Session() as sess:
    print(sess.run(tf.nn.embedding_lookup(wordVectors,firstSentence)).shape)

 

 3、tf.InteractiveSession()与tf.Session()

  • tf.InteractiveSession():它能让你在运行图的时候,插入一些计算图,这些计算图是由某些操作(operations)构成的。这对于工作在交互式环境中的人们来说非常便利,比如使用IPython。
  • tf.Session():需要在启动session之前构建整个计算图,然后启动该计算图。
  意思就是在我们使用tf.InteractiveSession()来构建会话的时候,我们可以先构建一个session然后再定义操作(operation),如果我们使用tf.Session()来构建会话我们需要在会话构建之前定义好全部的操作(operation)然后再构建会话。
 

 4、tf.app.flags.FLAGS和 tf.app.run()

  <1> tf.app.flags.FLAGS

  tf.app.flags.FLAGS源码其实是调用的argparse库,而argparse也就是一个方便用户添加命令行的python库。

  • tf.app.flags.DEFINE_xxx():添加命令行的optional argument(可选参数)
  • tf.app.flags.FLAGS:可以从对应的命令行参数取出参数。

举个栗子:

新建 tf_app_flag.py 文件,并输入如下代码,代码的功能是创建几个命令行参数,然后把命令行参数输出显示

import tensorflow  as tf
FLAGS=tf.app.flags.FLAGS
tf.app.flags.DEFINE_float('flag_float', 0.01, 'input a float')
tf.app.flags.DEFINE_integer( 'flag_int', 400, 'input a int')
tf.app.flags.DEFINE_boolean( 'flag_bool', True, 'input a bool')
tf.app.flags.DEFINE_string('flag_string', 'yes', 'input a string')
 
print(FLAGS.flag_float)
print(FLAGS.flag_int)
print(FLAGS.flag_bool)
print(FLAGS.flag_string)

  1> 在命令行中查看帮助信息,在命令行输入 python3 tf_app_flag.py -h

➜  learn python3 tf_app_flag.py -h
usage: tf_app_flag.py [-h] [--flag_float FLAG_FLOAT] [--flag_int FLAG_INT]
                      [--flag_bool [FLAG_BOOL]] [--noflag_bool]
                      [--flag_string FLAG_STRING]

optional arguments:
  -h, --help            show this help message and exit
  --flag_float FLAG_FLOAT
                        input a float
  --flag_int FLAG_INT   input a int
  --flag_bool [FLAG_BOOL]
                        input a bool
  --noflag_bool
  --flag_string FLAG_STRING
                        input a string

注意红色字体信息,这个就是我们用DEFINE_XXX添加命令行参数时的第三个参数

  2> 直接运行

➜  learn python3 tf_app_flag.py   
0.01
400
True
yes

  3> 带参数运行

➜  learn python3 tf_app_flag.py --flag_float 0.24 --flag_int 3 --flag_bool False --flag_string 'lalala, I got it'
0.24
3
False
lalala, I got it

   <2> tf.app.run()

该函数一般都是出现在这种代码中:

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

从源码开始分析,源码如下:

tensorflow语法笔记

flags_passthrough=f._parse_flags(args=args)这里的parse_flags就是我们tf.app.flags源码中用来解析命令行参数的函数。所以这一行就是解析参数的功能;

下面两行代码也就是tf.app.run的核心意思:执行程序中main函数,并解析命令行参数!

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

5、RNN、LSTM训练代码输入输出,维度分析

 tensorflow语法笔记

  当前层各个参数含义:

     tensorflow语法笔记

  Tensorflow 中RNN单个时刻计算流程:

 tensorflow语法笔记

tensorflow语法笔记

Tensorflow 中 lstm 单个时刻计算流程:

tensorflow语法笔记

注:上面计算[H,X] * W后和B维度不同, 如何相加,解释如下;

  1. tensorflow代码中,用的这个 nn_ops.bias_add(gate_inputs, self._bias),这个函数的计算方法是,让每个 batch 的输出值,都加上这个 B;
  2. 所以维度不同可以相加:【batch_size,Hidden_size】,【Hidden_size】,见函数演示:nn_ops.bias_add

6、gensim word2vec的输入必须是list of list格式,即[ [ ] ]。  

7、Graph和Session 

  Graph 

  一个TensorFlow的运算,被表示为一个数据流的图。 一幅图中包含一些操作(Operation)对象,这些对象是计算节点。前面说过的Tensor对象,则是表示在不同的操作(operation)间的数据节点

  你一旦开始你的任务,就已经有一个默认的图已经创建好了。而且可以通过调用tf.get_default_graph()来访问到。 添加一个操作到默认的图里面,只要简单的调用一个定义了新操作的函数就行。比如下面的例子展示的:

import tensorflow as tf
import numpy as np

c=tf.constant(value=1)
#print(assert c.graph is tf.get_default_graph())
print(c.graph)
print(tf.get_default_graph())

另外一种典型的用法就是要使用到Graph.as_default() 的上下文管理器( context manager),它能够在这个上下文里面覆盖默认的图。如下例

import tensorflow as tf
c=tf.constant(value=1)
print('c: \n', c.graph)
print('default: \n', tf.get_default_graph())

g1 = tf.Graph()
print('g1: \n', g1)
with g1.as_default():
    c1 = tf.constant(4.0)
    print('c1: \n', c1.graph)
 
g2 = tf.Graph()
print('g2: \n', g2)
with g2.as_default():
    c2 = tf.constant(20.0)
    print('c2: \n', c2.graph)

e=tf.constant(value=15)
print('e: \n', e.graph)

结果:

c: 
 <tensorflow.python.framework.ops.Graph object at 0x7fe8d8667048>
default: 
 <tensorflow.python.framework.ops.Graph object at 0x7fe8d8667048>
g1: 
 <tensorflow.python.framework.ops.Graph object at 0x7fe875d5af60>
c1: 
 <tensorflow.python.framework.ops.Graph object at 0x7fe875d5af60>
g2: 
 <tensorflow.python.framework.ops.Graph object at 0x7fe875d5af28>
c2: 
 <tensorflow.python.framework.ops.Graph object at 0x7fe875d5af28>
e: 
 <tensorflow.python.framework.ops.Graph object at 0x7fe8d8667048>
View Code

相关文章: