Tensorflow1.x | 学习笔记整理1--常量变量定义使用

Tensorflow1.x 系列为个人入门Tensorflow1的简要笔记,最近学习的论文涉及到了bilevel program和hypergradient的求解,对应的代码基于Tensorflow1实现,因此根据视频教程学习了解一下Tensorflow。

  • 视频课程链接:https://www.bilibili.com/video/BV1wJ411T77b?p=15
  • 跟着视频课自己写的代码,使用Colab(https://colab.research.google.com/)
  • tips:不同版本的Tensorflow的一些函数用法不一样

文章目录

    • TensorFlow概述
    • 常量
    • 变量
    • feed和fetch的使用
    • 简单示例,训练一个线性模型
    • 小结

TensorFlow概述

  • 使用图(Graphs)表示计算的任务,图中的节点称为运算(Operation, op)
  • 一个op可以获得0或者多个Tensor(类型化多维数组),执行运算的过程,并产生0或者多个Tensor
  • 在被称之为会话(Session)的上下文中执行图,会话将图中的op分发到cpu、gpu等设备上,提供执行op的方法并返回tensor。
  • 使用张量(Tensor)表示数据,通过变量(variable)维护状态,并且使用feed和fetch为分别操作赋值和获取数据

常量

包括内容:

  1. 常量的定义方法
  2. Tensorflow中默认图的启动和会话的使用
# 使用1.x版本的tensorflow
%tensorflow_version 1.x		# 这是colab中设置tensorflow版本的方法
import tensorflow as tf

# 定义常量
m1 = tf.constant([[3,3]])   # 1行2列的矩阵
m2 = tf.constant([[2],[3]])  # 2行1列的矩阵
product = tf.matmul(m1, m2) # 定义矩阵的乘法
print(product)  

| 这里的product:Tensor(“MatMul:0”, shape=(1, 1), dtype=int32)


# 定义会话,启动默认的图
sess = tf.Session()
result = sess.run(product)  # 触发调用product-->调用矩阵乘法-->生成m1和m2
print(result)
sess.close()          # 关闭会话,释放资源

| 在会话中通过run()方法的调用会触发矩阵乘法,计算输出:[[15]]


# 使用with..as定启动图,这种方法比较常用
with tf.Session() as sess:
  result = sess.run(product)  # 触发调用product-->调用矩阵乘法-->生成m1和m2
  print(result)

# 整理,关于tensorflow中定义常量的函数 
"""tf.constant(value, dtype=None, shape=None, name='Const', verify_shape=False)
  value可以是常数或者列表
"""

ten1 = tf.constant([1, 2, 3, 4, 5])   # 定义1-D Tensor

# 当给定的value尺寸小于shape定义的尺寸时,使用value最后一个元素填充
ten2 = tf.constant([1, 2], shape=[2,3])  # [[1 2 2], [2 2 2]]
with tf.Session() as sess:
  result = sess.run(ten2)  
  print(result)

| 输出:
[[1 2 3]
[3 3 3]]

变量

内容:

  1. 变量的定义和初始化方法–>定义了变量就必须对变量进行初始化
  2. 注意赋值运算的使用,调用tf.assign()方法而不能简单使用=
# 使用1.x版本的tensorflow
%tensorflow_version 1.x
import tensorflow as tf
x = tf.Variable([1,2])
a = tf.constant([3,3])
sub = tf.subtract(x, a)   # 减法 sub=x-a
add = tf.add(x, sub)     # 加法 x+sub

# 全局变量初始化的operation
init = tf.global_variables_initializer()  
with tf.Session() as sess:
  sess.run(init)        # 首先对变量初始化
  print(sess.run(sub))
  print(sess.run(add))

| 在会话中调用减法和加法的operation,触发相应的计算并输出结果:
[-2 -1]
[-1 1]


# 实现变量自增
state = tf.Variable(0, name='counter')
new_value = tf.add(state, 1)  # 加法运算,使得变量加1
update = tf.assign(state, new_value)  # 赋值运算,第二个参数的值赋值给第一个参数
init = tf.global_variables_initializer()	# 定义全局变量的初始化opeartion
with tf.Session() as sess:
  sess.run(init)    # 变量初始化
  print(sess.run(state))
  for _ in range(5):
    sess.run(update)  # 调用赋值运算
    print(sess.run(state))

| 输出结果:
0
1
2
3
4
5

feed和fetch的使用

  1. feed:主要用于给tf.placeholder()定义的tensor传递具体的数值,tf.placeholder()一般称之为占位符;
  2. fetch:可以理解为在调用sess.run()方法时同时执行多个运算
# feed

# 使用tf.placeholder为张量创建一个占位符,其值必须使用feed_dict传入
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.multiply(input1, input2)  # 与上个例子不同,这里的input1和2不是确定的
with tf.Session() as sess:
  # input1和input2的值通过feed_dict以字典的形式传入
  # 传入不同的参数,将返回不同的output的值
  print(sess.run(output, feed_dict={input1:7, input2:2}))

| 输出结果:
14.0


# 使用1.x版本的tensorflow
%tensorflow_version 1.x
import tensorflow as tf

# Fetch:在会话中同时执行多个operation
input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)

add = tf.add(input2, input3)
mul = tf.multiply(input1, add) # element-wise

with tf.Session() as sess:
  result = sess.run([mul, add]) # 同时执行乘法和加法运算
  print(result)

| 输出结果:
[21.0, 7.0]

简单示例,训练一个线性模型

# 使用1.x版本的tensorflow
%tensorflow_version 1.x
import tensorflow as tf
import numpy as np

# 定义一条直线,y=0.1x+0.2
x_data = np.random.rand(100)  # 生成100个随机点
y_data = x_data * 0.1 + 0.2 

# 定义线性模型,y=kx+b
k = tf.Variable(0.) # 定义变量k,初始值为0
b = tf.Variable(0.)
y = k * x_data + b

# 优化k和b使得线性模型接近直线
loss = tf.reduce_mean(tf.square(y_data - y))  # 定义loss=(y_data-y)^2 
optimizer = tf.train.GradientDescentOptimizer(0.2)  # 定义优化器为梯度下降,学习率为0.2
train = optimizer.minimize(loss)  # 梯度下降减小损失函数:计算一次梯度、更新一次参数

init = tf.global_variables_initializer()

with tf.Session() as sess:
  sess.run(init)
  for step in range(201):
    sess.run(train)
    if step % 20 == 0:  # 每20次迭代打印k和b
      print(step, sess.run([k, b]))

小结

  1. 当使用变量,要定义初始化变量的运算并在会话一开始执行该运算;
  2. TensorFlow自带默认的会话,我们可以自己在默认的会话中添加节点并执行运算;
  3. 当使用占位符定义张量时,要在sess.run()方法中通过参数feed_dict={}以字典的形式传入其具体的值;
  4. 在会话中同时执行多个operation时,使用列表的形式传入即可;
  5. 训练一个模型的步骤:定义数据–>定义损失函数、采用的优化方法–>在会话中启动训练过程

Tensorflow1.x | 学习笔记整理1--常量变量定义使用_第1张图片

你可能感兴趣的:(deep,learning,Tensorflow1.x,学习笔记整理)