最近在飞浆学习目标检测,教程先教了个检测黑白边界的案例。
w = np.array([1, 0, -1], dtype='float32')
w = w.reshape([1, 1, 1, 3])
img = np.ones([50,50], dtype='float32')
img[:, 30:] = 0.
x = img.reshape([1,1,50,50])
x = paddle.to_tensor(x)
这段代码先创建了一个二维数组,每行前30个数为1,后20个数为0,到这里都没问题。
但是在创建卷积算子并且开始做运算之后就报错,只输出了一段关于GPU和CUDA版本的信息
# 创建卷积算子,设置输入和输出通道数,卷积核大小,通过参数属性weight_attr用w初始化参数权重
conv = Conv2D(in_channels=1, out_channels=1, kernel_size=[1, 3],
weight_attr=paddle.ParamAttr(
initializer=Assign(value=w)))
y = conv(x)
out = y.numpy()
f = plt.subplot(121)
f.set_title('input image', fontsize=15)
plt.imshow(img, cmap='gray')
f = plt.subplot(122)
f.set_title('output featuremap', fontsize=15)plt.imshow(out.squeeze(), cmap='gray')
plt.show()
print(conv.weight)
print(conv.bias)
以下是完整代码
import matplotlib.pyplot as plt
import numpy as np
import paddle
from paddle.nn import Conv2D
from paddle.nn.initializer import Assign
# 假设白色区域像素值为1,黑色区域像素值为0。
# 创建初始化权重参数w,当且仅当卷积核处于黑白交界线上时,卷积计算的结果不为0,以此找出黑白交线
w = np.array([1, 0, -1], dtype='float32')
# 将权重参数调整成维度为[cout, cin, kh, kw]的卷积核形式
# 四个参数意思分别为输出图片的通道数,输入图片的通道数,卷积核的宽度,卷积核的长度
# 这里表示w被重塑为四维数组,其中一二三维度大小为1,四维度大小为3,w=[[[[ 1. 0. -1.]]]]
w = w.reshape([1, 1, 1, 3])
# 创建输入图片,图片左边的像素点取值为1,右边的像素点取值为0
img = np.ones([50,50], dtype='float32')
# 选取所有行的,第30列以及之后的元素,设置为0
img[:, 30:] = 0.
# 将图片形状调整为[N, C, H, W]的形式,N表示输入图片数量,C表示一张图片的通道数,HW表示图片的形状
x = img.reshape([1,1,50,50])
print(x)
# 将numpy.ndarray转化成paddle中的tensor,数据形式不变但支持在GPU上运行
x = paddle.to_tensor(x)
# 创建卷积算子,设置输入和输出通道数,卷积核大小,通过参数属性weight_attr用w初始化参数权重
conv = Conv2D(in_channels=1, out_channels=1, kernel_size=[1, 3],
weight_attr=paddle.ParamAttr(
initializer=Assign(value=w)))
# 使用卷积算子作用在输入图片上
y = conv(x)
# 将输出tensor转化为numpy.ndarray
out = y.numpy()
# print(out)
f = plt.subplot(121)
f.set_title('input image', fontsize=15)
plt.imshow(img, cmap='gray')
f = plt.subplot(122)
f.set_title('output featuremap', fontsize=15)
# 卷积算子Conv2D输出数据形状为[N, C, H, W]形式
# 此处N, C=1,输出数据形状为[1, 1, H, W],是4维数组
# 但是画图函数plt.imshow画灰度图时,只接受2维数组
# 通过numpy.squeeze函数将大小为1的维度消除
plt.imshow(out.squeeze(), cmap='gray')
plt.show()
# 查看卷积层的权重参数名字和数值
print(conv.weight)
# 参看卷积层的偏置参数名字和数值
print(conv.bias)