关于Tensorflow的安装与具体教程可以参考官方中文网:Tensorflow中文社区
关于tensorflow的计算方式,如下图所示:
tensorflow计算的图形化表示如下图:
上图中右图的Tensor或Varible表示张量或变量,它们通过一个op(operation,操作)进行计算,得出的结果也是一个常量或变量,然后又与一组变量通过一个op进行计算,得到最终结果。右侧的图也是一样,比如W=2,X=3,op为乘法,所有得出结果为6,然后设b=4,与6通过op(加法)进行计算,得出结果为10,依次这样进行下去。但是,前提是这些操作必须在会话中进行,即在进行运算时,必须使用tf.Session()后方可输出答案,否则输出的是一个tensorflow的类型。
1、常量与变量
(1)常量
在tensorflow中创建常量使用constant()函数,如tf.constant()
,这里做个测试:
import tensorflow as tf
hello=tf.constant("hello world!") # 创建常量
with tf.Session() as sess: # 创建会话
print(sess.run(hello))
运行结果:
(2)变量
创建变量有以下几种方法,主要使用Variable()函数创建:
现在通过代码一个一个试一下:
第一种:
# 第一种初始化方法---等间距取值
a=tf.Variable(tf.linspace(-5.,5.,10),dtype=tf.float32) #这里的tf.linspace()表示取值范围为[-5,5],等间距取100个数,类型为float32位,其实默认的也是float32位。
init=tf.global_variables_initializer() # 变量都需要初始化
with tf.Session() as sess:
sess.run(init) #在会话中先初始化运行
print(sess.run(a))
运行结果:
第二种:
# 第二种初始化方法---根据矩阵均值和方差进行矩阵定义(需使用随机函数)
b=tf.Variable(tf.random_normal(shape=[3,3],mean=1.0,stddev=2.0,dtype=tf.float32),dtype=tf.float32) # 定义一个3*3的矩阵
init=tf.global_variables_initializer() # 变量都需要初始化
with tf.Session() as sess:
sess.run(init) #在会话中先初始化运行
print("b:\n",sess.run( b))
运行结果:
第三种:
这里以复制b为例:
c=tf.Variable(b.initialized_value(),dtype=tf.float32)
init=tf.global_variables_initializer() # 变量都需要初始化
with tf.Session() as sess:
print("c:\n", sess.run(c))
运行结果:
这里两个结果是一样的。
第四种:
使用tf.zeros()初始化一个全0矩阵。
# 第四种初始化方法---全零矩阵
d = tf.Variable(tf.zeros([3,3],dtype=tf.float32), dtype=tf.float32)
init=tf.global_variables_initializer() # 变量都需要初始化
with tf.Session() as sess:
sess.run(init) #在会话中先初始化运行
print("d:\n", sess.run(d))
运行结果:
第五种:
# 第五种初始化方法---assign
e=tf.assign(a,tf.linspace(-1.,1,10))
init=tf.global_variables_initializer() # 变量都需要初始化
with tf.Session() as sess:
sess.run(init) #在会话中先初始化运行
print("e:\n", sess.run(e))
运行结果:
注:tf.assign(A, new_number): 这个函数的功能主要是把A的值变为new_number,tf.assign()函数就有点把错题用橡皮擦擦除,然后重新写上新的答案一样。
类型转化
此外,我们还可以使用tf.cast()函数把数据类型进行转换。如下:
#类型转换
e_cast=tf.cast(e,dtype=tf.int32) # 把e转化成int类型
init=tf.global_variables_initializer() # 变量都需要初始化
with tf.Session() as sess:
sess.run(init) #在会话中先初始化运行
print("e:\n", sess.run(e))
print("e_cast:\n", sess.run(e_cast))
运行结果:
2、操作数
1、在本文一开始就介绍了op(操作),这里不再赘述。以两个常量相加为例进行代码解析:
a=tf.constant(2) # 常量
b=tf.constant(6) # 常量
c=tf.multiply(a,b) # 乘法op
with tf.Session() as sess:
print("c:\n",sess.run(c))
运行结果:
2、在tensorflow中,常数还可以跟矩阵进行加减乘除的操作:
a=tf.constant(2) # 常量
b=tf.constant(6) # 常量
c=tf.multiply(a,b) # 乘法op
m1=tf.constant([[1,2,3],
[4,5,6]]) # 矩阵常量
m1_a=tf.add(m1,a) # 加法op,矩阵和常数在tf中可以进行加减乘除
with tf.Session() as sess:
print("c:\n",sess.run(c))
print("m1_a:\n",sess.run(m1_a))
运行结果:
可以看到,矩阵中每个元素都被加上了2。
3、变量与常量的相加(矩阵)
a=tf.constant(2) # 常量
b=tf.constant(6) # 常量
c=tf.multiply(a,b) # 乘法op
m1=tf.constant([[1,2,3],
[4,5,6]]) # 矩阵常量
m1_a=tf.add(m1,a) # 加法op,矩阵和常数在tf中可以进行加减乘除
d=tf.Variable(tf.random_normal([2,3],mean=1.0,stddev=2.0,dtype=tf.float32),dtype=tf.float32)# 变量矩阵
m2_d=tf.add(d,tf.cast(m1_a,dtype=tf.float32)) #矩阵相加op
init=tf.global_variables_initializer() # 初始化
with tf.Session() as sess:
sess.run(init) #运行初始化
print("c:\n",sess.run(c))
print("m1_a:\n",sess.run(m1_a))
print("m2_d:\n", sess.run(m2_d))
运行结果:
当进行op的两个常量为矩阵时,使用tf.multiply()
则是矩阵内的对应元素进行相乘,且2个矩阵之间的shape必须保持一致,如矩阵A为2X3,矩阵B也应该为2X3,所得的结果并不是线性代数中的那样。在tensorflow中,使用tf.matmul()
这个函数进行相乘才是正统,除法类似。
3、占位符
placeholder,占位符,在tensorflow中类似于函数参数,运行时必须传入值。函数说明:tf.placeholder(dtype, shape=None, name=None)
x=tf.placeholder(shape=[2,2],dtype=tf.float32) #占位符
y=tf.placeholder(shape=[2,1],dtype=tf.float32)
xy=tf.matmul(x,y) # 矩阵乘法op
with tf.Session() as sess: # 会话
xy_result=sess.run(xy,feed_dict={x:[[1,2],[3,4]],y:[[5],[6]]}) # 规定数据
print(xy_result)
运行结果:
占位符操作就好像一条数学公式,我们给这条数学公式输入相关参数,然后在Session()会话中运行这条输入了参数的公式,最终得到结果。
本文所有实例:
import tensorflow as tf
import numpy as np
'''-------------------常量--------------------------'''
def constant_demo():
hello=tf.constant("hello world!") # 创建常量
with tf.Session() as sess: # 创建会话
print(sess.run(hello))
constant_demo()
'''--------------------变量-------------------------'''
def Varible_demo():
# 第一种初始化方法---等间距取值
a=tf.Variable(tf.linspace(-5.,5.,10),dtype=tf.float32) #这里的tf.linspace()表示取值范围为[-5,5],等间距取100个数,类型为float32位,其实默认的也是float32位。
# 第二种初始化方法---根据矩阵均值和方差进行矩阵定义(需使用随机函数)
b=tf.Variable(tf.random_normal(shape=[3,3],mean=1.0,stddev=2.0,dtype=tf.float32),dtype=tf.float32) # 定义一个3*3的矩阵
# 第三种初始化方法---复制
c=tf.Variable(b.initialized_value(),dtype=tf.float32)
# 第四种初始化方法---全零矩阵
d = tf.Variable(tf.zeros([3,3],dtype=tf.float32), dtype=tf.float32)
# 第五种初始化方法---assign
e=tf.assign(a,tf.linspace(-1.,1,10)) # tf.assign(A, new_number): 这个函数的功能主要是把A的值变为new_number
#类型转换
e_cast=tf.cast(e,dtype=tf.int32)
init=tf.global_variables_initializer() # 变量都需要初始化
with tf.Session() as sess:
sess.run(init) #在会话中先初始化运行
print("a:\n",sess.run(a))
print("b:\n",sess.run( b))
print("c:\n", sess.run(c))
print("d:\n", sess.run(d))
print("e:\n", sess.run(e))
print("e_cast:\n", sess.run(e_cast))
Varible_demo()
'''--------------------操作数-------------------------'''
def op_demo():
a=tf.constant(2) # 常量
b=tf.constant(6) # 常量
c=tf.multiply(a,b) # 乘法op
m1=tf.constant([[1,2,3],
[4,5,6]]) # 矩阵常量
m1_a=tf.add(m1,a) # 加法op,矩阵和常数在tf中可以进行加减乘除
d=tf.Variable(tf.random_normal([2,3],mean=1.0,stddev=2.0,dtype=tf.float32),dtype=tf.float32)# 变量矩阵
m2_d=tf.add(d,tf.cast(m1_a,dtype=tf.float32)) #矩阵相加op
init=tf.global_variables_initializer() # 初始化
with tf.Session() as sess:
sess.run(init) #运行初始化
print("c:\n",sess.run(c))
print("m1_a:\n",sess.run(m1_a))
print("m2_d:\n", sess.run(m2_d))
op_demo()
'''------------------------占位符--------------------------'''
def placeholder_demo():
x=tf.placeholder(shape=[2,2],dtype=tf.float32) #占位符
y=tf.placeholder(shape=[2,1],dtype=tf.float32)
xy=tf.matmul(x,y) # 矩阵乘法op
with tf.Session() as sess: # 会话
xy_result=sess.run(xy,feed_dict={x:[[1,2],[3,4]],y:[[5],[6]]}) # 规定数据
print("xy_result:\n",xy_result)
placeholder_demo()
所有运行结果: