[TensorFlow系列-19]:TensorFlow基础 - Variable对象的使用方法与Tensor对象的比较
Posted 文火冰糖的硅基工坊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[TensorFlow系列-19]:TensorFlow基础 - Variable对象的使用方法与Tensor对象的比较相关的知识,希望对你有一定的参考价值。
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/120388666
目录
1.3 普通tensor与Variable在深度学习中各种的用途
3.1 variable数据的读取:把variable转换以成numpy
第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