添加微信:kkcoder,备注:CV群,拉你入群,一起讨论。
Hello,我是kk~
咱们今天来聊聊CNN图像分类的问题。
很多同学在论文中,常常会遇到这个问题,今天从各方面进行解析,希望可以给到你一点思路~
首先,CNN 是一种用于图像分类、物体识别等计算机视觉任务的深度学习模型。在学术论文和工业界非常常见。
每天一个CV知识点,记得点赞、关注~
核心原理
CNN由多个卷积层(Convolutional Layer)、池化层(Pooling Layer)和全连接层(Fully Connected Layer)组成。它的基本原理是通过学习到的卷积核(filters)和池化操作来提取图像中的特征,然后将这些特征传递给全连接层进行分类。
卷积层:卷积操作是CNN中的核心操作之一。它通过滑动卷积核在输入图像上提取特征。卷积操作的数学表达为:
其中,
是输入图像,
是卷积核,
表示卷积操作。
池化层:池化操作用于减小特征图的尺寸,降低模型复杂度。常见的池化操作包括最大池化和平均池化。最大池化的数学表达为:
其中,
表示池化窗口内的最大值。
全连接层:全连接层将特征映射到输出类别。在全连接层中,每个神经元都与前一层的所有神经元相连。通常在全连接层后接一个 softmax 层用于分类。
核心公式
前向传播:CNN的前向传播过程包括卷积操作、激活函数和池化操作。其中,激活函数常用的是 ReLU 函数:
反向传播:CNN的反向传播过程用于更新模型参数。通过损失函数计算误差,然后利用梯度下降法更新参数。
核心代码案例
import numpy as npimport matplotlib.pyplot as plt# 定义卷积操作def convolution(image, kernel): m, n = kernel.shape if (m == n): y, x = image.shape y = y - m + 1 x = x - m + 1 new_image = np.zeros((y,x)) for i in range(y): for j in range(x): new_image[i][j] = np.sum(image[i:i+m, j:j+m]*kernel) return new_image# 定义ReLU激活函数def relu(x): return np.maximum(0, x)# 生成随机图像image = np.random.rand(10,10)plt.imshow(image, cmap='gray')plt.title('Original Image')plt.show()# 定义卷积核kernel = np.array([[1,0,-1],[1,0,-1],[1,0,-1]])# 进行卷积操作convolved_image = convolution(image, kernel)plt.imshow(convolved_image, cmap='gray')plt.title('Convolved Image')plt.show()# 进行ReLU激活activated_image = relu(convolved_image)plt.imshow(activated_image, cmap='gray')plt.title('Activated Image')plt.show()
这段代码是一个简单的卷积神经网络(CNN)的实现:
导入库:代码开始时导入了NumPy和Matplotlib库,用于数值计算和可视化。
定义卷积操作函数:convolution函数实现了基本的二维卷积操作。它接受一个输入图像和一个卷积核(kernel),然后在图像上滑动卷积核,计算卷积核与图像对应位置的乘积之和,得到卷积后的图像。
定义ReLU激活函数:relu函数实现了ReLU(Rectified Linear Unit)激活函数,它将输入值小于0的部分置为0,大于0的部分保持不变。
生成随机图像:使用np.random.rand生成了一个大小为10x10的随机灰度图像,并用Matplotlib显示出来。
定义卷积核:kernel是一个3x3的卷积核,用于在图像上执行卷积操作。
进行卷积操作:使用convolution函数对生成的随机图像进行卷积操作,得到卷积后的图像。
进行ReLU激活:对卷积后的图像应用ReLU激活函数,得到激活后的图像。
显示结果:使用Matplotlib分别显示原始图像、卷积后的图像和激活后的图像。
总体来说,这段代码展示了一个简单的卷积神经网络的基本流程,包括卷积操作和激活函数的应用。
每天一个CV知识点,记得点赞、关注吼~
推荐阅读
不愧是微软,巨深入
拼多多,目前薪资天花板
不愧是腾讯,边缘检测问的巨深入。。