刚接触tensorflow,还不算太会,今天刚敲了一个矩阵相乘的问题,发现tf的使用和np的使用有点区别,在不规则写法(不规则写法是一维向量的一种写法,按行向量处理)中矩阵相乘问题,np可以执行,但是tf不行。
1、多行多列矩阵相乘和点乘问题
①tf和np的用法完全一致。
②相乘,必须是行列对应,第一个矩阵的列和第二个矩阵的行必须相等
③点乘,两个矩阵必须完全一致
#coding:utf-8 import numpy as np import tensorflow as tf A=np.array([[1,2,3],[4,5,6]]) B=np.array([[1,2],[3,4],[5,6]]) print(np.dot(A,B)) #相乘 A=np.array([[1,2,3],[4,5,6]]) B=np.array([[1,2,3],[4,5,6]]) print(np.multiply(A,B)) #点乘 ################################################# A=tf.constant([[1,2,3],[4,5,6]]) B=tf.constant([[1,2],[3,4],[5,6]]) C=tf.matmul(A,B) sess=tf.Session() print(sess.run(C)) #相乘 AA=tf.constant([[1,2,3],[4,5,6]]) BB=tf.constant([[1,2,3],[4,5,6]]) CC=tf.multiply(AA,BB) print(sess.run(CC)) #点乘 sess.close()
2、规则写法下矩阵相乘和点乘问题
①一个是一维,一个是多维
②两个都是一维
③相乘必须行列对应,点乘可以扩展至相同行列,只有一维向量可以扩展,若扩展不到相同行列不能点乘
④np和tf用法一致
import numpy as np import tensorflow as tf #1*3 3*2 只能相乘,但是不能点乘,一维向量不能扩展至和多维向量一致,多维向量不能扩展 a=np.array([[1,2,3]]) b=np.array([[1,2],[2,3],[3,4]]) print(np.dot(a,b)) #1*2 3*2 只能点乘,不能相乘 a=np.array([[1,2]]) b=np.array([[1,2],[2,3],[3,4]]) print(np.multiply(a,b)) #都是一维 相乘只要满足行列对应相等即可,点乘,两个都是一维向量,都能扩展 a=np.array([[1,2,3]]) b=np.array([[1],[2],[3]]) print(np.dot(a,b)) print(np.multiply(a,b)) ####################################################################### a=tf.constant([[1,2,3]]) b=tf.constant([[1,2],[2,3],[3,4]]) c=tf.matmul(a,b) sess=tf.Session() print(sess.run(c)) a=tf.constant([[1,2]]) b=tf.constant([[1,2],[2,3],[3,4]]) c=tf.multiply(a,b) print(sess.run(c)) a=tf.constant([[1,2,3]]) b=tf.constant([[1],[2],[3]]) c=tf.matmul(a,b) cc=tf.multiply(a,b) sess=tf.Session() print(sess.run(c)) print(sess.run(cc)) sess.close()
3、不规则写法下的矩阵相乘和点乘问题
①np的使用同上,不规则写法按行向量处理
②tf的点乘使用同上,不规则写法按行向量处理
③tf的相乘不能使用(tf的相乘只适用规则写法)
import numpy as np import tensorflow as tf a=np.array([1,2]) #不规则写法 b=np.array([[1],[2],[3]]) print(np.multiply(a,b)) #可以点乘 a=np.array([1,2,3]) b=np.array([[1,2],[2,2],[3,2]]) print(np.dot(a,b)) #可以相乘 ######################################################## a=tf.constant([1,2]) b=tf.constant([[1],[2],[3]]) c=tf.multiply(a,b) #只能点乘 sess=tf.Session() print(sess.run(c)) #a=tf.constant([1,2,3]) #tf在不规则情况下不能使用相乘 a=tf.constant([[1,2,3]]) b=tf.constant([[1],[2],[3]]) c=tf.matmul(a,b) print(sess.run(c)) sess.close()
总结:
①规则写法下,np和tf用法一致,相乘不用说,满足行列对应相等即可相乘,点乘中一维向量可以扩展,若能扩展至行列相等,则能点乘,否则不能点乘。
②不规则写法下,np和tf的点乘用法一致,tf不能相乘,np可以。
③综述:np和tf在点乘上用法一致,在不规则情况下tf不能使用,np适用任何情况