tensorflow学习之variable变量

2.variable变量

(1)参数说明

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

Args参数说明:

initial_value:Tensor或可转换为Tensor的Python对象,它是Variable的初始值。除非validate_shape设置为False,否则初始值必须具有指定的形状。也可以是一个可调用的,没有参数,在调用时返回初始值。在这种情况下,必须指定dtype。 (请注意,init_ops.py中的初始化函数必须首先绑定到形状才能在此处使用。)

trainable:如果为True,则会默认将变量添加到图形集合GraphKeys.TRAINABLE_VARIABLES中。此集合用于优化器Optimizer类优化的的默认变量列表【可为optimizer指定其他的变量集合】,可就是要训练的变量列表。

collections:一个图graph集合列表的关键字。新变量将添加到这个集合中。默认为[GraphKeys.GLOBAL_VARIABLES]。也可自己指定其他的集合列表;

validate_shape:如果为False,则允许使用未知形状的值初始化变量。如果为True,则默认为initial_value的形状必须已知。

caching_device:可选设备字符串,描述应该缓存变量以供读取的位置。默认为Variable的设备。如果不是None,则在另一台设备上缓存。典型用法是在使用变量驻留的Ops的设备上进行缓存,以通过Switch和其他条件语句进行重复数据删除。

name:变量的可选名称。默认为“Variable”并自动获取。

variable_def:VariableDef协议缓冲区。如果不是None,则使用其内容重新创建Variable对象,引用图中必须已存在的变量节点。图表未更改。 variable_def和其他参数是互斥的。

dtype:如果设置,则initial_value将转换为给定类型。如果为None,则保留数据类型(如果initial_value是Tensor),或者convert_to_tensor将决定。

expected_shape:TensorShape。如果设置,则initial_value应具有此形状。

import_scope:可选字符串。要添加到变量的名称范围。仅在从协议缓冲区初始化时使用。

(2)使用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中执行初始化操作。

import tensorflow as tf

state = tf.Variable(0, name='counter')
state2 = tf.Variable(tf.truncated_normal([3, 4], meam=0, stddev=.5), name='weight')
# print(state.name)
one = tf.constant(1)

new_value = tf.add(state,one)
update = tf.assign(state, new_value)  # 使state的值 = new_valeu

init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    for _ in range(3):
        sess.run(update)
        print(sess.run(state))

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

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

1.在会话中run

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())
  • tf.get_Variable()

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

get_variable(
    name,
    shape=None,
    dtype=None,
    initializer=None,
    regularizer=None,
    trainable=True,
    collections=None,
    caching_device=None,
    partitioner=None,
    validate_shape=True,
    use_resource=None,
    custom_getter=None,
    constraint=None
)

Args参数说明:

name:新变量或现有变量的名称。

shape:新变量或现有变量的形状。

dtype:新变量或现有变量的类型(默认为DT_FLOAT)。

ininializer:如果创建了则用它来初始化变量。

regularizer:A(Tensor - > Tensor或None)函数;将它应用于新创建的变量的结果将添加到集合tf.GraphKeys.REGULARIZATION_LOSSES中,并可用于正则化。

trainable:如果为True,还将变量添加到图形集合GraphKeys.TRAINABLE_VARIABLES(参见tf.Variable)。

collections:要将变量添加到的图表集合列表。默认为[GraphKeys.GLOBAL_VARIABLES](参见tf.Variable)。

caching_device:可选的设备字符串或函数,描述变量应被缓存以供读取的位置。默认为Variable的设备。如果不是None,则在另一台设备上缓存。典型用法是在使用变量驻留的Ops的设备上进行缓存,以通过Switch和其他条件语句进行重复数据删除。

partitioner:可选callable,接受完全定义的TensorShape和要创建的Variable的dtype,并返回每个轴的分区列表(当前只能对一个轴进行分区)。

validate_shape:如果为False,则允许使用未知形状的值初始化变量。如果为True,则默认为initial_value的形状必须已知。

use_resource:如果为False,则创建常规变量。如果为true,则使用定义良好的语义创建实验性ResourceVariable。默认为False(稍后将更改为True)。在Eager模式下,此参数始终强制为True。

custom_getter:Callable,它将第一个参数作为true getter,并允许覆盖内部get_variable方法。 custom_getter的签名应与此方法的签名相匹配,但最适合未来的版本将允许更改:def custom_getter(getter,* args,** kwargs)。也允许直接访问所有get_variable参数:def custom_getter(getter,name,* args,** kwargs)。一个简单的身份自定义getter只需创建具有修改名称的变量是:python def custom_getter(getter,name,* args,** kwargs):return getter(name +'_suffix',* args,** kwargs)

注意:如果initializer初始化方法是None(默认值),则会使用variable_scope()中定义的initializer,如果也为None,则默认使用glorot_uniform_initializer,也可以使用其他的tensor来初始化,value,和shape与此tensor相同

正则化方法默认是None,如果不指定,只会使用variable_scope()中的正则化方式,如果也为None,则不使用正则化;

附: tf.truncated_narmal()和tf.truncated_naomal__initializer()的区别

tf.truncated_narmal(shape=[],mean=0,stddev=0.5)使用时必须制定shape,返回值是在截断的正态分布随机生成的指定shape的tensor

tf.truncated_normal_initializer(mean=0.stddev=0.5)调用返回一个initializer 类的一个实例(就是一个初始化器),不可指定shape,

注意的点:

(1)

tf.Variable()与tf.get_variable()区别

1.使用tf.Variable时,如果检测到命名冲突,系统会自己处理。使用tf.get_variable()时,系统不会处理冲突,而会报错

import tensorflow as tf

state = tf.Variable(0, name='counter')
state2 = tf.Variable(2,name='counter')
print(state.name)
print(state2.name)

输出:
counter:0
counter_1:0



import tensorflow as tf

state = tf.get_variable(name='counter',initializer=1)
state2 = tf.get_variable(name='counter',initializer=2)
print(state.name)
print(state2.name)

输出:
ValueError: Variable counter already exists, disallowed. Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope? Originally defined 

2.基于这两个函数的特性,当我们需要共享变量的时候,需要使用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

random Tensor

可用于赋值给tf.Variable()的第一个参数

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

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

tf.random_uniform(shape, minval=0, maxval=None, dtype=tf.float32, seed=None, name=None)

tf.random_shuffle(value, seed=None, name=None)

tf.random_crop(value, size, seed=None, name=None)

tf.multinomial(logits, num_samples, seed=None, name=None)

tf.random_gamma(shape, alpha, beta=None, dtype=tf.float32, seed=None, name=None)

tf.set_random_seed(seed)

constant value tensor

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

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

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

tf.ones_like(tensor, dtype=None, name=None)

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

tf.constant(value, dtype=None, shape=None, name='Const')

initializer

·

tf.constant_initializer(value=0, dtype=tf.float32)
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)
tf.ones_initializer(dtype=tf.float32, partition_info=None)
tf.orthogonal_initializer(gain=1.0, dtype=tf.float32, seed=None)

tf.placeholder()

import tensorflow as tf

input1 = tf.placeholder(tf.float32)  # 可以指定shape
input2 = tf.placeholder(tf.float32)
output = tf.multiply(input1, input2)
with tf.Session() as sess:
    print(sess.run(output, feed_dict={input1:[7.],input2:[2.]}))

 

参考资料

https://blog.csdn.net/u012436149/article/details/53696970?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
变量线性回归是机器学习中最基础的模型之一,用于预测一个变量与另一个变量之间的线性关系。在本教程中,我们将使用TensorFlow编写实现单变量线性回归的程序。 1. 导入必要的库 首先,我们需要导入TensorFlow和其他必要的库。 ```python import tensorflow as tf import numpy as np import matplotlib.pyplot as plt ``` 2. 准备数据 我们将使用一个简单的数据集来演示单变量线性回归。该数据集包含两列数据,第一列是房屋的面积,第二列是房屋的价格。 ```python data = np.array([[1400, 245000], [1600, 312000], [1700, 279000], [1875, 308000], [1100, 199000], [1550, 219000], [2350, 405000], [2450, 324000]]) ``` 我们可以将数据集分成两个数组,一个用于输入(房屋面积),另一个用于输出(房屋价格)。 ```python x_data = data[:,0] y_data = data[:,1] ``` 接下来,我们将数据可视化,以便更好地理解数据集。 ```python plt.scatter(x_data, y_data, color='blue') plt.xlabel('House Area') plt.ylabel('House Price') plt.show() ``` 3. 创建模型 使用TensorFlow创建单变量线性回归模型的第一步是定义变量。 ```python X = tf.placeholder(tf.float32, name='X') Y = tf.placeholder(tf.float32, name='Y') W = tf.Variable(0.0, name='weights') B = tf.Variable(0.0, name='bias') ``` 我们定义了两个占位符变量X和Y,这些变量将在训练模型时用于输入和输出。我们还定义了两个变量W和B,这些变量将在训练过程中被优化。 接下来,我们定义了线性模型。 ```python Y_pred = tf.add(tf.multiply(X, W), B) ``` 这个简单的线性模型将输入X乘以权重W并加上偏置B。 4. 定义损失函数 接下来,我们需要定义一个损失函数来评估模型的性能。 ```python cost = tf.reduce_mean(tf.square(Y_pred - Y)) ``` 我们使用平方误差作为损失函数。 5. 定义优化器 为了最小化损失函数,我们需要定义一个优化器。 ```python optimizer = tf.train.GradientDescentOptimizer(0.0001).minimize(cost) ``` 我们使用梯度下降优化器来最小化损失函数。 6. 训练模型 我们现在可以开始训练我们的模型了。 ```python init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) for i in range(10000): total_loss = 0 for x, y in zip(x_data, y_data): _, loss = sess.run([optimizer, cost], feed_dict={X: x, Y: y}) total_loss += loss if i % 1000 == 0: print("Epoch {0}: {1}".format(i, total_loss/len(x_data))) W, B = sess.run([W, B]) ``` 我们使用10000个epoch训练模型,并打印出每1000个epoch的平均损失。在训练完成后,我们获得了最终的权重W和偏置B。 7. 可视化结果 最后,我们可以可视化结果,以便更好地理解模型。 ```python plt.scatter(x_data, y_data, color='blue') plt.plot(x_data, W * x_data + B, color='red') plt.xlabel('House Area') plt.ylabel('House Price') plt.show() ``` 这个图形显示了原始数据点以及模型的线性拟合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值