Session使用
#创建会话,使用默认图
tf.Session()
#运行
session.run(fetches,feed_dict=None)
#参数:fetches图中的单个操作,或多个操作的列表
# feed_dict运行传入的参数构成的字典,可以覆盖之前的值
#关闭,使用with语句打开时不需要关闭
session.close()
Graph图和Session
import tensorflow as tf
import os
#调整警告级别,低于这个级别的警告不会报出来
os.environ['TF_CPP_MIN_LOG_LEVEL']='3'
#定义常量,这是一组操作
a = tf.constant(5.0)
b = tf.constant(1.0)
c = tf.add(a,b)
#获取缺省默认图
graph = tf.get_default_graph()
print(graph)
#用session()来执行默认图
with tf.Session() as sess:
print(sess.run(c))
#打印出a,b,c,sess这些张量,操作,session中的grap
print(a.graph)
print(b.graph)
print(c.graph)
print(sess.graph)
#发现在默认情况下,他们使用的图和上面获取的默认图是同一个
#创建一个新的图对象
graph2 = tf.Graph()
#print(graph2)
with graph2.as_default(): #将graph2设置为缺省默认图
#在graph2下定义操作op
d = tf.constant(1111.0)
#用session在graph2上执行op
with tf.Session(graph=graph2) as sess:
print(sess.run(d))
#在graph2中不能执行a,b,c操作,因为他们不属于graph2
Session常见的错误及原因
调用run()方法时,可能会出现的错误及原因
- RuntimeError:Session处于无效(如关闭)
- TypeError:fetches或feed_dict的键是不合适的值
- ValueError:fetches或feed_dict的键无效或引用的值不存在
张量
张量属性
import tensorflow as tf
a = tf.constant(5.0)
with tf.Session() as sess:
print(sess.run(a))
#打印出张量 a的属性
print('name:',a.name) #名称:系统自动分配
print('dtype:',a.dtype) #元素类型
print('shape:',a.shape) #维度:0维:()
print('op:',a.op) #操作名:由张量的各个属性组成
print('graph:',a.graph) #所属图:打印出图对象的地址
张量生成
import tensorflow as tf
#生成值全为0的张量
t_zeros = tf.zeros(shape=[2,3], #形状
dtype='float32') #元素类型
#生成值全为1的张量
t_ones = tf.ones(shpae=[2,3],dtype='float32')
#生成正太分布的张量
t_nd = tf.random_normal(shape=[10], #1维:1行10元素
mean1.7, #均值,不写有默认值
stddev=0.2, #标准差,不写有默认值
dtype='float32')
#生成和指定张量shape相同的张量
t_zeros_like = tf.zeros_like(t_nd)
with tf.Session() as sess:
print(t_zeros.eval()) #eval()表示在sess执行op,效果和Session.run()是一样的
print(t_ones.eval())
print(t_nd.eval()
print(t_zeros_like.eval())
张量类型转换
import tensorflow as tf
t_ones = tf.ones(shape=[2,3],dtype='int32')
with tf.Session() as sess:
#将int型张量 t_ones 转为float32
print(tf.cast(t_ones,tf.float32).eval()
占位符
不确定张量内容时,可使用占位符先占个位置,然后执行计算,通过参数传入具体数据执行计算(通过feed_dict参数指定)
占位符在我们训练时喂入样本数据时经常用到
import tensorflow as tf
#d定义占位符plhd1
plhd1 = tf.placeholder(tf.float32, #类型
[2,3]) #shape
#定义占位符plhd2
plhd2 = tf.placeholder(tf.float32,
[None,3] #N行3列
with tf.Session() as sess:
#给出之前使用占位符的张量
d = [[1,2,3],
[4,5,6]]
#将shape作为参数传入
params = {plhd1: d}
print(sess.run(plhd1, #op
feed_dict=params))
print(sess.run(plhd2,
feed_dict={plhd2:d}))
修改张量形状
静态形状:张量在创建时的初始形状,一旦固定则不能修改,静态形状不能跨阶修改形状(2阶的只能转为2阶,3阶的只能转为3阶)
动态形状:张量在执行时修改形状,可以跨阶修改(注意元素个数要匹配)
import tensorflowj as tf
#定义占位符
plhd = tf.placeholder(tf.float32,[None,3])
#修改静态形状
plhd.set_shape([4,3]) #修改静态形状,静态形状修改一次就固定,之后不能修改
print(plhd)
#动态形状:创建一个新张量,并设置形状
#这也是一个操作
new_plhd = tf.reshape(plhd,[3,4])
print(new_plhd)
#这也是一个操作,和python不一样,这里的new_plhd不会将上一个操作的new_plhd覆盖
new_plhd = tf.reshape(plhd,[2,6])
print(new_plhd)
with tf.Session() as sess:
pass
张量数学操作
import tensorflow as tf
x = tf.constant([[1,2],[3,4]],
dtype=tf.float32)
y = tf.constant([[4,3],[3,2]],
dtype=tf.float32)
#张量相加,对应位置值相加
x_add_y = tf.add(a,b)
#张量相乘,行行遍历相乘求和
x_mul_y = tf.matmul(x,y)
#求张量的自然对数,对每一个元素求自然对数
x_log = tf.log(x)
#计算张量指定维度上的和,参数x为张量,参数aixs为指定的维度:0(列求和)/1(行求和)
x_sum = tf.reduce_mean(x,aixs=[1],keep_dims=False)
#计算张量片段的和,把具有相同值的片段的值累加起来
data = tf.constant([1,2,3,4,5,6,7,8,9,10], #data根据下面的seg_idx分片段求和,0对应位置求和、1对应位置求和、2对应位置上的值求和
dtypy=int.float32)
seg_idx = tf.constant([0,0,0,1,1,2,2,2,2,2],
dtype=tf.int32)
seg_data = tf.segment_sum(data, #原始张量
seg_idx) #分段依据
with tf.Session() as sess:
print(x_add_y.eval())
print(x_mul_y.eval()) #[[10. 7.] [24. 17.]]
print(x_log.eval())
print(x_sum.eval())
print(seg_data.eval())
变量
变量是一种张量,他的值是张量,能够持久保存(存到文件中)(普通张量不行)(模型和参数需要存到文件中保存)
import tensorflow as tf
a = tf.constant([1,2,3,4,5]) #张量
#变量
var = tf.Variable(tf.random_normal([2,3]), #变量的初始值
name='var1') #变量名称
#初始化op,定义变量必须初始化
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
#执行初始化全局变量
sess.run(init_op)
print(sess.run([a,var]))