免费软件库合集软件资料网站渭南市住房和城乡建设局网站
免费软件库合集软件资料网站,渭南市住房和城乡建设局网站,专业建设质量报告,南宁seo怎么做优化团队本文博主将用Python代码简单演示卷积操作的过程#xff0c;让你直观理解卷积是如何工作的。
1. 手动实现简单的2D卷积
import numpy as npdef manual_conv2d(image, kernel):手动实现简单的2D卷积#xff08;无填充#xff0c;步长为1#xff09;参数:im…本文博主将用Python代码简单演示卷积操作的过程让你直观理解卷积是如何工作的。1. 手动实现简单的2D卷积importnumpyasnpdefmanual_conv2d(image,kernel): 手动实现简单的2D卷积无填充步长为1 参数: image: 输入图像2D numpy数组 kernel: 卷积核/滤波器2D numpy数组 返回: 卷积结果 # 获取图像和卷积核的尺寸img_height,img_widthimage.shape kernel_height,kernel_widthkernel.shape# 计算输出特征图的尺寸output_heightimg_height-kernel_height1output_widthimg_width-kernel_width1# 初始化输出特征图outputnp.zeros((output_height,output_width))# 滑动窗口进行卷积操作foriinrange(output_height):forjinrange(output_width):# 提取当前窗口windowimage[i:ikernel_height,j:jkernel_width]# 计算点积并求和output[i,j]np.sum(window*kernel)returnoutput# 创建一个简单的6x6图像数字边缘检测示例imagenp.array([[0,0,0,0,0,0],[0,1,1,1,1,0],[0,1,2,2,1,0],[0,1,2,2,1,0],[0,1,1,1,1,0],[0,0,0,0,0,0]])print(原始图像:)print(image)print()# 定义一个垂直边缘检测卷积核vertical_kernelnp.array([[1,0,-1],[1,0,-1],[1,0,-1]])# 定义一个水平边缘检测卷积核horizontal_kernelnp.array([[1,1,1],[0,0,0],[-1,-1,-1]])# 定义一个锐化卷积核sharpen_kernelnp.array([[0,-1,0],[-1,5,-1],[0,-1,0]])# 执行卷积vertical_edgesmanual_conv2d(image,vertical_kernel)horizontal_edgesmanual_conv2d(image,horizontal_kernel)sharpenedmanual_conv2d(image,sharpen_kernel)print(垂直边缘检测卷积核:)print(vertical_kernel)print(垂直边缘检测结果:)print(vertical_edges)print()print(水平边缘检测卷积核:)print(horizontal_kernel)print(水平边缘检测结果:)print(horizontal_edges)print()print(锐化卷积核:)print(sharpen_kernel)print(锐化结果:)print(sharpened)2. 使用NumPy的高级函数实现卷积importnumpyasnpimportmatplotlib.pyplotaspltdefvisualize_convolution():可视化卷积操作过程# 创建一个8x8的图像中间有个矩形imagenp.zeros((8,8))image[2:6,2:6]1# 创建一个4x4的白色矩形# 定义一个边缘检测卷积核edge_kernelnp.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])# 使用NumPy的convolve2d需要scipytry:fromscipyimportsignal# 执行卷积convolvedsignal.convolve2d(image,edge_kernel,modevalid)print(原始图像 (8x8):)print(image)print(\n边缘检测卷积核 (3x3):)print(edge_kernel)print(\n卷积结果 (6x6):)print(convolved)# 可视化fig,axesplt.subplots(1,3,figsize(12,4))# 原始图像axes[0].imshow(image,cmapgray,interpolationnearest)axes[0].set_title(原始图像)axes[0].axis(off)# 卷积核axes[1].imshow(edge_kernel,cmapgray,interpolationnearest)axes[1].set_title(卷积核)axes[1].axis(off)# 卷积结果axes[2].imshow(convolved,cmapgray,interpolationnearest)axes[2].set_title(卷积结果)axes[2].axis(off)plt.tight_layout()plt.show()exceptImportError:print(需要安装scipy: pip install scipy)# 如果scipy不可用使用手动实现print(\n使用手动实现:)resultmanual_conv2d(image,edge_kernel)print(卷积结果:)print(result)# 运行可视化visualize_convolution()3. 实现带步长和填充的卷积defconv2d_with_params(image,kernel,stride1,padding0): 支持步长和填充的卷积实现 参数: image: 输入图像 kernel: 卷积核 stride: 步长 padding: 填充大小 返回: 卷积结果 # 如果padding0给图像添加填充ifpadding0:imagenp.pad(image,((padding,padding),(padding,padding)),modeconstant,constant_values0)img_height,img_widthimage.shape kernel_height,kernel_widthkernel.shape# 计算输出尺寸output_height(img_height-kernel_height)//stride1output_width(img_width-kernel_width)//stride1outputnp.zeros((output_height,output_width))# 滑动窗口考虑步长foriinrange(0,output_height):forjinrange(0,output_width):# 计算窗口起始位置start_ii*stride start_jj*stride end_istart_ikernel_height end_jstart_jkernel_width# 提取窗口windowimage[start_i:end_i,start_j:end_j]# 卷积操作output[i,j]np.sum(window*kernel)returnoutput# 测试带参数的卷积print( 测试不同参数的卷积 )# 创建一个小图像test_imagenp.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])test_kernelnp.array([[1,0],[0,-1]])print(原始图像:)print(test_image)print(\n卷积核:)print(test_kernel)# 测试不同步长result_stride1conv2d_with_params(test_image,test_kernel,stride1)print(f\n步长1的结果 (3x3):)print(result_stride1)result_stride2conv2d_with_params(test_image,test_kernel,stride2)print(f\n步长2的结果 (2x2):)print(result_stride2)# 测试带填充result_padding1conv2d_with_params(test_image,test_kernel,stride1,padding1)print(f\n步长1, 填充1的结果 (5x5):)print(result_padding1)4. 使用PyTorch实现卷积更接近真实深度学习场景importtorchimporttorch.nnasnnimporttorch.nn.functionalasFdefpytorch_convolution():使用PyTorch演示卷积print( PyTorch卷积演示 )# 创建一个批次的图像 (batch_size2, channels1, height5, width5)# 在PyTorch中图像格式为[批大小, 通道数, 高度, 宽度]batch_imagestorch.tensor([# 第一张图像[[[1,1,1,0,0],[0,1,1,1,0],[0,0,1,1,1],[0,0,1,1,0],[0,1,1,0,0]]],# 第二张图像[[[0,0,0,0,0],[0,1,1,0,0],[0,1,1,0,0],[0,0,0,0,0],[0,0,0,0,0]]]],dtypetorch.float32)print(f输入图像形状:{batch_images.shape})print(f第一张图像:\n{batch_images[0,0]})# 创建卷积层# 参数: 输入通道数, 输出通道数, 卷积核大小conv_layernn.Conv2d(in_channels1,out_channels2,kernel_size3,stride1,padding1,biasFalse)# 手动设置卷积核权重为了演示清晰# 第一个卷积核边缘检测conv_layer.weight.data[0,0]torch.tensor([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]],dtypetorch.float32)/9.0# 第二个卷积核模糊/平滑conv_layer.weight.data[1,0]torch.tensor([[1,1,1],[1,1,1],[1,1,1]],dtypetorch.float32)/9.0print(f\n卷积层权重形状:{conv_layer.weight.shape})print(f第一个卷积核:\n{conv_layer.weight[0,0]})print(f第二个卷积核:\n{conv_layer.weight[1,0]})# 执行卷积outputconv_layer(batch_images)print(f\n卷积输出形状:{output.shape})print(f第一张图像的输出 - 特征图1 (边缘检测):\n{output[0,0].detach().numpy().round(3)})print(f第一张图像的输出 - 特征图2 (平滑):\n{output[0,1].detach().numpy().round(3)})# 也可以使用F.conv2d函数式APIoutput_funcF.conv2d(batch_images,conv_layer.weight,stride1,padding1)print(f\n使用F.conv2d的结果与nn.Conv2d是否一致:{torch.allclose(output,output_func)})returnoutput# 运行PyTorch示例try:outputpytorch_convolution()exceptExceptionase:print(f需要安装PyTorch: pip install torch)print(f错误:{e})5. 可视化卷积滑动过程defvisualize_sliding_window():可视化卷积滑动窗口的过程# 创建一个小图像imgnp.array([[1,2,3],[4,5,6],[7,8,9]])kernelnp.array([[1,0],[0,-1]])print(图像:)print(img)print(\n卷积核:)print(kernel)print(\n--- 卷积过程 ---)output_heightimg.shape[0]-kernel.shape[0]1output_widthimg.shape[1]-kernel.shape[1]1resultnp.zeros((output_height,output_width))foriinrange(output_height):forjinrange(output_width):windowimg[i:i2,j:j2]conv_valuenp.sum(window*kernel)result[i,j]conv_valueprint(f\n位置 ({i},{j}):)print(f窗口:\n{window})print(f窗口 × 卷积核:)print(f{window}×{kernel}{window*kernel})print(f求和:{conv_value})print(f\n最终卷积结果:)print(result)returnresult# 运行滑动窗口可视化print( 详细滑动过程演示 )visualize_sliding_window()运行说明核心操作卷积的本质就是在输入图像上滑动一个窗口卷积核计算窗口与卷积核的对应元素乘积之和。关键公式对于位置(i, j)的输出是output[i, j] Σ_m Σ_n image[im, jn] * kernel[m, n]其中 m, n 是卷积核的索引。参数影响步长控制滑动窗口的移动距离填充在图像边缘添加像素控制输出尺寸卷积核不同的卷积核提取不同的特征边缘、纹理等深度学习中的卷积实际使用的是3D卷积处理多通道图像通常有多个卷积核每个生成一个特征图包含可学习的参数权重这个演示展示了卷积从最基本的手动实现到深度学习框架中使用的完整过程。