龙空技术网

在5分钟内建立你自己的卷积神经网络

林小婵的店 342

前言:

现在兄弟们对“卷积神经网络设计”可能比较关心,同学们都想要剖析一些“卷积神经网络设计”的相关内容。那么小编也在网摘上收集了一些有关“卷积神经网络设计””的相关知识,希望姐妹们能喜欢,同学们快快来学习一下吧!

什么是卷积神经网络?

CNN

卷积神经网络类似于多层感知器网络。主要区别在于网络学习什么,它们是如何构建的以及它们主要用于什么目的。卷积神经网络也受到生物过程的启发,它们的结构具有动物中存在的视觉皮层的外表。CNN在很大程度上应用于计算机视觉领域,并且在各种测试案例中取得了最高水平的性能。

隐藏层学什么?

CNN中的隐藏层通常是卷积和汇集(下采样)层。在每个卷积图层中,我们采用一个小尺寸的滤波器并将该滤波器移动到图像上并执行卷积运算。卷积运算不过是滤波器值和图像中的像素之间的逐元矩阵乘法,并且对结果值求和。

卷积运算

滤波器的值通过训练的迭代过程进行调整,并且在神经网络已经训练了一定数量的时期后,这些滤波器开始寻找图像中的各种特征。以卷积神经网络为例进行人脸检测。网络的早期层次寻找简单的特征,例如不同方向的边缘等。当我们在网络中前进时,层开始检测更复杂的特征,并且当您查看最后层检测到的特征时,它们看起来就像一张脸。

在不同层次识别不同的特征

现在,让我们继续讨论池层。池层用于向下采样图像。图像将包含许多像素值,如果图像的大小逐渐减少,网络就很容易学习这些特性。池层有助于减少所需的参数数量,从而减少所需的计算量。池也有助于避免过度拟合。有两种类型的池操作可以完成:

最大池——选择最大值

平均池——将所有值相加并除以总数值。

很少使用平均池,您可以在大多数示例中找到使用最大池。

最大池

Python代码

在我们开始编码之前,我想让你知道我们要使用的数据集是MNIST数字数据集,我们将使用带有Tensorflow后端的Keras库来构建模型。

import keras

from keras.datasets import mnist

from keras.models import Sequential

from keras.layers import Dense, Dropout, Flatten

from keras.layers import Conv2D, MaxPooling2D

import numpy as np

首先,让我们做一些必要的库。keras库帮助我们构建我们的卷积神经网络。我们通过keras下载mnist数据集。我们导入一个序列模型,它是一个预先构建的keras模型,您可以在其中添加层。我们导入卷积和池化层。我们还导入dense 层,因为它们被用来预测标签。Dropout层减少了过度拟合,而Flatten层将三维矢量扩展为一维矢量。最后,我们导入numpy用于矩阵操作。

batch_size = 128

num_classes = 10

epochs = 12

# input image dimensions

img_rows, img_cols = 28, 28

# the data, split between train and test sets

(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = x_train.reshape(60000,28,28,1)

x_test = x_test.reshape(10000,28,28,1)

print('x_train shape:', x_train.shape)

print(x_train.shape[0], 'train samples')

print(x_test.shape[0], 'test samples')

# convert class vectors to binary class matrices

y_train = keras.utils.to_categorical(y_train, num_classes)

y_test = keras.utils.to_categorical(y_test, num_classes)

我们重构x_train和x_test,因为我们的CNN只接受一个四维向量。值60000表示训练数据中图像的数量,28表示图像大小,1表示通道数。如果图像是灰度的,则通道数设置为1,如果图像是RGB格式,则通道数设置为3。我们还将我们的目标值转换为二进制类矩阵。要知道二进制类矩阵是什么样子,请看下面的例子。

Y = 2 # the value 2 represents that the image has digit 2

Y = [0,0,1,0,0,0,0,0,0,0] # The 2nd position in the vector is made 1

# Here, the class value is converted into a binary class matrix

model = Sequential()

model.add(Conv2D(32, kernel_size=(3, 3),

activation='relu',

input_shape=(28,28,1)))

model.add(Conv2D(64, (3, 3), activation='relu'))

model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Dropout(0.25))

model.add(Flatten())

model.add(Dense(128, activation='relu'))

model.add(Dropout(0.5))

model.add(Dense(num_classes, activation='softmax'))

我们构建了一个Sequential模型,并添加了卷积层和最大值池。我们还在中间添加了中途Dropout层,在网络中随机关闭一些神经元,这些神经元会强迫数据寻找新的路径。因此,这将减少过度拟合。我们在最后添加了密集层,用于类预测(0-9)。

model.compile(loss=keras.losses.categorical_crossentropy,

optimizer=keras.optimizers.Adadelta(),

metrics=['accuracy'])

model.fit(x_train, y_train,

batch_size=batch_size,

epochs=epochs,

verbose=1,

validation_data=(x_test, y_test))

score = model.evaluate(x_test, y_test, verbose=0)

print('Test loss:', score[0])

print('Test accuracy:', score[1])

我们现在用一个分类交叉熵损失函数,Adadelta优化器和一个精度度量来编译模型。然后我们将数据集匹配到模型i。我们训练12个epochs的模型。在对模型进行训练后,我们对模型在测试数据上的损失和准确性进行了评估,并将其打印出来。

Output

标签: #卷积神经网络设计