image.png

作业:建立CNN和BP网络,并针对给定的数据集研究其层数等参数对效果的影响

BP神经网络

BP(back propagation)神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛的神经网络。

BP网络是在输入层与输出层之间增加若干层(一层或多层)神经元,这些神经元称为隐单元,它们与外界没有直接的联系,但其状态的改变,则能影响输入与输出之间的关系,每一层可以有若干个节点。

BP网络能学习和存储大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。其主要的特点是:信号是正向传播的,而误差是反向传播的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#code 9.2 
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import Adam
import time
x_train = x_train.reshape(60000, 784) # (A)
x_train = x_train.astype('float32') # (B)
x_train = x_train / 255 # (C)
num_classes = 10
y_train = np_utils.to_categorical(y_train, num_classes) # (D)
x_test = x_test.reshape(10000, 784)
x_test = x_test.astype('float32')
x_test = x_test / 255
y_test = np_utils.to_categorical(y_test, num_classes)

np.random.seed(1) # (A1)
model = Sequential() # (B1)
model.add(Dense(16, input_dim=784, activation='sigmoid')) # (C1)
model.add(Dense(10, activation='softmax')) # (D1)
model.compile(loss='categorical_crossentropy',
optimizer=Adam(), metrics=['accuracy']) # (E1)
startTime = time.time()
history = model.fit(x_train, y_train, epochs=10, batch_size=1000,
verbose=1, validation_data=(x_test, y_test)) # (A2)
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:',(score[0]))
print('Test accuracy',(score[1]))
print("Computation time:{0:.3f} sec".format(time.time() - startTime))

运行以上 BP 神经网络 ,改动输入层神经元的个数,观察并记录指标变化,

如图所示,随着输入层神经元数量增加,从 8 增加16、32到 64,精度提高,损失降低,时间变长。实际单次运行时可能存在波动,需要采用多次平均值来观察输入层神经元的影响。

CNN网络

image.png
CNN(Convolutional Neural Network,卷积神经网络)是一种深度学习的算法,主要用于处理具有类似网格结构的数据,例如图像和语音信号。它通过使用卷积层、池化层和全连接层等组件来自动学习数据的特征表示。

卷积神经网络是一种在计算机视觉领域广泛应用的深度学习模型。与传统的神经网络相比,卷积神经网络具有特殊的结构设计和训练方法,使其在图像识别、目标检测、图像生成等任务上取得了显著的成果。

卷积层是CNN的核心组成部分之一,它通过在输入数据上滑动小窗口并计算窗口内数据的相关性来提取局部特征。这种局部连接的方式使得卷积层能够捕捉到图像中的边缘、纹理等重要信息,从而更好地理解图像的内容。此外,卷积层还具有平移不变性,即对输入数据进行平移操作后仍然保持相同的特征表示,这为后续网络的处理提供了方便。

池化层是CNN的另一个重要组件,用于减小特征图的空间尺寸并增加感受野的大小。通过将特征图中的像素值取最大或平均值等统计量作为输出,池化层可以有效地减少参数量和计算复杂度,同时保留重要的特征信息。常用的池化操作包括最大池化和平均池化,它们在保留全局信息的同时还能提供一定程度的降维效果。

全连接层将经过卷积层和池化层的非线性变换后的特征向量映射到一个固定长度的向量空间中。这个向量可以被解释为对输入数据的分类结果或特征表示。全连接层的权重矩阵是通过反向传播算法进行优化得到的,以最小化预测结果与真实标签之间的差异。

CNN作为一种强大的深度学习算法,通过其特有的卷积层、池化层和全连接层设计,能够自动地从大规模数据中学习到有效的特征表示,并在各种计算机视觉任务中取得了卓越的表现。随着硬件设备的发展和算法的不断改进,卷积神经网络在未来的应用前景仍然广阔。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
##code 9.10 
import numpy as np
np.random.seed(1)
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten

from keras.layers import Conv2D, MaxPooling2D
from keras.optimizers import Adam
import time
model = Sequential()
model.add(Conv2D(16, (3, 3),
input_shape=(28, 28, 1), activation='relu'))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2))) # (A)
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2))) # (B)
model.add(Dropout(0.25)) # (C)
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.25)) # (D)
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer=Adam(),
metrics=['accuracy'])
startTime = time.time()
history = model.fit(x_train, y_train, batch_size=1000, epochs=20,
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])
print("Computation time:{0:.3f} sec".format(time.time() - startTime))
show_prediction()
plt.show()

训练以上 CNN 神经网络 ,改动神经元的个数(注意维度的匹配),观察并记录指标变化:
当网络神经元个数依次为16-32-64-128 时,

1
2
3
Test loss: 0.019337937235832214 
Test accuracy: 0.9937000274658203
Computation time:402.730 sec

当网络神经元个数依次为8-16-16-16 时,

1
2
3
Test loss: 0.040607474744319916 
Test accuracy: 0.9869999885559082
Computation time:219.504 sec