[TensorFlow系列-19]:TensorFlow基础 - Variable对象的使用方法与Tensor对象的比较

 作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/120388666


目录

第1章 Variable变量

1.1 为什么需要引入Variable

1.2 什么是Variable

1.3 普通tensor与Variable在深度学习中各种的用途

1.4 Variable与Tensor的整合?

第2章 Variable的定义

2.1 Variable所在的module

2.2 Variable的定义

2.4 trainable属性

第3章 variable数据的读写

3.1 variable数据的读取:把variable转换以成numpy

待续..........: variable的自动求导



第1章 Variable变量

1.1 为什么需要引入Variable

Tensor是Tensorflow的一个完美组件(可以生成高维数组),可以对张量进行各种并行运算。

但是要构建神经网络,进行自动求导和反向传播,光有Tensor还是远远不够的,需要引入一个具备自动求导新特新的数据结构Variable。

1.2 什么是Variable

 在Tensorflow中,变量Variable又称为可trainable的Tensor,它是对Tensor的一个封装,因此Tensor具备的操作,Variable都具备。

Variable还引入了一个额外的属性:

  • trainable:该属性的作用是指示,在神经网络模型训练时,是否需要对它进行自动求导/梯度,并进行梯度迭代。

1.3 普通tensor与Variable在深度学习中各种的用途

(1)普通tensor:

  • 存放输入的样本数据
  • 存放输出的结果数据
  • 中间边的临时数据

(2)Variable变量

  • 专门存放神经网络模型的参数w,b
  • 存放中间需要求导的变量,如Yn,Yx......

1.4 Variable与Tensor的整合?

不同于pytorch,在Tensorflow1.0和2.0中,都没有把tensor和Variable进行最终的整合和统一。

变量Variable中间还是建立在tensor之上,因此在Tensorflow中,不能用Tensor替代Variable。

第2章 Variable的定义

2.1 Variable所在的module

Variable被定义在tf的基础模块中

#环境准备
import numpy as np
import tensorflow as tf
print("hello world")
print("tensorflow version:", tf.__version__)

2.2 Variable的定义

Variable可以由已有的tensor生成

(1)张量

# 生成张量
print("源张量")
tensor_a = tf.constant([1.,2,3,4])
print(tensor_a)
源张量
tf.Tensor([1. 2. 3. 4.], shape=(4,), dtype=float32)

(2)方法1:从Tensor生成Variable

print("根据张量,生成variable")
var_a = tf.Variable(tensor_a, trainable=False)
print(var_a)
print(var_a.shape)
print(var_a.numpy())

print("\n根据张量,生成variable")
var_b = tf.Variable(tensor_a, trainable=True)
print(var_b)
print(var_b.shape)
print(var_b.numpy())
根据张量,生成variable
<tf.Variable 'Variable:0' shape=(4,) dtype=float32, numpy=array([1., 2., 3., 4.], dtype=float32)>
(4,)
[1. 2. 3. 4.]

根据张量,生成variable
<tf.Variable 'Variable:0' shape=(4,) dtype=float32, numpy=array([1., 2., 3., 4.], dtype=float32)>
(4,)
[1. 2. 3. 4.]

备注:variable不是简单的张量,是构建在tensor之上的一个新的数据结构!这不同于pytroch。

(3)方法2:输入数字生成Variable

print("\n根据张量,生成variable")
var_c = tf.Variable(4, dtype=tf.int32, trainable=False)
print(var_c)
print(var_c.shape)
print(var_c.numpy())

print("\n根据张量,生成variable")
var_c = tf.Variable(5,dtype=tf.float32, trainable=True)
print(var_c)
print(var_c.shape)
print(var_c.numpy())
根据张量,生成variable
<tf.Variable 'Variable:0' shape=() dtype=int32, numpy=4>
()
4

根据张量,生成variable
<tf.Variable 'Variable:0' shape=() dtype=int32, numpy=5>
()
5

(4)指定数据类型

print("\n根据张量,生成variable")
var_c = tf.Variable(4, dtype=tf.int32, trainable=False)
print(var_c)
print(var_c.shape)
print(var_c.numpy())

print("\n根据张量,生成variable")
var_c = tf.Variable(5,dtype=tf.float32, trainable=True)
print(var_c)
print(var_c.shape)
print(var_c.numpy())

根据张量,生成variable <tf.Variable 'Variable:0' shape=() dtype=int32, numpy=4> () 4 根据张量,生成variable <tf.Variable 'Variable:0' shape=() dtype=int32, numpy=5> () 5

2.4 trainable属性

print("根据张量,生成variable")
var_a = tf.Variable(tensor_a)
print(var_a)
print(var_a.trainable)

print("\n根据张量,生成variable")
var_b = tf.Variable(tensor_a, trainable=True)
print(var_b)
print(var_b.trainable)

print("\n根据张量,生成variable")
var_c = tf.Variable(tensor_a, trainable=False)
print(var_c)
print(var_c.trainable)
根据张量,生成variable
<tf.Variable 'Variable:0' shape=(4,) dtype=float32, numpy=array([1., 2., 3., 4.], dtype=float32)>
True

根据张量,生成variable
<tf.Variable 'Variable:0' shape=(4,) dtype=float32, numpy=array([1., 2., 3., 4.], dtype=float32)>
True

根据张量,生成variable
<tf.Variable 'Variable:0' shape=(4,) dtype=float32, numpy=array([1., 2., 3., 4.], dtype=float32)>
False

备注:tf.Variable默认情况下,trainable属性是开启的。

trainable属性开启和闭关的作用和差别,影响的是自动求导/梯度。

这里暂不阐述。

第3章 variable数据的读写

3.1 variable数据的读取:把variable转换以成numpy

print("\n根据张量,生成variable")
var_c = tf.Variable(5, trainable=True)
print(var_c)
print(var_c.shape)

print(var_c.numpy())
根据张量,生成variable
<tf.Variable 'Variable:0' shape=() dtype=int32, numpy=5>
()
5

3.2 variable数据的修改:通过特定的接口

(1)不能通过赋值语句修改variable变量的值。

print("\n根据张量,生成variable")
var_a = tf.Variable(5, trainable=True)
print(var_a)
print(var_a.shape)
print(var_a.numpy())

var_a = 6
print(var_a)
print(var_a.shape)
print(var_a.numpy())
根据张量,生成variable
<tf.Variable 'Variable:0' shape=() dtype=int32, numpy=5>
()
5
6
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-12-5ba02295f655> in <module>
      7 var_a = 6
      8 print(var_a)
----> 9 print(var_a.shape)
     10 print(var_a.numpy())

AttributeError: 'int' object has no attribute 'shape'

备注:

后一个var已经不是原先的variable变量了。

(2)通过assign(value)方法

assign(value):直接给某个variable赋一个新的数值Value。

print("\n根据张量,生成variable")
var_a = tf.Variable(5, trainable=True)
print(var_a)
print(var_a.shape)
print(var_a.numpy())

var_a.assign(8)
print(var_a)
print(var_a.shape)
print(var_a.numpy())
根据张量,生成variable
<tf.Variable 'Variable:0' shape=() dtype=int32, numpy=5>
()
5
<tf.Variable 'Variable:0' shape=() dtype=int32, numpy=8>
()
8

(2)通过assign_add(value)方法

assign_add(value): 在当前数值的基础之后,增加某个数值。

print("\n根据张量,生成variable")
var_a = tf.Variable(5, trainable=True)
print(var_a)
print(var_a.shape)
print(var_a.numpy())

var_a.assign_add(2)
print(var_a)
print(var_a.shape)
print(var_a.numpy())
根据张量,生成variable
<tf.Variable 'Variable:0' shape=() dtype=int32, numpy=5>
()
5
<tf.Variable 'Variable:0' shape=() dtype=int32, numpy=7>
()
7

(2)通过assign_sub(value)方法

assign_sub(value): 在当前数值的基础之后,减去某个数值。

print("\n根据张量,生成variable")
var_a = tf.Variable(5, trainable=True)
print(var_a)
print(var_a.shape)
print(var_a.numpy())

var_a.assign_sub(2)
print(var_a)
print(var_a.shape)
print(var_a.numpy())
根据张量,生成variable
<tf.Variable 'Variable:0' shape=() dtype=int32, numpy=5>
()
5
<tf.Variable 'Variable:0' shape=() dtype=int32, numpy=3>
()
3

待续..........: variable的自动求导


作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/120388666

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文火冰糖的硅基工坊

你的鼓励是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值