tensorflow学习之Constant、Variable、placeholder
Constant、Variable、placeholder
自己理解同时结合网络多方资源,如有侵权,请通知我删除。
前提知识是理解tensor即张量的含义。
- tf.constant(value ,dtype = None ,shape = None ,name = ‘Const’ ,verify_shape = False )
构造一个不可变的张量。一般可以在神经网络图中作为一个固定不变的节点。constant为trainable为Flase
参数:
value:输出类型 dtype 的常量值 (或列表)。
dtype:所得张量的元素类型。
shape:所得张量的可选维度。
name:张量的可选名称。
verify_shape:是否验证value的shape和指定shape相符,若设为True则进行验证,不相符时会抛出异常。
# 创建一维的张量.
tensor = tf.constant([1, 2, 3, 4, 5, 6, 7])
# 输出: [1 2 3 4 5 6 7]
# 创建二维的张量.
tensor = tf.constant(-1.0, shape=[2, 3])
tensor = tf.constant([[-1,-1,-1],[-1,-1,-1]])
# 输出:[[-1. -1. -1.]
# [-1. -1. -1.]]
# 其他创建常量的方式
tf.zeros(shape, dtype=tf.float32, name=None)
# 创建一个shape形状的元素全0的张量
tf.zeros_like(tensor, dtype=None, name=None)
# 创建一个shape为tensor的shape的张量
tensor = [[-1,-1,-1],[-1,-1,-1]]
result = tf.zeros_like(tensor)
# tensor的shape为(2,3),result的shape结果也为(2,3)
# 输出:[[0. 0. 0.]
# [0. 0. 0.]]
tf.ones(shape, dtype=tf.float32, name=None)
# 创建一个shape形状的元素全1的张量
tf.ones_like(tensor, dtype=None, name=None)
# tensor的shape为(2,3),result的shape结果也为(2,3)
# 输出:[[1. 1. 1.]
# [1. 1. 1.]]
tf.fill(dims, value, name=None)
# 创建一个维度为dims,值为value的tensor对象.该操作会创建一个维度为dims的tensor对象,并将其值设置为value,该tensor对象中的值类型# 和value一致
# 当value为0时,该方法等同于tf.zeros()
# 当value为1时,该方法等同于tf.ones()
# 参数:
# dims: 类型为int32的tensor对象,用于表示输出的维度(1-D, n-D),通常为一个int32数组,如:[1], [2,3]等
# value: 常量值(字符串,数字等),该参数用于设置到最终返回的tensor对象值中
# name: 当前操作别名(可选)
dim = [2,3]
tf.fill(dim, 5)
# 输出:
#[[5 5 5]
# [5 5 5]]
- tf.Variable()和tf.get_variable()
tf.Variable是可训练的变量。例如在模型中的weights (W)和biases (B)。tf.Variable经常保存训练的结果 。
tf.Variable(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)
tf.get_variable(name, shape=None, dtype=None, initializer=None, regularizer=None, trainable=True, collections=None, caching_device=None, partitioner=None, validate_shape=True, custom_getter=None)
使用tf.Variable时,如果检测到命名冲突,系统会自己处理。使用tf.get_variable()时,系统不会处理冲突,而会报错。
基于这两个函数的特性,当我们需要共享变量的时候,需要使用tf.get_variable()。在其他情况下,这两个的用法是一样的
import tensorflow as tf
with tf.variable_scope("scope1"):
w1 = tf.get_variable("w1", shape=[])
w2 = tf.Variable(0.0, name="w2")
with tf.variable_scope("scope1", reuse=True):
w1_p = tf.get_variable("w1", shape=[])
w2_p = tf.Variable(1.0, name="w2")
print(w1 is w1_p, w2 is w2_p)
#输出
#True False
看到这,就可以明白官网上说的参数复用的真面目了。由于tf.Variable() 每次都在创建新对象,所有reuse=True 和它并没有什么关系。对于get_variable(),来说,如果已经创建的变量对象,就把那个对象返回,如果没有创建变量对象的话,就创建一个新的。
random Tensor 随机生成tensor
可用于赋值给tf.Variable()的第一个参数
tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
按正态分布随机生成数。shape:形状;mean:均值;stddev:标准差。seed:随机数种子,一个python整数。
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
正态分布,但如果随机出来的值偏离平均值超过2个标准差,那么这个数将会被重新随机。参数如上。
tf.random_uniform(shape, minval=0, maxval=None, dtype=tf.float32, seed=None, name=None)
按平均分布生成随机数。shape:形状;minval:最小值;maxval:最大值。
tf.random_shuffle(value, seed=None, name=None)
沿着要被洗牌的张量的第一个维度,随机打乱。
random_shuffle(
value,# 要被洗牌的张量
seed=None,
name=None
)
即下面这种效果:
[[1, 2], [[5, 6],
[3, 4], ==> [1, 2],
[5, 6]] [3, 4]]
tf.random_crop(value, size, seed=None, name=None)
随机地将张量裁剪为给定的大小。
以一致选择的偏移量将一个形状 size 部分从 value 中切出。需要的条件:value.shape >= size。
如果大小不能裁剪,请传递该维度的完整大小。例如,可以使用 size = [crop_height, crop_width, 3] 裁剪 RGB 图像。
参数:
value:向裁剪输入张量。
size:一维张量,大小等级为 value。
seed:Python 整数。用于创建一个随机的种子。查看 tf.set_random_seed 的行为。
name:此操作的名称(可选)。
返回:
与 value 具有相同的秩并且与 size 具有相同形状的裁剪张量。
tf.multinomial(logits, num_samples, seed=None, name=None)
logits 大小为[batch,n_class]
num_samples 表示采样的个数
seed 随机种子数
name表示该op的名字
这个函数就是根据logits中每个类别的概率采样,这个概率可以不用归一化后的概率,也就是每个类的概率可以大于1,不需要所有类别概率和为1,我觉得它底层是会自动给我们归一化的,输出结果为[batch,num_samples]大小
表示在每个batch_size 上采样num_samples个数,他是根据logits中的概率来采样的
这个函数用在rnn的输出中比较多,
tf.random_gamma(shape, alpha, beta=None, dtype=tf.float32, seed=None, name=None)
按Gamma分布产生随机数。shape:形状;alpha:形状参数alpha;beta:尺度参数beta。
tf.set_random_seed(seed)
设置图形级随机seed。
可以从两个seed中获得依赖随机seed的操作:图形级seed和操作级seed。下面介绍如何设置图形级别的seed。
它与操作级别seed的交互如下:
如果既没有设置图层级也没有设置操作级别的seed:则使用随机seed进行该操作。
如果设置了图形级seed,但操作seed没有设置:系统确定性地选择与图形级seed结合的操作seed,以便获得唯一的随机序列。
如果未设置图形级seed,但设置了操作seed:使用默认的图层seed和指定的操作seed来确定随机序列。
如果图层级seed和操作seed都被设置:则两个seed将一起用于确定随机序列。
initializer
在tf.get_variable()中作为initializer参数使用。
tf.constant_initializer(value=0, dtype=tf.float32)
参数:
value: python 的标量、数组、元组、列表或者N维的numpy array。
dtype: 数据类型.
verify_shape: 是否验证value的shape和指定shape相符,若设为True则进行验证,不相符时会抛出异常。
例子:
value = [0, 1, 2, 3, 4, 5, 6, 7]
value = np.array(value)
value = value.reshape([2, 4])
init = tf.constant_initializer(value)
x = tf.get_variable('x', shape=[2, 4], initializer=init)
下列函数和上面功能一样
tf.random_normal_initializer(mean=0.0, stddev=1.0, seed=None, dtype=tf.float32)
正态分布初始化
tf.truncated_normal_initializer(mean=0.0, stddev=1.0, seed=None, dtype=tf.float32)
截断正态分布生成随机数
tf.random_uniform_initializer(minval=0, maxval=None, seed=None, dtype=tf.float32)
均匀分布初始化
tf.uniform_unit_scaling_initializer(factor=1.0, seed=None, dtype=tf.float32)
这种方法输入方差是常数
tf.zeros_initializer(shape, dtype=tf.float32, partition_info=None)
全0初始化
tf.ones_initializer(dtype=tf.float32, partition_info=None)
全1初始化
tf.orthogonal_initializer(gain=1.0, dtype=tf.float32, seed=None)
生成正交矩阵
- tf.placeholder(dtype,shape=None,name=None)
placeholder,占位符,在tensorflow中类似于函数参数,运行时必须传入值。
tf.placeholder经常使用在向神经网络图中作为输入数据的节点使用.
参数:
dtype:数据类型。常用的是tf.float32,tf.float64等数值类型。
shape:数据形状。默认是None,就是一维值,也可以是多维,比如[2,3], [None, 3]表示列是3,行不定。
name:名称。
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.]})
推荐阅读
-
tensorflow学习笔记之简单的神经网络训练和测试
-
tensorflow1.0学习之模型的保存与恢复(Saver)
-
python tensorflow学习之识别单张图片的实现的示例
-
深度学习之TensorFlow构建神经网络层
-
莫烦学习笔记之TensorFlow(Activation function)激励函数
-
tensorflow学习笔记之mnist的卷积神经网络实例
-
tensorflow学习之(四)使用placeholder 传入值
-
深度学习之格式转换笔记(三):keras(.hdf5)模型转TensorFlow(.pb) 转TensorRT(.uff)格式
-
tensorflow学习笔记之tfrecord文件的生成与读取
-
TensorFlow神经网络学习之张量与变量概念