一、背景
Keras的易用,pytorch的直觀,但是總避不開tensorflow畢竟谷狗大佬的,範圍很廣,從阿爾法狗由谷狗帶火,AI熱起來,但是tensorflow大部分人還是有點抗拒的,分析原因
1.不符合程序員直覺(程序員的直覺是代碼可以一行行的運行,每一行就會有結果)
2.tensorflow接口衆多,寫個矩陣乘tf.multiply tf.matmul等等要區分
二、解決方法
1.理解tensorflow的思路
俗話說,不能避開就接受它,那麼就理解tensorflow的思路,就是先建立圖(graph),然後建立回話(Session),在session中調用sess.run(tensor)的結果。
2.讓自己直覺理解它
2.1 怎麼直覺理解呢,我的直覺就是例子來理解,用常數去做一些矩陣的運算。
# 矩陣轉置,矩陣乘,矩陣的平方(其實是想得到特徵的模)
import tensorflow as tf
with tf.device('/cpu:0'):
sess = tf.Session()
a =tf.constant([[1,2 ,3], [4 ,5, 6]])
print("a.shape:",a.shape,sess.run(a))
print("a的轉置 a.transpose:",sess.run(tf.transpose(a)))
b =tf.constant([[1,2 ,3], [4 ,5, 6]])
print('\n 元素乘 a*b:',sess.run(a*b))
print("元素乘 tf.multiply(a,b):",sess.run(tf.multiply(a,b)))
print("\n 矩陣乘 tf.matmul:",sess.run(tf.matmul(a,tf.transpose(b))))
a_square = tf.square(a)
print("平方",sess.run(a_square))
a_sum= tf.reduce_sum(a_square,1)
print("平方和:",sess.run(a_sum))
2.2 numpy的矩陣運算是比較直觀的,所以可以用numpy類推,加深理解。
其實可能tensorflow底層是不是就是和numpy類似的呢,可能!說白了現在深度所有的多維運算都是矩陣運算或者它的擴展。沒啥神奇的。深度學習後面發展的邏輯因果符號運算可能會不同,扯遠了。
import numpy as np
A = np.array([[1,2 ,3], [4 ,5, 6]])
B = np.array([[1,2 ,3], [4 ,5, 6]])
print(A.shape,A)
print("a轉置:",A.T)
print('\n 元素乘 a*b:',A*B)
print("元素乘numpy.multiply:",np.multiply(A,B))
print("\n 矩陣乘 numpy.dot(A,B):",np.dot(A,B.T))
附上一個小彩蛋
矩陣裏面一個遇到最多的axis參數,終結它
設axis=i,則numpy沿着第i個下標變化的放下進行操作。例如剛剛的例子,可以將表示爲:data =[[a00, a01],[a10,a11]],所以axis=0時,沿着第0個下標變化的方向進行操作,也就是a00->a10, a01->a11,也就是縱座標的方向,axis=1時也類似。下面我們舉一個四維的求sum的例子來驗證一下:
import numpy as np
data =[[1, 2],[3,4]]
print(f'data:{data}')
print(f"axis = 0: {np.sum(data,axis=0)}")
print(f"axis =1: {np.sum(data,axis=1)}")
# 結果
# data:[[1, 2], [3, 4]]
# axis = 0: [4 6]
# axis =1: [3 7]