Tensorflow:numpy基础实战,并从代码中明白卷积的计算原理

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]值。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力不秃头的小仙主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值