Tensorflow:numpy基础实战,并从代码中明白卷积的计算原理
三道实战题目
1.用numpy生成随机的两个矩阵(每个元素为1-5的随机整数),这两个矩阵的形状为(4,3)和(3,5),用numpy矩阵乘法计算结果,并手工验证结果。
import numpy as np
a = np.random.randint(1,5,(4,3))
b = np.random.randint(1,5,(3,5))
#矩阵乘法
c = np.matmul(a,b)
print("a=",a)
print("b=",b)
print("a*b=",c)
手工验证之后,可以清楚地理解矩阵乘法的运算规则。
2.用numpy生成一张长宽为(200,300)的红色图片,利用numpy的切片,将图的四个角画出20*20的矩形颜色区域,颜色分别为蓝色(左上),绿色(右上),白色(左下),黑色(右下),用opencv展示出来。
import numpy as np
import cv2 as cv
img = np.zeros([200, 300, 3], np.uint8)
img[:, :, 2] = np.zeros([200, 300])+ 255
#方法一:原基础上修改
#左上蓝色
img[:20, :20, 2] = np.zeros([20, 20])-255
img[:20, :20, 0] = np.zeros([20, 20])+255
#右上绿色
img[:20, 280:, 2] = np.zeros([20, 20])-255
img[:20, 280:, 1] = np.zeros([20, 20])+255
#左下白色
img[180:, :20, 0] = np.zeros([20, 20])+255
img[180:, :20, 1] = np.zeros([20, 20])+255
#右下黑色
img[180:, 280:, 2] = np.zeros([20, 20])-255
#方法二:直接赋值
#左上蓝色
img[:20, :20] = [255, 0, 0]
#右上绿色
img[:20, 280:] = [0, 255, 0]
#左下白色
img[180:, :20] = [255, 255, 255]
#右下黑色
img[180:, 280:] = [0, 0, 0]
print(img.shape)
cv.imshow("iamge", img)
cv.waitKey()
cv.destoryAllWindows()
输出图片形状为:
这道题需要注意的是,我们所熟知的RGB图像的三个通道分别是r,g,b,但在实际的代码处理中,对各个通道进行赋值,参数的顺序却是**(b,g,r)**。
3.从代码中明白理解卷积的计算原理。我们可以通过如下题目来理解,用numpy实现如下需求:
其实这就是一个矩阵运算的题目,该矩阵运算过程就是卷积的计算原理。该题目实现代码如下:
import numpy as np
a = np.random.randint(1, 5, (4, 2, 3, 3))
#print("4 images:\n",a)
b = np.random.randint(1, 5, (5, 2, 3, 3))
#print("5 maxtrixes:\n",b)
c = np.zeros([4, 5])
#for循环依次计算
for m in range(0,a.shape[0]):#最终行标
for n in range(0,b.shape[0]):#最终列标
for k in range(0,a.shape[1]):#通道数
for i in range(0,a.shape[2]):#行标
for j in range(0,a.shape[3]):#列标
c[m, n] += a[m, k][i, j] * b[n, k][i, j]
print(c)
但上述方法略显有些笨拙,下面是一种简单做法:
import numpy as np
imgs = np.random.randint(1,5,[4,3,3,2])
variables = np.random.randint(1,5,[5,3,3,2])
imgs = imgs.reshape([4,-1])
variables = variables.reshape([-1,5])
print(imgs.shape, variables.shape)
result = np.matmul(imgs, variables)
print(result.shape)
相对于for循环的做法,该方法直接将张量拉伸成一个一维向量。也就是两个矩阵相乘,对应位置拉伸了过后是一样的,没必要for循环把自己搞得头晕。
按要求计算结果如下:(由于随机初始化,所以每次运行结果不同)
为了方便验证,可以将a[0,0],b[0,0],a[0,1],b[0,1]打印出来,对应位置相乘后并相加,可得到结果中的c[0,0]值。