Tensorflow学习笔记(2):变量,常用类和一些操作

变量是用来存储和更新参数的,也就是网络中的W或b。变量会被放在内存中。当模型训练结束后,他们需要被存在硬盘上,以便将来使用或分析模型。

一.变量

创建和初始化

  当创建一个变量的时候,需要将一个Tensor作为初始值传入构造函数Variable()。这个初始值可以是随机值也可以是常量。Tensor的初始值需要指定shape,这个shape通常都是固定的,但是也可以通过一些高级方法重新调整。

  只是创建了变量还是不够的,需要在定义一个初始化的操作,并且在使用任何变量之前,运行初始化的操作。例:

  1 import tensorflow as tf
  2
  3 #Create two variables
  4 weights = tf.Variable(tf.random_normal([20,10], stddev=0.35), name="weights")
  5 biases = tf.Variable(tf.zeros([10]), name="biases")
  6
  7 #Add other net structure...
  8 #...
  9
 10 #Add an op to initialize the variables.
 11 init = tf.initialize_all_variables()
 12
 13 #Later, when launching the model
 14 with tf.Session() as sess:
 15     sess.run(init)
 16     print weights.eval()
 17     print biases.eval()

输出:weights是[20,10]的矩阵,biases是[10]的向量。

注意:

  tf.initialize_all_variables()是并行的初始化所有变量,所以如果需要用一个变量的值给另一个变量初始化的时候,一定要小心。虽然直接初始化不一定会出现问题,但是如果出现问题是很难找到这个原因的。

  这时应该用如下方式进行初始化:

 

# Create a variable with a random value.
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
                      name="weights")
# Create another variable with the same value as ‘weights‘.
w2 = tf.Variable(weights.initialized_value(), name="w2")
# Create another variable with twice the value of ‘weights‘
w_twice = tf.Variable(weights.initialized_value() * 0.2, name="w_twice")

另外还有自定义初始化,因为目前还没用到,先挖个坑,以后再填,详见Variables Documentation

变量可以被初始化成常量,或者是随机数,这个跟初始化的策略有关,具体什么情况下使用什么方法进行初始化也挖个坑,以后学到了再讲。

初始化成常量的方法:

tf.zeros(shape, dtype=tf.float32, name=None)  

  全部初始化为0

tf.zeros_like(tensor, dtype=None, name=None, optimize=True)

  创建一个shape和指定tensor相同的变量,但全部元素都为零。例如‘tensor’ =[[1,2,3], [4,5,6]],那么tf.zeros_like(tensor) ==>[[0,0,0],[0,0,0]]

tf.ones(shape, dtype=tf.float32, name=None)

  全部初始化为1

tf.ones_like()同上

tf.fill(dims, value, name=None)

  对指定好的shape初始化为value值。tf.fill([2,3], 9) ==> [[9,9,9] [9,9,9,]] 

tf.constant(value, dtype=None, shape=None, name=‘Const‘, verify_shape=False)

  For example:

  ```python # Constant 1-D Tensor populated with value list. tensor = tf.constant([1, 2, 3, 4, 5, 6, 7]) => [1 2 3 4 5 6 7]

  # Constant 2-D tensor populated with scalar value -1. tensor = tf.constant(-1.0, shape=[2, 3]) => [[-1. -1. -1.] [-1. -1. -1.]] ```

初始化成序列

tf.linspace()

tf.range()

初始化为随机数

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

  按照正太分布初始化

tf.truncated_normal()

  同上,但超过两个标准差的数据被丢弃,并重新随机选择数据。即产生的数据都在正太分布的两个标准差内。

  

保存和加载

  得到了训练好的模型之后,我们需要将这个模型保存下来,之后可以再次读取这个模型进行进一步的使用。最简单的方法是使用托tf.train.Saver。下面是例子:

首先是保存变量:

import tensorflow as tf

#Create some variables.
v1 = tf.Variable([1,2,3,4,5], name="v1")
v2 = tf.Variable([11,12,13,14], name="v2")

#Add an op to initialize the variables
init = tf.initialize_all_variables()

#Add an op to save and restore all the variables
saver = tf.train.Saver()

with tf.Session() as sess:
    sess.run(init)
    #Do something with the model

    print v1.eval()
    print v2.eval()
    #save the variables to disk
    save_path = saver.save(sess,"model/model.ckpt")
    print "Model saved in file:", save_path

接下来是加载:

import tensorflow as tf

v3 = tf.Variable([0,0,0,0,0], name=‘v1‘)
v4 = tf.Variable([0,0,0,0], name=‘v2‘)

saver = tf.train.Saver()

with tf.Session() as sess:
    saver.restore(sess,"model/model.ckpt")
    print "Model restored."
    print v3.eval()
    print v4.eval()

在从文件中恢复变量时,不需要事先进行初始化。注意:在回复变量时,tf.Variable()里的name参数一定要与原来的变量名称一致,这样才能恢复到对应的变量。

变量的函数

__init__(initial_value=None, trainable=True, collections=None, validate_shape=True, caching_device=None, name=None, variable_def=None, dtype=None, expected_shape=None, import_scope=None)

Creates a new variable with value initial_value.

The new variable is added to the graph collections listed in collections, which defaults to [GraphKeys.GLOBAL_VARIABLES].

If trainable is True the variable is also added to the graph collectionGraphKeys.TRAINABLE_VARIABLES.

This constructor creates both a variable Op and an assign Op to set the variable to its initial value.

Args:

  • initial_value: A Tensor, or Python object convertible to a Tensor, which is the initial value for the Variable. The initial value must have a shape specified unless validate_shape is set to False. Can also be a callable with no argument that returns the initial value when called. In that case, dtype must be specified. (Note that initializer functions from init_ops.py must first be bound to a shape before being used here.)
  • trainable: If True, the default, also adds the variable to the graph collection GraphKeys.TRAINABLE_VARIABLES. This collection is used as the default list of variables to use by the Optimizer classes.应该是会在做最优化的时候使用得到
  • collections: List of graph collections keys. The new variable is added to these collections. Defaults to [GraphKeys.GLOBAL_VARIABLES].
  • validate_shape: If False, allows the variable to be initialized with a value of unknown shape. If True, the default, the shape ofinitial_value must be known.
  • caching_device: Optional device string describing where the Variable should be cached for reading. Defaults to the Variable‘s device. If not None, caches on another device. Typical use is to cache on the device where the Ops using the Variable reside, to deduplicate copying through Switch and other conditional statements.
  • name: Optional name for the variable. Defaults to ‘Variable‘ and gets uniquified automatically.
  • variable_defVariableDef protocol buffer. If not None, recreates the Variable object with its contents. variable_def and the other arguments are mutually exclusive.
  • dtype: If set, initial_value will be converted to the given type. If None, either the datatype will be kept (if initial_value is a Tensor), or convert_to_tensor will decide.
  • expected_shape: A TensorShape. If set, initial_value is expected to have this shape.
  • import_scope: Optional string. Name scope to add to the Variable.Only used when initializing from protocol buffer.

Raises:

  • ValueError: If both variable_def and initial_value are specified.
  • ValueError: If the initial value is not specified, or does not have a shape and validate_shape is True.

eval(session=None)

In a session, computes and returns the value of this variable.

This is not a graph construction method, it does not add ops to the graph.

This convenience method requires a session where the graph containing this variable has been launched. If no session is passed, the default session is used. See tf.Session for more information on launching a graph and on sessions.

v = tf.Variable([1, 2])init = tf.global_variables_initializer()

with tf.Session() as sess:    sess.run(init)    # Usage passing the session explicitly.    print(v.eval(sess))    # Usage with the default session.  The ‘with‘ block    # above makes ‘sess‘ the default session.    print(v.eval())

Args:

  • session: The session to use to evaluate this variable. If none, the default session is used.

Returns:

A numpy ndarray with a copy of the value of this variable.

二.常见类

Tensor

  Tensor类是最核心的数据结构。Tensor是一个处理操作输出的符号,它并不保存操作输出的值,但是提供了在Session中计算这些值的方法。

This class has two primary purposes:

  1. Tensor can be passed as an input to another Operation. This builds a dataflow connection between operations, which enables TensorFlow to execute an entire Graph that represents a large, multi-step computation.
  2. After the graph has been launched in a session, the value of the Tensor can be computed by passing it toSession.run()t.eval() is a shortcut for calling tf.get_default_session().run(t).

Operation

Operation是tensorflow中的节点,使用Tensor作为输入,并输出一个Tensor。其实就是运算操作,例如tf.matmul(a,b),就是a×b。当图在session中启动之后,operation拒可以通过tf.Session.run()这种操作执行,或者op.run()。

时间: 2024-10-08 20:50:47

Tensorflow学习笔记(2):变量,常用类和一些操作的相关文章

ruby 学习笔记 2 -变量

变量 在ruby的世界里,变量有5种,全局变量 局部变量 实例变量 常量 类变量以及伪变量 常用的: 全局: 在全局使用,使用$开头,因为是全局的,所以在任何的代码例子中都可以改变其值,造成混乱,所以不建议使用. 局部: 在一定范围内有作用.如 i = 10 ,其中i 就是一个局部变量 常量: 例如圆周率Pi,但是Pi 我们可以赋予他其他值,是可以变化的. 常量的首个字母必须大写,当试图改变常量值时,解释器会给出警告“ex4.rb:19: warning: already initialized

Tensorflow学习笔记2:About Session, Graph, Operation and Tensor

简介 上一篇笔记:Tensorflow学习笔记1:Get Started 我们谈到Tensorflow是基于图(Graph)的计算系统.而图的节点则是由操作(Operation)来构成的,而图的各个节点之间则是由张量(Tensor)作为边来连接在一起的.所以Tensorflow的计算过程就是一个Tensor流图.Tensorflow的图则是必须在一个Session中来计算.这篇笔记来大致介绍一下Session.Graph.Operation和Tensor. Session Session提供了O

javascript学习笔记---ECMAScriptECMAScript 对象----定义类或对象

使用预定义对象只是面向对象语言的能力的一部分,它真正强大之处在于能够创建自己专用的类和对象. ECMAScript 拥有很多创建对象或类的方法. 原始的方式 因为对象的属性可以在对象创建后动态定义(后绑定),类似下面的代码: var oCar = new Object; oCar.color = "blue"; oCar.doors = 4; oCar.mpg = 25; oCar.showColor = function() { alert(this.color); };不过这里有一

学习笔记-- 2014-07-07 Linux常用命令

2014-07-07 Linux常用命令 在Linuxtoy.org上看一些文章收集一些常用命令==================一.ps.kill 使用备查二.Ubuntu 提示三则三.最小化安装 Ubuntu四.Linux Mint设置时间 一到三来看linuxtoy.org网站 ===================一.ps.kill 使用备查 ps-查看当前正在运行的进程,示例:$ ps     kill {PID}-通过 PID 来停止任意进程,示例:$ kill 1012    

Go语言学习笔记(二) [变量、类型、关键字]

日期:2014年7月19日 1.Go 在语法上有着类 C 的感觉.如果你希望将两个(或更多)语句放在一行书写,它们 必须用分号分隔.一般情况下,你不需要分号. 2.Go 同其他语言不同的地方在于变量的类型在变量名的后面.例如:不是,int a,而是 a int.当定义了一个变量,它默认赋值为其类型的 null 值.这意味着,在 var a int后,a 的 值为 0.而 var s string,意味着 s 被赋值为零长度字符串,也就是 "". 3.Go语言的变量声明和赋值 在Go中使

C++学习笔记之作用域为类的常量和作用域内的枚举

一.作用域为类的常量 有些情况下,使符号常量的作用域为类很有用.如,类声明(不是定义)可能使用字面值30来指定数组长度,由于该常量对于所有对象来说都是相同的,因此创建一个由所有对象共享的常量是个不错的主意,也许我们想像下面这样做: 1 class Weather 2 { 3 private: 4 const int Months = 12; //声明一个常量 5 double temperature[Months]; 6 ... 7 } 要注意的是,我们这是在声明阶段,需要在声明类的时候就有一个

c++学习笔记:变量

c++学习笔记:变量(2) 先说明一下上一篇博文中的一个问题:char.signed char.unsigned char 这三者到底是怎么回事. signed char与unsigned char 是明确的拥有含义的,也就是说当定义了一个signed char那么这个char一定是有符号的整数类型.而当定义了一个unsigned char时这个char是明确无符号的整数类型.但是char却不一定了,它的行为依靠具体的实现.(“普通char究竟是有符号还是无符号,此事由实现确定.这也可能导致出现

PHP学习笔记——1.变量

目录: PHP学习笔记——1.变量 PHP学习笔记——1.常量 1.变量的组成 包括:变量名.变量值.存储地址 例:$a = 23; 执行后,在变量表中添加了$a这个变量名,在内存中开辟出一块空间,空间值为23,而$a指向23所在空间位置 例:echo $a; 执行后,先从变量表中找到$a,再根据其地址找到相应内存空间地址,读出23的值 2.变量的声明 $变量名 = 变量值; 3.变量名命名规范 字母.下划线.数字的组合 数字不能作为开头 区分大小写 4.变量的类型 ①五种标量: 整型:0 2

JavaScript学习笔记——js变量的布尔值

typeof(1): numbertypeof(NaN): numbertypeof(Number.MIN_VALUE): numbertypeof(Infinity): numbertypeof("123"): stringtypeof(true): booleantypeof(window): objecttypeof(Array()): objecttypeof(function(){}): functiontypeof(document): objecttypeof(null)

Java学习笔记_23_List接口实现类

23.List接口实现类: List接口继承了Collection接口,它是一个允许存在重复项的有序集合. 1>实现类ArrayList: ArrayList类支持可随需要而增长的动态数组.数组列表以一个原大小被创建,当超过了它的大小, 类集自动增大,当对象被删除后,数组就可以缩小. 优点:ArrayList类对于使用索引取出元素用较高的效率,他可以用索引快速定位对象. 缺点:ArrayList类对于元素的删除或插入速度较慢. 构造方法: · ArrayList(): 构造一个初始容量为10的空