问题遇到的现象和发生背景
神经网络与深度学习案例与实践邱锡鹏5.1.5使用卷积运算完成图像边缘检测任务原书代码在Windows中运行错误但在Ubuntu中可以运行
Windows中的运行结果:
操作环境、软件版本等信息
Windows11
pycharm
anaconda
python 3.9
paddle 2.2.2(cpu gpu两个版本都试了)
numpy 1.24.3或1.23.4
scikit-learn 1.2.2
matplotlib3.7.1
######
Ubuntu20.04
pycharm
anaconda
python 3.9
paddle 2.2.2 cpu版本
numpy 1.23.4
scikit-learn 1.2.2
matplotlib 3.7.1
源码:
import paddle
import paddle.nn as nn
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
class Conv2D(nn.Layer):
def __init__(self, kernel_size, stride=1, padding=0,
weight_attr=paddle.ParamAttr(initializer=nn.initializer.Constant(value=1.0))):
super(Conv2D, self).__init__()
self.weight = paddle.create_parameter(shape=[kernel_size, kernel_size],
dtype='float32',
attr=weight_attr)
# 步长
self.stride = stride
# 零填充
self.padding = padding
def forward(self, X):
# 零填充
new_X = paddle.zeros([X.shape[0], X.shape[1] + 2 * self.padding, X.shape[2] + 2 * self.padding])
new_X[:, self.padding:X.shape[1] + self.padding, self.padding:X.shape[2] + self.padding] = X
u, v = self.weight.shape
output_w = (new_X.shape[1] - u) // self.stride + 1
output_h = (new_X.shape[2] - v) // self.stride + 1
output = paddle.zeros([X.shape[0], output_w, output_h])
for i in range(0, output.shape[1]):
for j in range(0, output.shape[2]):
output[:, i, j] = paddle.sum(
new_X[:, self.stride * i:self.stride * i + u, self.stride * j:self.stride * j + v] * self.weight,
axis=[1, 2])
return output
# 读取图片
img = Image.open('./number.jpg').resize((256, 256))
plt.figure(figsize=(8, 4))
plt.imshow(img)
plt.show()
# 设置卷积核参数
w = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype='float32')
# 创建卷积算子,卷积核大小为3x3,并使用上面的设置好的数值作为卷积核权重的初始化参数
conv = Conv2D(kernel_size=3, stride=1, padding=0,
weight_attr=paddle.ParamAttr(initializer=nn.initializer.Assign(value=w)))
# 将读入的图片转化为float32类型的numpy.ndarray
inputs = np.array(img).astype('float32')
print("bf to_tensor, inputs:", inputs)
# 将图片转为Tensor
inputs = paddle.to_tensor(inputs)
print("bf unsqueeze, inputs:", inputs)
inputs = paddle.unsqueeze(inputs, axis=0)
print("af unsqueeze, inputs:", inputs)
outputs = conv(inputs)
# outputs = paddle.squeeze(outputs, axis=0)
outputs = outputs.numpy()
# 可视化结果
plt.figure(figsize=(8, 4))
f = plt.subplot(121)
f.set_title('input image', fontsize=15)
plt.imshow(img)
f = plt.subplot(122)
f.set_title('output feature map', fontsize=15)
plt.imshow(outputs.squeeze(), cmap='gray')
plt.savefig('conv-vis.pdf')
plt.show()
尝试过的解决方法
根据退出代码在网上找说是栈溢出,尝试过网上的方法没用,又试了不同版本的包也没用
我想要达到的结果
正常运行显示
Ubuntu虚拟机: