Tensorflow(一)

1.tf.Session()

Session 是 Tensorflow 为了控制,和输出文件的执行的语句. 运行 session.run() 可以获得你要得知的运算结果, 或者是你所要运算的部分.

2.tf.global_variables_initializer()初始化变量

import tensorflow as tf

# 必须要使用global_variables_initializer的场合
# 含有tf.Variable的环境下,因为tf中建立的变量是没有初始化的,也就是在debug时还不是一个tensor量,而是一个Variable变量类型

size_out = 10
tensor = tf.Variable(tf.random_normal(shape=[size_out]))
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)     # initialization variables
    print(sess.run(tensor))



# 可以不适用初始化的场合
# 不含有tf.Variable、tf.get_Variable的环境下
# 比如只有tf.random_normal或tf.constant等
size_out = 10
tensor = tf.random_normal(shape=[size_out])  # 这里debug是一个tensor量哦
init = tf.global_variables_initializer()
with tf.Session() as sess:
    # sess.run(init)  # initialization variables
    print(sess.run(tensor))


3.tf.train.Save()-tensorflow中模型的保存及读取

作用:训练网络之后保存训练好的模型,以及在程序中读取已保存好的模型

使用步骤:

  • 实例化一个Saver对象 saver = tf.train.Saver() 
  • 在训练过程中,定期调用saver.save方法,向文件夹中写入包含当前模型中所有可训练变量的checkpoint文件 saver.save(sess,FLAGG.train_dir,global_step=step) 
  • 之后可以使用saver.restore()方法,重载模型的参数,继续训练或者用于测试数据 saver.restore(sess,FLAGG.train_dir) 

在saver实例每次调用save方法时,都会创建三个数据文件和一个检查点(checkpoint)文件,权重等参数被以字典的形式保存到.ckpt.data中,图和元数据被保存到.ckpt.meta中,可以被tf.train.import_meta_graph加载到当前默认的图 

4.tf.placeholder函数

tf.placeholder()函数作为一种占位符用于定义过程,可以理解为形参,在执行的时候再赋具体的值。

tf.placeholder(
    dtype,
    shape=None,
    name=None
)

参数:

  1. dtype:数据类型。常用的是tf.float32,tf.float64等数值类型
  2. shape:数据形状。默认是None,就是一维值,也可以是多维(比如[2,3], [None, 3]表示列是3,行不定)
  3. name:名称 

返回:

Tensor类型

为什么要用placeholder?
       Tensorflow的设计理念称之为计算流图,在编写程序时,首先构筑整个系统的graph,代码并不会直接生效,这一点和python的其他数值计算库(如Numpy等)不同,graph为静态的,类似于docker中的镜像。然后,在实际的运行时,启动一个session,程序才会真正的运行。这样做的好处就是:避免反复地切换底层程序实际运行的上下文,tensorflow帮你优化整个系统的代码。我们知道,很多python程序的底层为C语言或者其他语言,执行一行脚本,就要切换一次,是有成本的,tensorflow通过计算流图的方式,帮你优化整个session需要执行的代码,还是很有优势的。

       所以placeholder()函数是在神经网络构建graph的时候在模型中的占位,此时并没有把要输入的数据传入模型,它只会分配必要的内存。等建立session,在会话中,运行模型的时候通过feed_dict()函数向占位符喂入数据。
 

import tensorflow as tf
import numpy as np
 
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
 
output = tf.multiply(input1, input2)
 
with tf.Session() as sess:
    print(sess.run(output, feed_dict = {input1:[3.], input2: [4.]}))

 
x = tf.placeholder(tf.float32, shape=(1024, 1024))
y = tf.matmul(x, x)
 
with tf.Session() as sess:
    #print(sess.run(y))  # ERROR:此处x还没有赋值
    rand_array = np.random.rand(1024, 1024)
    print(sess.run(y, feed_dict={x: rand_array})) 

5.tf.variable函数的使用

tf.Variable是一个Variable类。通过变量维持图graph的状态,以便在sess.run()中执行;可以用Variable类创建一个实例在图中增加变量;

使用tf.Variable定义变量常用的两种方式

常用的参数包括初始化值和名称name(是该变量的唯一索引):

1、用固定的值初始化变量

w = tf.Variable(<initial-value>,name=<optional-name>)

2、用tf的初始化器初始化变量

w = tf.Variable(tf.truncated_normal([3,4],mean=0,stddev=.5),name='weight')

用tf的初始化器initializer op初始化变量必须指定变量shape,用name指定名称

注意:这里只是定义了变量的初始化方式,并没有进行变量初始化。要在sess中执行初始化操作。

(3)执行变量初始化的三种方式

在使用变量之前必须要进行初始化,初始化的方式有三种:

1、在会话中运行initializer 操作

tf.global_variable_initializer().run()

2、从文件中恢复,如restore from checkpoint

saver = tf.train.Saver()
with tf.Session() as sess:
    ckpt = tf.train.get_checkpoint_state(checkpoint_path)
    if ckpt and ckpt.model_checkpoint_path:
        saver.restore(sess,ckpt.model_checkpoint_path)
    else:
        print('No checkpoint file found')

变量初始化方式1、2也就是在模型训练和测试中常用的两种方式,在模型训练时,需要随机给模型赋初值,使用tf.global_variable_initializer().run()去初始化变量,在模型测试(或者进行fine-tune)时,使用初始化方式2从保存的ckpt中初始化变量。

3、也可自己通过tf.assign()给变量附初值,

实际上用initializer初始化方法给变量赋初值就是调用tf.assign()将变量的值赋给变量,可以自己调用tf.assign()给变量赋初值;

a = tf.Variable(1.0)
a = tf.assign(a,5.0)
b = tf.Variable(2.0)
b = tf.assign(b,6.0)
c = a+b
with tf.Session() as sess:
#相当于调用tf.assign()给变量赋初值
    sess.run([a,b])
    print(c.eval())

6.tf.get_variable函数的使用

获取一个已经存在的变量或者创建一个新的变量

tf.get_variable(name,  shape, initializer): name就是变量的名称,shape是变量的维度,initializer是变量初始化的方式,初始化的方式有以下几种:

tf.constant_initializer:常量初始化函数

tf.random_normal_initializer:正态分布

tf.truncated_normal_initializer:截取的正态分布

tf.random_uniform_initializer:均匀分布

tf.zeros_initializer:全部是0

tf.ones_initializer:全是1

tf.uniform_unit_scaling_initializer:满足均匀分布,但不影响输出数量级的随机值

import tensorflow as tf;  
import numpy as np;  
import matplotlib.pyplot as plt;  
  
#mean:一个python标量或一个标量张量。要生成的随机值的均值。
#stddev:一个python标量或一个标量张量。要生成的随机值的标准偏差。
a1 = tf.get_variable(name='a1', shape=[2,3], initializer=tf.random_normal_initializer(mean=0, stddev=1))
a2 = tf.get_variable(name='a2', shape=[1], initializer=tf.constant_initializer(1))
a3 = tf.get_variable(name='a3', shape=[2,3], initializer=tf.ones_initializer())
 
with tf.Session() as sess:
	sess.run(tf.initialize_all_variables())
	print sess.run(a1)
	print sess.run(a2)
	print sess.run(a3)

输出:
[[ 0.42299312 -0.25459203 -0.88605702]
 [ 0.22410156  1.34326422 -0.39722782]]
[ 1.]
[[ 1.  1.  1.]
 [ 1.  1.  1.]]
注意:不同的变量之间不能有相同的名字,除非你定义了variable_scope,这样才可以有相同的名字

7.tf.nn.embedding_lookup函数的用法

tf.nn.embedding_lookup函数的用法主要是选取一个张量里面索引对应的元素。tf.nn.embedding_lookup(params, ids):params可以是张量也可以是数组等,id就是对应的索引,其他的参数不介绍。

例如:

ids只有一行:

#c = np.random.random([10, 1])  # 随机生成一个10*1的数组
#b = tf.nn.embedding_lookup(c, [1, 3])#查找数组中的序号为1和3的
p=tf.Variable(tf.random_normal([10,1]))#生成10*1的张量
b = tf.nn.embedding_lookup(p, [1, 3])#查找张量中的序号为1和3的
 
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(b))
    #print(c)
    print(sess.run(p))
    print(p)
    print(type(p))

#输出
[[0.15791859]
 [0.6468804 ]]
[[-0.2737084 ]
 [ 0.15791859]
 [-0.01315552]
 [ 0.6468804 ]
 [-1.4090979 ]
 [ 2.1583703 ]
 [ 1.4137447 ]
 [ 0.20688428]
 [-0.32815856]
 [-1.0601649 ]]
<tf.Variable 'Variable:0' shape=(10, 1) dtype=float32_ref>
<class 'tensorflow.python.ops.variables.Variable'>

分析:输出为张量的第一个和第三个元素。

如果ids是多行:

import tensorflow as tf
import numpy as np

a = [[0.1, 0.2, 0.3], [1.1, 1.2, 1.3], [2.1, 2.2, 2.3], [3.1, 3.2, 3.3], [4.1, 4.2, 4.3]]
a = np.asarray(a)
idx1 = tf.Variable([0, 2, 3, 1], tf.int32)
idx2 = tf.Variable([[0, 2, 3, 1], [4, 0, 2, 2]], tf.int32)
out1 = tf.nn.embedding_lookup(a, idx1)
out2 = tf.nn.embedding_lookup(a, idx2)
init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    print sess.run(out1)
    print out1
    print '=================='
    print sess.run(out2)
    print out2

#输出
[[ 0.1  0.2  0.3]
 [ 2.1  2.2  2.3]
 [ 3.1  3.2  3.3]
 [ 1.1  1.2  1.3]]
Tensor("embedding_lookup:0", shape=(4, 3), dtype=float64)
==================
[[[ 0.1  0.2  0.3]
  [ 2.1  2.2  2.3]
  [ 3.1  3.2  3.3]
  [ 1.1  1.2  1.3]]

 [[ 4.1  4.2  4.3]
  [ 0.1  0.2  0.3]
  [ 2.1  2.2  2.3]
  [ 2.1  2.2  2.3]]]
Tensor("embedding_lookup_1:0", shape=(2, 4, 3), dtype=float64)

8.tf.get_variable_scope()

1、tf.get_variable_scope()可以获得当前的变量域,还可以通过其.name和.reuse来查看其名称和当前是否为reuse模式。

2、变量域有name,变量也有name。默认变量作用域的name为空白字符串。

3、在变量域内命名的变量的name全称为:“变量域的name+变量定义时传入的name”(就像一个文件有名字作为标识符,但是在前面加上绝对路径就是它在整个文件系统中的全局标识符)。

with tf.variable_scope()可以打开一个变量域,有两个关键参数。name_or_scope参数可以是字符串或tf.VariableScope对象,reuse参数为布尔值,传入True表示设置该变量域为reuse模式。

还有一种方法可以将变量域设置为reuse模式,即使用VariableScope对象的reuse_variables()方法,例如tf.get_variable_scope().reuse_variables()可以将当前变量域设置为reuse模式。
参考:https://blog.csdn.net/xpy870663266/article/details/98950853

9.tensorflow tf.pad()

tf.pad的作用是填充

pad(
    tensor,
    paddings,
    mode='CONSTANT',
    name=None
)

tensor是要填充的张量
padings ,代表每一维填充多少行/列,它的维度一定要和tensor的维度是一样的,这里的维度不是传统上数学维度,如[[2,3,4],[4,5,6]]是一个3乘4的矩阵,但它依然是二维的,所以pad只能是[[1,2],[1,2]]这种。

mode 可以取三个值,分别是"CONSTANT" ,“REFLECT”,“SYMMETRIC”

mode=“CONSTANT” 填充0

mode="REFLECT"映射填充,上下(1维)填充顺序和paddings是相反的,左右(零维)顺序补齐

mode="SYMMETRIC"对称填充,上下(1维)填充顺序是和paddings相同的,左右(零维)对称补齐

t=[[2,3,4],[5,6,7]]
print(tf.pad(t,[[1,1],[2,2]],"CONSTANT")))

 输出

 [[0, 0, 0, 0, 0, 0, 0],
 [0, 0, 2, 3, 4, 0, 0],
 [0, 0, 5, 6, 7, 0, 0],
 [0, 0, 0, 0, 0, 0, 0]]

注:[1,1]是在pad里是第一个,代表第一维即矩阵的行,左边的1代表上方放一行0,右边的1代表下方放一行0
同理,2,2顺序是第二个,代表对列操作,左边的2代表在左边放两列0,右边2代表在右边放两列0
 

2.

 t=[[2,3,4],[5,6,7]]
    print(tf.pad(t,[[1,2],[2,3]],"CONSTANT")))
  [[0, 0, 0, 0, 0, 0, 0, 0],
  [0, 0, 2, 3, 4, 0, 0, 0],
  [0, 0, 5, 6, 7, 0, 0, 0],
  [0, 0, 0, 0, 0, 0, 0, 0],
  [0, 0, 0, 0, 0, 0, 0, 0]]

 3.

t=[[2,3,4],[5,6,7]]
print(tf.pad(t,[[1,1],[2,2]],"REFLECT")))
[[7, 6, 5, 6, 7, 6, 5],
[4, 3, 2, 3, 4, 3, 2],
[7, 6, 5, 6, 7, 6, 5],
[4, 3, 2, 3, 4, 3, 2]]

行上方复制和行下方和对应位置复制相反,列左边和列右边以原第一列和原第三列维中轴复制

4.

t=[[2,3,4],[5,6,7]]
print(tf.pad(t,[[1,1],[2,2]],"SYMMETRIC")))
  [[3, 2, 2, 3, 4, 4, 3],
   [3, 2, 2, 3, 4, 4, 3],
   [6, 5, 5, 6, 7, 7, 6],
   [6, 5, 5, 6, 7, 7, 6]]

行上下方直接复制对应的,列左右和对应的右左对称复制

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值