tensorflow入门

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]])>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值