tf2除了tf.keras这个高级api的引入之外,其他的一些基础函数也发生了一些变化,就连最为基本的constant也发生了一些变化,比如在1.x里面constant建立的数组是不支持列数不一样的数组组合的,但是在2.0的版本里面,引入了RaggedTensor这个数据类型,也就实现了不规则数据的组合
import tensorflow as tf
from tensorflow import keras
t = tf.ragged.constant([[1.,2.,3.],[4.,5.]])
print(t)
可以看到这里的数据类型是RaggedTensor,我们也可以通过t.to_tensor()这个函数来完成数据类型从RaggedTensor转变为Tensor型,RaggedTensor类型除了可以进行简单的加减乘除以外,还可以通过tf.concat()函数来进行数组之间的拼接
t1 = tf.ragged.constant([[5.,6.],[7.,8.]])
print(tf.concat((t,t1),axis = 0))
因为RaggedTensor类型在转变成tensor类型的时候,位数不够的自动补0,而且0都一定在原来存在的非零数的后面,这就意味着RaggedTensor类型不适合保存数据,必须要用sparse tensor类型来保持数据
s = tf.SparseTensor(indices = [[0,1],[0,2],[1,2]],
values = [1,2,3],
dense_shape = [3,4])
print(s)
#把SparseTensor类型的数据转化为tensor类型的数据
print(tf.sparse.to_dense(s))
这里要注意一下,在tf.SparseTensor里面第一个indices参数,必须要按照顺序来放,如果不按照顺序来放,它就会报一份is out of order [Op:SparseToDense]比如
s = tf.SparseTensor(indices = [[0,2],[0,1],[1,2]],
values = [1,2,3],
dense_shape = [3,4])
print(s)
print(tf.sparse.to_dense(s))
这里的顺序就是乱掉的,可以看见,系统给我们报错了。但这种情况也比较的好处理,只需要在我们定义完的数据后面加上tf.sparse.reorder()这个函数就可以了。
s = tf.SparseTensor(indices = [[0,2],[0,1],[1,2]],
values = [1,2,3],
dense_shape = [3,4])
s1 = tf.sparse.reorder(s)
print(s1)
print(tf.sparse.to_dense(s1))
在tensorflow里面除了常量,肯定也就还有变量,变量最主要的特点就是它可以被重新的赋值,但在tensorflow里面变量不能简单的用赋值号来赋值,我们只能用assign()函数
v = tf.Variable([[1.,2.,3.],[4.,5.,6.]])
print(v)
#把Variable类型转化为tensor类型
print(v.value())
#只输出Variable类型里面的值
print(v.numpy())
#改变v里面一个数据的值
v[0,1].assign(30)
print(v.numpy())
v[1].assign(30.,31.,32.)
print(v.numpy())