一、背景
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]