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

Posted 文火冰糖的硅基工坊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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

以上是关于[TensorFlow系列-19]:TensorFlow基础 - Variable对象的使用方法与Tensor对象的比较的主要内容,如果未能解决你的问题,请参考以下文章

使用亚马逊的云服务器EC2做深度学习配置TensorFlow

模块“tensorflow”没有属性“GPUOptions”

无法安装旧版本的 tensorflow

Win10上安装TensorFlow(官方文档翻译)

安装带有 SYCL 支持的 TensorFlow

TensorBoard的使用(结合线性模型)