<>1. 实验目的

①掌握深度学习的基本原理;
②能够使用TensorFlow实现卷积神经网络,完成图像识别任务。

<>2. 实验内容

①设计卷积神经网络模型,实现对Mnist手写数字数据集的识别,并以可视化的形式输出模型训练的过程和结果;
②设计卷积神经网络模型,实现对Cifar10数据集的识别,并以可视化的形式输出模型训练的过程和结果。

<>3. 实验过程

<>题目一:

  使用Keras构建和训练卷积神经网络,实现对Mnist手写数字数据集的识别,并测试模型性能,以恰当的形式展现训练过程和结果。
要求:
  ⑴编写代码,构建卷积神经网络,实现上述功能。
  ⑵调整超参数,记录实验过程和结果。
调整卷积神经网络的结构和训练参数,找出最佳的结构和超参数,记录和分析实验结果;
  ⑶保存最佳模型,计算各层参数个数和模型总参数;
  ⑷分析和总结:
  你都调整了哪些参数?结合训练过程,说明各个超参数对模型性能的影响;
① 代码
import matplotlib.pyplot as plt import numpy as np import tensorflow as tf
import pandas as pd #加载数据集 mnist = tf.keras.datasets.mnist (train_x,train_y),(
test_x,test_y) = mnist.load_data()
#对属性进行归一化,使它的取值在0-1之间,同时转换为tensor张量,类型为tf.flost32 X_train = train_x.reshape(
60000,28,28,1) X_test = test_x.reshape(10000,28,28,1) X_train,X_test = tf.cast(
X_train/ 255.0,tf.float32),tf.cast(X_test / 255.0,tf.float32) y_train,y_test =
tf.cast(train_y,tf.int32),tf.cast(test_y,tf.int32) #建立模型 model = tf.keras.
Sequential([ #unit1 tf.keras.layers.Conv2D(16,kernel_size=(3,3),padding="same",
activation=tf.nn.relu,input_shape=(28,28,1)), tf.keras.layers.MaxPool2D(
pool_size=(2,2)), #unit2 tf.keras.layers.Conv2D(32,kernel_size=(3,3),padding=
"same",activation=tf.nn.relu), tf.keras.layers.MaxPool2D(pool_size=(2,2)),
#unit3 tf.keras.layers.Flatten(), #unit4 tf.keras.layers.Dense(128,activation=
"relu"), tf.keras.layers.Dense(10,activation="softmax") ]) #配置训练方法 model.compile
(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=[
'sparse_categorical_accuracy']) #训练模型 history = model.fit(X_train,y_train,
batch_size=64,epochs=5,validation_split=0.2) #评估模型 model.evaluate(X_test,y_test,
verbose=2) pd.DataFrame(history.history).to_csv("training_log.csv",index=False)
graph= pd.read_csv('training_log.csv') #使用模型 for i in range(10): num = np.random
.randint(1,10000) plt.subplot(2,5,i+1) plt.axis("off") plt.imshow(test_x[num],
cmap="gray") demo = tf.reshape(X_test[num],(1,28,28,1)) y_pred = np.argmax(model
.predict(demo)) plt.title("y="+ str(test_y[num])+"\ny_pred"+str(y_pred)) plt.
show()
② 结果记录

③ 实验总结
正确率98.88%,能够较好地预测实验结果。

<>题目二:

  使用Keras构建和训练卷积神经网络,实现对Cifar10数据集的识别,并测试模型性能,以恰当的形式展现训练过程和结果。
要求:
  ⑴编写代码,构建卷积神经网络,实现上述功能。
  ⑵调整超参数,记录实验过程和结果。
  调整卷积神经网络的结构和训练参数,找出最佳的结构和超参数,记录和分析实验结果;
  ⑶保存最佳模型,计算各层参数个数和模型总参数;
  ⑷分析和总结:
  你都调整了哪些参数?结合训练过程,说明各个超参数对模型性能的影响;
① 代码
import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' import tensorflow as tf
import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt
import tensorflow.keras.layers as ly plt.rcParams['font.family'] = "SimHei" plt.
rcParams["axes.unicode_minus"] = False #加载数据集 cifar10 = tf.keras.datasets.
cifar10(x_train,y_train),(x_test,y_test) = cifar10.load_data() #数据预处理 x_train,
x_test= tf.cast(x_train,tf.float32) / 255.0,tf.cast(x_test,tf.float32) / 255.0
y_train,y_test = tf.cast(y_train,tf.int32),tf.cast(y_test,tf.int32) #建立模型 model
= tf.keras.Sequential([ #特征提取 ly.Conv2D(16,kernel_size=(3,3),padding="same",
activation=tf.nn.relu,input_shape=x_train.shape[1:]), ly.Conv2D(16,kernel_size=(
3,3),padding="same",activation=tf.nn.relu), ly.MaxPool2D(pool_size=(2,2)), ly.
Dropout(0.2), ly.Conv2D(32,kernel_size=(3,3),padding="same",activation=tf.nn.
relu), ly.Conv2D(32,kernel_size=(3,3),padding="same",activation=tf.nn.relu), ly.
MaxPool2D(pool_size=(2,2)), ly.Dropout(0.2), #分类识别 ly.Flatten(), ly.Dropout(0.2)
, ly.Dense(128,activation="relu"), ly.Dropout(0.2), ly.Dense(10,activation=
"softmax") ]) #查看摘要 print(model.summary()) #配置训练方法 model.compile(optimizer=
'adam',loss='sparse_categorical_crossentropy',metrics=[
'sparse_categorical_accuracy']) #训练模型 h = model.fit(x_train,y_train,batch_size=
64,epochs=5,validation_split=0.2) #评估模型 print(model.evaluate(x_test,y_test,
verbose=2)) #结果可视化 print(h.history) loss = h.history['loss'] acc = h.history[
'sparse_categorical_accuracy'] val_loss = h.history['val_loss'] val_acc = h.
history['val_sparse_categorical_accuracy'] plt.figure(figsize=(10,3)) plt.
subplot(121) plt.plot(loss,color = 'b',label = "train") plt.plot(val_loss,color
= 'r',label = 'test') plt.ylabel('loss') plt.legend() plt.subplot(122) plt.plot(
acc,color = 'b',label = "train") plt.plot(val_acc,color = 'r',label = 'test')
plt.ylabel('Accuracy') plt.legend() #预测数据 plt.figure() for i in range(10): num =
np.random.randint(1,10000) plt.subplot(2,5,i+1) plt.axis("off") plt.imshow(
x_test[num],cmap="gray") demo = tf.reshape(x_test[num],(1,32,32,3)) y_pred = np.
argmax(model.predict(demo)) plt.title("标签值"+str((y_test.numpy())[num,0])+'\n预测值'
+str(y_pred)) plt.show() model.save("CIFAR10_CNN_weigts.h5") model.load_weights(
"CIFAR10_CNN_weights.h5")
② 结果记录

③ 实验总结

<>4. 实验小结&讨论题

①和全连接网络相比,卷积神经网络有什么特点?卷积层和池化层的主要作用什么?是否卷积层和池化层的数量越多,模型的效果就越好?卷积核的大小对卷积神经网络性能有何影响?
卷积层:提取特征。“不全连接,参数共享”的特点大大降低了网络参数,保证了网络的稀疏性,防止过拟合。之所以可以“参数共享”,是因为样本存在局部相关的特性。

池化层:有MaxPool和AveragePool等。其中MaxPool应用广泛。因为经过MaxPool可以减小卷积核的尺寸,同时又可以保留相应特征,所以主要用来降维。
全连接层:在全连接的过程中丢失位置信息,可以理解为降低了学习过程中的参数敏感度;很多分类问题需要通过softmax层进行输出;进行非线性变换等等。
②比较题目一和题目二,所使用的网络结构有什么异同?比请对二者进行比较并分析原因。
相同点:都使用了卷积层和池化层,激活函数;
不同点:#数据预处理不同,数据格式也不同。x_train,x_test = tf.cast(x_train,tf.float32)/255.0,
tf.cast(x_test,tf.float32)/255.0
③卷积神经网络的优化方式有哪些?在题目一和题目二中,你使用了哪些优化方式,优化的效果如何?请对实验结果进行对比和分析。
一般来说,提高泛化能力的方法主要有以下几个:
正则化
增加神经网络层数
使用正确的代价函数
④ 卷积神经网络中的超参数有哪些?结合题目一和题目二,说明它们对模型性能的影响。
每一层的卷积是的输出大小编程n-5+1,每卷积一次,宽高的维度就会减少4,使用更大的卷积层会更快的减少输出的大小,在输入的宽和高
周围加入额外的行/列,控制输出形状的减少量,填充Ph行和Pw列,输出形状为:(Nh-Kh+Ph+1)*(Nw-Kw+Pw+1),我们通常取Ph=Kh-1,Pw=Kw-1
这样保证了我们的输入和输出是一致的

技术
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:766591547
关注微信