線性代數與TensorFlow程序用例
來自專欄 深度學習模型
前言
2015年11月9日,google開源了人工智慧系統TensorFlow,同時成為2015年最受關注的開源項目之一。TensorFlow支持卷積神經網路、循環神經網路,這些都是在計算機視覺、語音識別、自然語言處理方面最流行的深度神經網路。在研究TensorFlow深度學習模型之前,需要對相關的數學基礎有一定了解,不然在學習過程中就會遇到各種困惑,容易放棄。本文主要介紹TensorFlow模型中用到的到線性代數知識以及相關TensorFlow的程序用例。
標量、向量、矩陣、張量
在線性代數中涉及的基本概念包括標量、向量、矩陣、張量。其中標量就是一個單獨的數,是一維常量;向量是一列數,是一維數組;矩陣是一個二維數組;張量一般表示多維數組。在TensorFlow中用變數/常量來表示標量、向量、矩陣、張量如下所示:
#定義標量,初始值維0.5
scalarVar = tf.Variable(initial_value=0.5, dtype=tf.float32)
#定義向量
vectorVar =
tf.Variable(initial_value=tf.zeros(shape=[10]),dtype=tf.float32)#定義矩陣
matrixVar = tf.Variable(initial_value=tf.ones(shape=[10,10]), dtype=tf.float32)
#定義張量
tensorVar = tf.Variable(initial_value=tf.ones(shape=[10,10,10]), dtype=tf.float32)
TensorFlow運行流程如下所示:
import tensorflow as tfscalarVar = tf.Variable(initial_value=0.5, dtype=tf.float32)vectorVar = tf.Variable(initial_value=tf.zeros(shape=[10]),dtype=tf.float32)matrixVar = tf.Variable(initial_value=tf.ones(shape=[10,10]), dtype=tf.float32)tensorVar = tf.Variable(initial_value=tf.ones(shape=[10,10,10]), dtype=tf.float32)session=tf.Session()initOP=tf.initialize_all_variables()session.run(initOP)print(scalarVar.eval(session))print(vectorVar.eval(session))print(matrixVar.eval(session))print(tensorVar.eval(session))
乘法運算
矩陣乘法是線性代數中的重要運算,包含矩陣和向量的乘法運算及矩陣和矩陣的乘法運算。如果有矩陣A和向量b,那麼兩者相乘可表示為:
TensorFlow乘法操作只支持矩陣相乘,不能進行矩陣和向量相乘,因此進行乘法操作後,需要相加下,如下所示:
matrix_A = tf.Variable(initial_value=[[2,2],[3,3]], dtype=tf.float32)vector_b = tf.Variable(initial_value=[4,4],dtype=tf.float32)vector_c = tf.reduce_sum(tf.multiply(matrix_A, vector_b),axis=1)
線性代數中兩個矩陣相乘如下所示:
TensorFlow矩陣乘法的示例代碼如下所示:
matrix_A = tf.Variable(initial_value=[[1,1],[2,2]], dtype=tf.float32)matrix_B = tf.Variable(initial_value=[[3,3],[4,4]], dtype=tf.float32)matrix_C = tf.matmul(matrix_A,matrix_B)
特徵分解
tf.linalg.eigh or tf.self_adjoint_eig
計算一批自自共軛矩陣的特徵分解。
import tensorflow as tfimport numpy as npsess=tf.InteractiveSession()F=tf.convert_to_tensor(np.array([[2.0,-2.0],[-2.0,5.0]]))print("Eigenvalues and eigenvectors")print(sess.run(tf.linalg.eigh(F)))sess.close()
svd奇異值分解
奇異值分解(Singular Value Decomposition,SVD)是一種矩陣分解(Matrix Decomposition)的方法。除此之外,矩陣分解還有很多方法,例如特徵分解(Eigendecomposition)、LU分解(LU decomposition)、QR分解(QR decomposition)和極分解(Polar decomposition)等,下面為奇異值分解:
#http://shartoo.github.io/SVD-decomponent/#https://www.jianshu.com/p/336772764fefimport tensorflow as tfsess=tf.InteractiveSession()a = tf.constant([3,-1,-1,3],shape=[2,2],dtype=tf.float64)s,u,v=tf.svd(a)print(sess.run([s,u,v]))sess.close()
主成分分析
PCA,即主成分分析(Principal Component Analysis),假設我們的數據矩陣為 X,其 shape 為 (n, p),其中 n 是指樣本的數量,而 p 是指維度。所以給定了 X 之後,找到一種操作並分解 X 的方法,以更少的維度表徵最大化的信息。
#https://zhuanlan.zhihu.com/p/27935339import tensorflow as tfimport mathfrom sklearn import datasetsfrom sklearn.manifold import TSNEimport numpy as npimport matplotlib.pyplot as pltfrom matplotlib import cmfrom mpl_toolkits.mplot3d import Axes3Dimport seaborn as snsiris_dataset = datasets.load_iris()# print(iris_dataset)class TF_PCA: def __init__(self, data, target=None, dtype=tf.float32): self.data = data self.target = target self.dtype = dtype self.graph = None self.X = None self.u = None self.singular_values = None self.sigma = None def fit(self): self.graph = tf.Graph() with self.graph.as_default(): self.X = tf.placeholder(self.dtype, shape=self.data.shape) # Perform SVD singular_values, u, _ = tf.svd(self.X) # Create sigma matrix sigma = tf.diag(singular_values) with tf.Session(graph=self.graph) as session: self.u, self.singular_values, self.sigma = session.run([u, singular_values, sigma], feed_dict={self.X: self.data}) def reduce(self, n_dimensions=None, keep_info=None): if keep_info: # Normalize singular values normalized_singular_values = self.singular_values / sum(self.singular_values) # Create the aggregated ladder of kept information per dimension ladder = np.cumsum(normalized_singular_values) # Get the first index which is above the given information threshold index = next(idx for idx, value in enumerate(ladder) if value >= keep_info) + 1 n_dimensions = index with self.graph.as_default(): # Cut out the relevant part from sigma sigma = tf.slice(self.sigma, [0, 0], [self.data.shape[1], n_dimensions]) # PCA pca = tf.matmul(self.u, sigma) with tf.Session(graph=self.graph) as session: return session.run(pca, feed_dict={self.X: self.data})tf_pca = TF_PCA(iris_dataset.data, iris_dataset.target)tf_pca.fit()pca = tf_pca.reduce(keep_info=0.9) # Results in two dimensionscolor_mapping = {0: sns.xkcd_rgb[bright purple], 1: sns.xkcd_rgb[lime], 2: sns.xkcd_rgb[ochre]}colors = list(map(lambda x: color_mapping[x], iris_dataset.target))plt.scatter(pca[:, 0], pca[:, 1], c=colors)
t-SNE
http://blog.csdn.net/lzl1663515011/article/details/46328337https://eastonwang.github.io/2017/03/08/%E4%BD%BF%E7%94%A8t-SNE%E5%8F%AF%E8%A7%86%E5%8C%96%E6%95%B0%E6%8D%AE/
t-SNE(t-distributed stochastic neighbor embedding)是用於降維的一種機器學習演算法,是由 Laurens van der Maaten 和 Geoffrey Hinton在08年提出來。此外,t-SNE 是一種非線性降維演算法,非常適用於高維數據降維到2維或者3維,進行可視化。
#http://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.htmlimport numpy as npfrom sklearn.manifold import TSNEX = np.array([[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 1]])X_embedded = TSNE(n_components=2).fit_transform(X)X_embedded.shapeprint(X_embedded)
plt.close()model = TSNE(learning_rate=100, n_components=2, random_state=0, perplexity=5)tsne5 = model.fit_transform(iris_dataset.data)model = TSNE(learning_rate=100, n_components=2, random_state=0, perplexity=30)tsne30 = model.fit_transform(iris_dataset.data)model = TSNE(learning_rate=100, n_components=2, random_state=0, perplexity=50)tsne50 = model.fit_transform(iris_dataset.data)plt.figure(1)plt.subplot(311)plt.scatter(tsne5[:, 0], tsne5[:, 1], c=colors)plt.subplot(312)plt.scatter(tsne30[:, 0], tsne30[:, 1], c=colors)plt.subplot(313)plt.scatter(tsne50[:, 0], tsne50[:, 1], c=colors)plt.show()
推薦閱讀:
※重讀線性代數(一)向量空間
※G.Strang的微分方程和線性代數(1.2)
※將線性代數形象化 總結篇
※機器學習數學:線性代數
※深度學習讀書筆記 第一部分 線性代數
TAG:深度學習DeepLearning | TensorFlow | 線性代數 |