import tensorflow as tf
TensorFlow -- 张量
张量的阶:
张量的数据类型:
张量属性
- graph 张量所属的默认图
- op 张量的操作名
- name 张量的字符串描述
- shape 张量的形状
张量的动态形状与静态形状
- TensorFlow中,张量具有静态形状和动态形状
- 静态形状: 创建一个张量,初始状态的形状
- tf.Tensor.get_shape:获取静态形状
- tf.Tensor.set_shape:更新Tensor对象的静态形状
- 动态形状:一种描述原始张量在执行过程中的一种形状(动态变化)
- tf.reshape:创建一个具有不同形态的新张量
- 要点:
- 转换静态形状的时候,1-D到1-D,2-D到2-D,不等跨阶数改变形状
- 对于已经固定或者设置静态形态的张量/变量,不能再次设置静态形状
- tf.reshape()动态创建新张量是,元素个数不能不匹配
张量的操作
生成张量-固定值张量
- tf.zeros(shape, dtype=tf.float32, name=None) 创建所有元素都设置为零的张量,此操作返回具有shape和shape的dtype类型的张量所有元素设置为零
- tf.zeros_like(tensor, dtype=tf.float32, name=None) 创建所有元素都设置为零的张量,给定一个张量(`tensor`),此操作返回与“tensor”相同的类型和形状,所有元素都设置为零。或者,可以使用“dtype”为返回的张量指定新类型
- tf.ones(shape, dtype=tf.float32, name=None) 创建一个所有元素都设置为1的张量,此操作返回一个类型为'dtype',形状为'shape',所有元素都设置为1的张量
- tf.ones_like(tensor, dtype=None, name=None, optimize=True) 创建一个所有元素都设置为1的张量,给定一个张量(`tensor`),此操作返回一个与`tensor`类型和形状相同的张量,所有元素都设置为1,或者,可以为返回的张量指定一个新类型(`dtype`)
- tf.fill(dims, value, name=None) 创建用标量值填充的张量,此操作创建形状为“dims”的张量并用“value”填充`
- tf.constant(value, dtype=None, shape=None, name="Const", verify_shape=False) 创建以恶搞常数变量
生成张量-随机张量
- tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=dtypes.float32, seed=None, name=None) 从截断正态分布中输出随机值,生成的值遵循具有指定平均值和标准偏差的正态分布,但幅度大于平均值的2个标准偏差的值被丢弃并重新拾取
- tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=dtypes.float32, seed=None, name=None) 从正态分布输出随机值
张量变换-改变类型
提供了如下一些改变张量中数值类型的函数
- tf.string_to_number(string_tensor, out_type=None, name=None)
- tf.to_double(x, name="ToDouble")
- tf.to_float(x, name="ToFloat")
- tf.to_bfloat16(x, name="ToBFloat16")
- tf.to_int32(x, name="ToInt32")
- tf.to_int64(x, name="ToInt64")
- tf.cast(x, dtype, name=None)
张量变换-形状和变换
可用于确定张量的形状并更改张量的形状
- tf.shape(input, name=None)
- tf.size(input, name=None)
- tf.rank(input, name=None)
- tf.reshape(tensor, shape, name=None)
- tf.squeeze(input, squeeze_dims=None, name=None)
- tf.expand_dims(input, dim, name=None)
切片与扩展
- tf.concat(values, axis, name="concat")
TensorFlow -- 变量
变量也是一种OP,是一种特殊的张量,能够进行存储持久化,它的值就是张量,默认被训练
变量的创建
tf.Variable(initial_value=None, name=None, trainable=True)
- 创建一个带值initial_value的新变量
- tf.Variable().assign(value) 为变量分配一个新值
- tf.Variable().eval(session=None) 计算并返回此变量的值
- tf.Variable().name name属性表示变量名字
变量的初始化
tf.global_variables_initalizer() 添加一个初始化所有变量的OP,在会话中开启
代码:
# -*- coding: utf-8 -*-
import os
import tensorflow as tf
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # 忽略警告
# tensor 张量
# 形状表示 0阶: (),1阶: (N,) 2阶: (4, 3), 形状不固定:(None, N)
# 形状的参数指定 0阶: 数据 1阶: [N]
# 形状的改变
# 静态形状set_shape():1、当张量的形状固定的时候,不能修改本身的形状
# 2、对于形状不固定的张量,可以修改其本身的形状,填充None
# 3、不能跨阶数修改形状(不管本身形状固定不固定
# 动态形状tf.reshape():不是去修改原本的形状,而是去创建一个大小一样,但是形状可以是不一样的张量,元素个数匹配
a = tf.constant(2.0, shape=[4, 3])
b = tf.constant(2.0, shape=[4, 3])
# print(a, b)
plt = tf.placeholder(tf.float32, [None, 3])
print(plt.shape)
# 改变静态形状
plt.set_shape([3, 3])
print(plt.shape)
a_reshape = tf.reshape(a, [3, 4])
with tf.Session() as s:
print(s.run(plt, feed_dict={plt: [[1,2,3], [3,4,5]]}))
# print(s.run([a, a_reshape]))
# print(a.graph)
# print("-" * 30)
# print(a.op)
# print("-" * 30)
# print(a.name)
# print("-" * 30)
# print(a.shape)
# 变量:有特殊用途(存储持久化,能否训练)
# 需要显示初始化:1、添加一个op,2、运行初始化
# 训练的参数,必须使用变量定义
var = tf.Variable(tf.random_normal([3, 4], mean=0.0, stddev=1.0))
con = tf.constant(10.0, tf.float32)
print(var, con)
init_op = tf.global_variables_initializer()
with tf.Session() as s:
# 运行初始化变量op
s.run(init_op)
print(s.run([var, con]))