TensorFlow线性代数¶
作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/
1. 标量运算¶
import tensorflow as tf
x = tf.constant([3.0])
y = tf.constant([2.0])
sess = tf.Session()
sess.run([x + y, x * y, x / y, x**y])
2. 向量运算¶
x = tf.range(12)
sess.run(x)
sess.run(x[3])
x.shape
y = tf.ones(12, dtype=tf.float32)
sess.run(y)
转换数据类型
x = tf.cast(x, "float32")
点积:给定两个向量$\mathbf{x},\mathbf{y}\in\mathbb{R}^d$,它们的点积(dotproduct)$\mathbf{x}^\top\mathbf{y}$(或$\langle\mathbf{x},\mathbf{y}\rangle$)是相同位置的按元素乘积的和:$\mathbf{x}^\top \mathbf{y} = \sum_{i=1}^{d} x_i y_i$。
sess.run(tf.tensordot(x, y, axes=1))
sess.run(tf.reduce_sum(x * y))
向量所有元素相乘
sess.run(tf.reduce_prod(x))
sess.run(tf.reduce_prod(y))
sess.run(x + y)
向量所有元素相加
sess.run(tf.reduce_sum(x))
sess.run(tf.reduce_sum(y))
求均值
sess.run(tf.reduce_mean(x))
sess.run(tf.size(x))
x_size = tf.cast(tf.size(x), "float32")
sess.run(tf.reduce_sum(x) / x_size)
将向量转化为矩阵
sess.run(tf.reshape(x, (3, 4)))
3. 矩阵/张量运算¶
X = tf.reshape(tf.range(12, dtype=tf.float32), (3, 4))
sess.run(X)
axis=0时,返回矩阵X每一列最大元素所在下标
sess.run(tf.argmax(X, 0))
axis=1时,返回矩阵X每一行最大元素所在下标
sess.run(tf.argmax(X, 1))
axis=0时,返回矩阵X每一列求和结果
sess.run(tf.reduce_sum(X, axis=0))
axis=1时,返回矩阵X每一行求和结果
sess.run(tf.reduce_sum(X, axis=1))
axis=[0, 1],先对列求和,再对行求和,即矩阵所有元素相加的结果
sess.run(tf.reduce_sum(X, axis=[0, 1]))
sess.run(tf.reduce_sum(X))
Y = tf.constant([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
sess.run(Y)
sess.run(tf.argmax(Y, 0))
sess.run(tf.argmax(Y, 1))
axis=0时,X与Y按行连接
sess.run(tf.concat([X, Y], axis=0))
axis=1时,X与Y按列连接
sess.run(tf.concat([X, Y], axis=1))
矩阵对应元素相加
sess.run(X + Y)
矩阵的转置
Z = tf.transpose(X)
sess.run(Z)
矩阵对应元素相乘
sess.run(X * Y)
矩阵相乘 A=Z*Z'
A = tf.matmul(Z, tf.transpose(Z))
sess.run(A)
构建对称矩阵,A_symm=(A+A')/2
A_symm = (A + tf.transpose(A)) / 2.0
sess.run(A_symm)
判断A_symm是否为对称阵,即A_symm=A_symm'
sess.run(tf.equal(A_symm, tf.transpose(A_symm)))
计算总和或均值时保持轴数不变
sum_X = tf.reduce_sum(X, axis=1, keepdims=True)
sess.run(sum_X)
由于sum_X
在对每行进行求和后仍保持两个轴,我们可以通过广播将X
除以sum_X
。
sess.run(X / sum_X)
沿某个轴计算X
元素的累积总和,比如axis=0
(按行计算),我们可以调用cumsum
函数。此函数不会沿任何轴降低输入张量的维度。
sess.run(tf.cumsum(X, axis=0))
sess.run(tf.cumsum(X, axis=1))
Z = tf.reshape(tf.range(24), (2, 3, 4))
sess.run(Z)
标量乘以矩阵
a = 2
sess.run(a + Z)
sess.run(a * Z)
矩阵乘以向量 $$ \mathbf{X}\mathbf{b} = \begin{bmatrix} \mathbf{x}^\top_{1} \\ \mathbf{x}^\top_{2} \\ \vdots \\ \mathbf{x}^\top_m \\ \end{bmatrix}\mathbf{b} = \begin{bmatrix} \mathbf{x}^\top_{1} \mathbf{b} \\ \mathbf{x}^\top_{2} \mathbf{b} \\ \vdots\\ \mathbf{x}^\top_{m} \mathbf{b}\\ \end{bmatrix}. $$
b = tf.constant([2.0, 1, 4, 3])
sess.run(b)
sess.run(X)
把向量b扩展成与矩阵X大小一致
b = tf.expand_dims(b, 1)
sess.run(b)
sess.run(tf.matmul(X, b))
4. 范数¶
2范数
$$\|\mathbf{x}\|_2 = \sqrt{\sum_{i=1}^n x_i^2},$$
u = tf.constant([3.0, -4.0])
sess.run(tf.norm(u, ord=2))
1范数
$$\|\mathbf{x}\|_1 = \sum_{i=1}^n \left|x_i \right|.$$
sess.run(tf.reduce_sum(tf.abs(u)))
sess.run(tf.norm(u, ord=1))
$\infty $范数
$$\|\mathbf{x}\|_\infty = max(|x_{i}|).$$
import numpy as np
sess.run(tf.norm(u, ord=np.inf))