计算机系统应用教程网站

网站首页 > 技术文章 正文

通过 Python 中的 Keras 示例了解 CNN 基础知识

btikc 2024-10-22 10:29:32 技术文章 12 ℃ 0 评论

引言

在本文中,我们将尝试使用 Keras 框架实现基本的 CNN 模型。卷积神经网络的好处在于它通过保留最大信息来减少或最小化图像的维度和参数,从而使训练过程变得更快并占用更少的计算能力。让我们开始吧!

我们必须导入与 Keras 关联的某些库来实现 CNN 模型。

#basic libraries
import matplotlib.pyplot as plt
from numpy import asarray
import numpy as np
import pandas as pd
import cv2 as cv
#importing Keras libraries
import keras
from keras.models import Sequential
from keras.layers import Dense, Conv2D , MaxPool2D , Activation
#colab don't support cv2.imshow method, so importing cv2_imshow
from google.colab.patches import cv2_imshow 
#for image pre-processing
from skimage import io

我们在卷积神经网络模型中看到卷积层,有时人们会问你在模型中使用了多少层。现在,我们将看到用于制作一层 CNN 模型的组件。

步骤1: 从数据集获取输入图像。这取决于图像是 RGB 格式还是灰度格式。RGB 格式的尺寸是(n*n*3) ,灰度尺寸是(n*n) 。

步骤2: 在步骤一之后,下一步是使用维度为(m*m)的过滤器或内核。我们可以使用过滤器的数量来确定来自输入图像的不同信息。

步骤3: 这一步是通过对输入图像使用过滤器来获得维度 ( a*a ) 的 2D 图像。如果我们使用“Y”数量的过滤器,那么我们的输出具有“Y”数量的 2D 图像,即 ( a*a*Y )。

用于制作一层CNN模型的基本术语是过滤器、步幅、填充和图像的通道数。

· 过滤器:这些用于与图像相乘以获得 2D 图像。

· 步幅:它是一个过滤器或内核的移动距离,单位是像素。

· 填充:它是输入图像周围“零”值像素的额外维度,以保留最大信息。

· 通道:如果输入图像是 RGB,则它是“3”通道图像,如果输入图像是灰 度图像,则它是“1”通道图像。

#Getting an input from the website with mentioned URL below
urls = ["https://placekitten.com/800/571"]
#reading the image
image = io.imread(url)
#converting image from BGR to RGB
image_2 = cv.cvtColor(image, cv.COLOR_BGR2RGB)
#converting RGB to grayscale image
gray_image = cv.cvtColor(image_2, cv.COLOR_RGB2GRAY)
#display the image
cv2_imshow(gray_image)

查看输入图像的尺寸

gray_image.shape
#output: (571, 800)

众所周知,模型的输入图像是正方形的,以使过滤器正常工作。所以,我们需要调整输入图像的大小。

width = 512
height = 512
dim = (width, height)
# resize image
img = cv2.resize(gray_image, dim, interpolation = cv2.INTER_AREA)
img.shape
#output: (512, 512)

当我们将图像提供给 keras 时,它需要处于完美的维度,以便 keras 中的进程能够完美地工作。

img_batch = img.reshape(1, img.shape[0], img.shape[1], 1)
img_batch.shape
#output: (1, 512, 512, 1)

第一个参数是作为批处理的图像的数量,最后一个参数是1,这意味着它是一个灰度图像。

现在,我们将创建没有激活函数和池化层的卷积神经网络模型。权重将由模型本身随机选择。

model1 = Sequential()
model1.add(Conv2D(1, (15,15), padding= 'valid', input_shape =
img_batch.shape[1:]))
model1.summary()

在这里,我们使用的默认步长值是“1”,填充值是“ valid”,这意味着我们没有提供任何填充。第一个 Conv2D 层的第一个参数是“1”,这是我们使用的过滤器的数量,第二个参数是过滤器的大小,这里的过滤器的维数是(15*15)。

CNN 模型的第一层的总结如上所示。使用过滤器后的输出形状为(498*498*1) ,可训练参数为226。

使用或不使用过滤器、填充和步幅后获得输出形状的公式如下所示:

output shape= (input shape+2* padding — filter size)/stride + 1
output shape = (512 + 2*0 - 15)/1 +1 = 498
#the params we get 
params = number of filters*(filter size) + number of filters*1
params = 1*(15*15) +1*1 = 226

所以,这 226 个是将在反向传播过程中训练的参数。现在,我们将在我们的模型上使用预测方法。

conv_img = model1.predict(img_batch)

在使用我们的模型1之后,我们会看到输出图像。

conv_img_show = conv_img.reshape(conv_img.shape[1],
                                 conv_img.shape[2])
plt.imshow(conv_img_show, cmap = 'gray')
plt.show()

正如我们在上面的输出图像中看到的,尺寸是(498*498)。

现在,我们将看到使用激活函数即 relu 和最大池层后的输出图像。

model2 = Sequential()
model2.add(Conv2D(1, (15,15), padding= 'valid', input_shape = img_batch.shape[1:]))
model2.add(Activation('relu'))
model2.add(MaxPool2D(pool_size=(2,2)))
model2.summary()
conv_img = model2.predict(img_batch)
conv_img_show = conv_img.reshape(conv_img.shape[1], conv_img.shape[2])
plt.imshow(conv_img_show, cmap = 'gray')
plt.show()

如上所示,这正是一层卷积神经网络模型。由于最大池化操作,输出图像尺寸变小。

总结

在本文中,我们通过keras对卷积神经网络有了一个较为深入的了解,希望可以对你的学习带来帮助~

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表