网站首页 > 技术文章 正文
引言
在本文中,我们将尝试使用 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对卷积神经网络有了一个较为深入的了解,希望可以对你的学习带来帮助~
- 上一篇: 使用2D卷积技术进行时间序列预测
- 下一篇: 居然有免费的GPU可以跑深度学习代码
猜你喜欢
- 2024-11-23 太强了,竟然可以根据指纹图像预测性别
- 2024-11-23 深度残差网络+自适应参数化ReLU(调参记录24)Cifar10~95.80%
- 2024-11-23 从零开始构建:使用CNN和TensorFlow进行人脸特征检测
- 2024-11-23 每个ML从业人员都必须知道的10个TensorFlow技巧
- 2024-11-23 基于OpencvCV的情绪检测
- 2024-11-23 LeNet-5 一个应用于图像分类问题的卷积神经网络
- 2024-11-23 使用TensorBoard进行超参数优化
- 2024-11-23 如何实现CNN特征层可视化?终于懂了....
- 2024-11-23 计算卷积神经网络参数总数和输出形状
- 2024-11-23 使用卷积神经网络和 Python 进行图像分类
- 1508℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 520℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 490℃MySQL service启动脚本浅析(r12笔记第59天)
- 469℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 467℃启用MySQL查询缓存(mysql8.0查询缓存)
- 447℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 427℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 424℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)