1.tensorflow入门
1.基础API的使用
Tensorflow中定义的数据叫做tensor,tensor又分为常量和变量
1.1常量的定义和使用
常量一旦为定义,不能够修改内部的值
使用tf.constant()来定义
#定义常量
a = tf.constant([1,2,3])
#和numpy一样可以进行索引
print(a)
print(a[1])
输出:
tf.Tensor([1 2 3], shape=(3,), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)
常量的操作:
#tensor的切片和索引
a = tf.constant([[0,1,3],[1,2,3],[1,4,3]])
print(a[1,1])
#这是tf中特有的切片操作,...可以代表后面所有维度都选的意思
print(a[0,...])
#可以赋值
a = a + 1
print(a)
输出:
<tf.Tensor: shape=(), dtype=int32, numpy=2>
<tf.Tensor: shape=(3,), dtype=int32, numpy=array([0, 1, 3])>
<tf.Tensor: shape=(3, 3), dtype=int32, numpy=
array([[1, 2, 4],
[2, 3, 4],
[2, 5, 4]])>
常量tensor和ndarray的转换
#使用.numpy()可以把tensor转化为ndarray
a.numpy()
#使用tf.constant()把ndarray转化为tensor常量
b = np.array([0,1])
tf.constant(b)
输出:
[[0 1 3]
[1 2 3]
[1 4 3]]
tf.Tensor([0 1], shape=(2,), dtype=int32)
生成标量:
#生成标量,scalar,没有形状
c = tf.constant(1)
c.shape
输出:
TensorShape([])
使用字符串:
#字符串
e = tf.constant('abcd')
f = tf.constant(['cafe','coffe','咖啡hu'])
print(e)
#求字符串长度
print(tf.strings.length(e))
#获得utf-8长度
print(tf.strings.length(e,unit='UTF8_CHAR'))
#字符串的编码与解码
print(tf.strings.unicode_decode(f,'UTF8'))
print(tf.strings.unicode_encode(tf.strings.unicode_decode(f,'UTF8'),'UTF-8'))
输出:
tf.Tensor(b'abcd', shape=(), dtype=string)
tf.Tensor(4, shape=(), dtype=int32)
tf.Tensor(4, shape=(), dtype=int32)
<tf.RaggedTensor [[99, 97, 102, 101], [99, 111, 102, 102, 101], [21654, 21857, 104, 117]]>
tf.Tensor([b'cafe' b'coffe' b'\xe5\x92\x96\xe5\x95\xa1hu'], shape=(3,), dtype=string)
ragged tensor不规则的tensor:
#ragged tensor不规则的tensor
r = tf.ragged.constant([[1,1],[2,5],[],[5,1],[78]])
print(r)
print(r[1])
print(r[1:3])
#ragged tensor 不能切片,否则会报错,因为内部的数据形状不同
r2 = tf.ragged.constant([[1,2],[],[1,2],[4]])
#合并
#axis = 0,行操作,增加了行数
print(tf.concat([r,r2],axis = 0))
输出:
<tf.RaggedTensor [[1, 1], [2, 5], [], [5, 1], [78]]>
tf.Tensor([2 5], shape=(2,), dtype=int32)
<tf.RaggedTensor [[2, 5], []]>
<tf.RaggedTensor [[1, 1], [2, 5], [], [5, 1], [78], [1, 2], [], [1, 2], [4]]>
#因为r和r2的列数不一致,所以无法合并
tf.concat([r,r2],axis = 1)
输出:
InvalidArgumentError: Input tensors have incompatible shapes.
Condition x == y did not hold.
不规则的tensor必须用ragged定义,否则报错:
#不规则的tensor必须用ragged定义
tf.constant([[1,1],[2,5],[],[5,1],[78]])
输出:
ValueError: Can't convert non-rectangular Python sequence to Tensor.
将ragged tensor转化为普通的tensor:
a = tf.ragged.constant([[1,2],
[2,3],
[],
[4,5,6]])
#默认对不齐的地方补0,shape是指输出的tensor形状
a.to_tensor(defult_value = 0,shape = (4,3))
#可以通过default_value指定填充的值,shape可以指定转化之后的形状,多余部分会被截掉
a.to_tensor(default_value = 2,shape = (3,4))
输出:
tf.Tensor(
[[1 2 0]
[2 3 0]
[0 0 0]
[4 5 6]], shape=(4, 3), dtype=int32)
tf.Tensor(
[[1 2 2 2]
[2 3 2 2]
[2 2 2 2]], shape=(3, 4), dtype=int32)
稀疏矩阵sparse tensor
#sparse tensor 稀疏矩阵,对indices索引的元素赋值values
s = tf.SparseTensor(indices=[[0,1],[1,2],[2,3]],values=[1,2,3],dense_shape=[3,4])
print(s)
#通过稀疏矩阵转到稠密矩阵打印出真实矩阵
tf.sparse.to_dense(s)
输出:
SparseTensor(indices=tf.Tensor(
[[0 1]
[1 2]
[2 3]], shape=(3, 2), dtype=int64), values=tf.Tensor([1 2 3], shape=(3,), dtype=int32), dense_shape=tf.Tensor([3 4], shape=(2,), dtype=int64))
<tf.Tensor: shape=(3, 4), dtype=int32, numpy=
array([[0, 1, 0, 0],
[0, 0, 2, 0],
[0, 0, 0, 3]])>
稀疏矩阵不能求和
s + 1
TypeError: unsupported operand type(s) for +: 'SparseTensor' and 'int'
稀疏矩阵可以矩阵运算
#matrix multiply maymul
ss = tf.constant([[1,2],
[3,4],
[5,6],
[7,8]])
tf.sparse.sparse_dense_matmul(s,ss)
输出:
<tf.Tensor: shape=(3, 2), dtype=int32, numpy=
array([[ 3, 4],
[10, 12],
[21, 24]])>
注意:
稀疏矩阵定义是最好是有序的,否则转为稠密矩阵时会出错
#sparse tensor最好定义indices成有序的,否则转化为稠密矩阵时会出错
a = tf.SparseTensor(indices=[[0,2],[0,1],[1,2]],values=[1,2,3],dense_shape=(3,4))
tf.sparse.to_dense(a)
输出:
InvalidArgumentError: {{function_node __wrapped__SparseToDense_device_/job:localhost/replica:0/task:0/device:CPU:0}} indices[1] = [0,1] is out of order. Many sparse ops require sorted indices.
Use `tf.sparse.reorder` to create a correctly ordered copy.
使用reoder就可以使无序的sparse变为有序的,进而可以转为稠密矩阵
#使用reorder
b = tf.sparse.reorder(a)
tf.sparse.to_dense(b)
输出:
<tf.Tensor: shape=(3, 4), dtype=int32, numpy=
array([[0, 2, 1, 0],
[0, 0, 3, 0],
[0, 0, 0, 0]])>
2.2 变量的定义和使用
使用tf.Varible来定义
#tensorflow中变量的定义就是Variable
a = tf.Variable([[1,2],
[2,3],
[3,4]])
#打印的是tensor
print(a.value())
#打印的是ndarray
print(a.numpy())
输出:
<tf.Tensor: shape=(3, 2), dtype=int32, numpy=
array([[1, 2],
[2, 3],
[3, 4]])>
array([[1, 2],
[2, 3],
[3, 4]])
tensorflow中变量的修改只能是assign,不能用索引赋值的形式
a[0,1] = 2
输出:
TypeError: 'ResourceVariable' object does not support item assignment
输入:
a[0,1].assign(3)
输出:
<tf.Variable 'UnreadVariable' shape=(3, 2) dtype=int32, numpy=
array([[1, 3],
[2, 3],
[3, 4]])>
输入:
a[0,:].assign([5,6])
输出:
<tf.Variable 'UnreadVariable' shape=(3, 2) dtype=int32, numpy=
array([[5, 6],
[2, 3],
[3, 4]])>
2.3 tensorflow的运算
加减乘除
#定义常量
a = tf.constant(1)
b = tf.constant(2)
#定义运算
#可以直接用python算术运算符
subtract = a - b
add = a + b
divide = a / b
multiply = a * b
#但是最好直接使用tensorflow定义好的api,效率更高
add2 = tf.add(a,b)
subtract2 = tf.subtract(a,b)
multiply2 = tf.multiply(a,b)
divide2 = tf.divide(a,b)
print(add,'\n',add2)
print(subtract,'\n',subtract2)
print(multiply,'\n',multiply2)
print(divide,'\n',divide2)
输出:
tf.Tensor(3, shape=(), dtype=int32)
tf.Tensor(3, shape=(), dtype=int32)
tf.Tensor(-1, shape=(), dtype=int32)
tf.Tensor(-1, shape=(), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)
tf.Tensor(0.5, shape=(), dtype=float64)
tf.Tensor(0.5, shape=(), dtype=float64)
聚合运算
#聚合运算
x = np.random.randint(0,10,size = (3,6))
print(x)
print(x.mean(axis = 0,dtype = np.int32))
#tensorflow的聚合运算前面多一个reduce
print(tf.reduce_mean(x,axis = 0))
输出:
[[8 6 4 0 8 1]
[0 9 0 4 6 9]
[0 8 2 2 7 6]]
[2 7 2 2 7 5]
tf.Tensor([2 7 2 2 7 5], shape=(6,), dtype=int32)
矩阵运算:
#矩阵运算
y = np.random.randint(0,10,size = (6,4))
#tensorflow中矩阵乘法是matmul
tf.matmul(x,y)
#或者直接使用x@y,生成的是ndarray
x @ y
#或者将x和y转化为tensor,再用x@y
tf.constant(x) @ tf.constant(y)
#但是最好选择直接调用tensorflow1的api,运算速度更快
输出:
<tf.Tensor: shape=(3, 4), dtype=int32, numpy=
array([[172, 62, 115, 224],
[190, 45, 127, 191],
[105, 33, 83, 107]])>