关于代码的实现环境在python3.8和Tensorflow2.3下完成,若介绍不周,希望指正。
以下部分我将从如何入门简单的图像分类,以及关于数据集导入部分和如何建立全连接的神经网络,做代码的一一拆分。
第一步:导入相关包
import tensorflow as tf
from sklearn import datasets
import numpy as np
from matplotlib import pyplot as plt
import os
os.environ['CUDA_VISIBLE_DEVICES']='2,3'
第二步:设置数据集中的训练集,并将数据打乱
x_train = datasets.load_iris().data
y_train = datasets.load_iris().target
np.random.seed(99)
np.random.shuffle(x_train)
np.random.seed(99)
np.random.shuffle(y_train)
tf.random.set_seed(99)
导入的数据集是从python的数据集包中自带的鸢尾花数据集,从sklearn中直接取得,不需要从网络中自行下载。其中,x_train表示训练集中输入特征,y_train表示训练集中的标签。seed函数表示随机种子,shuffle函数表示打乱数据,一般设置时需要数值相等,这样就可以使得,即使打乱数据,训练集中的特征和标签都能保持一致性。
第三步:搭建网络结构
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(3,activation='softmax',kernel_regularizer=tf.keras.regularizers.l2())
])
Dense表示全连接层,读者在做实验时可以多加几层,这里为了快速得到结果,所以只是设置了一层全连接。3:表示输出的类别,对应着数据集的分类个数。softmax:表示激活函数,这里的作用是将输出的数据进行概率分布,而不是原始输出。用的是L2正则化,科普:利用L2正则化可以解决数据集中因为噪声而引起的过拟合,使用该方法可以通过减小参数值的大小降低复杂度。
第四步:配置训练方法
model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.01),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=['sparse_categorical_accuracy'])
主要做的就是选择优化器,这里选用的是SGD,学习率lr=0.01。选择损失函数SparseCategoricalCrossentropy,需要设置from_logits=False,因为,之前的建立网络结构时定义输出为概率分布,若不加这句话可能会导致你输出结果五五开,当初小编也在这里搞不清楚,明明网络结构没出问题,结果却差的很远。
第五步:执行训练过程
EPOCHS = 500
hist = model.fit(x_train,
y_train,
batch_size=32,
epochs=EPOCHS,
validation_split=0.3,
validation_freq=50)
关于fit的模块,主要做的是,得到训练集和测试集的输入特征以及标签,设置每次喂入神经网络的个数即batch_size是多少,设置需要迭代多少次数据集即epoch,划分训练集和测试集,这里用的是validation_split,设置为0.3即30%的训练集的数据划为了测试集,因为刚开始导入的鸢尾花数据集只是得到了训练集,若无测试集,该代码等于无用,凡是做深度学习都离不开这两个部分。若读者觉得不够还可以进一步划分一个验证集来完善该程序。关于validation_freq函数,讲的是每隔着50次epoch使用测试集验证一次结果。
第六步:查看网络结构及参数
model.summary()
得出总共有15个参数,可以训练的参数个数也是15个。
第七步:作图
acc = hist.history['sparse_categorical_accuracy']
loss = hist.history['loss']
epochs_range = range(EPOCHS)
# 绘制Accuracy曲线
plt.title('Training Accuracy') # 图片标题
plt.xlabel('Epoch')
plt.ylabel('Acc')
plt.plot(epochs_range,acc, label="$Accuracy$")
plt.legend()
plt.show()
# 绘制loss曲线
plt.title('Training loss')
plt.xlabel('Epoch')
plt.ylabel('loss')
plt.plot(epochs_range,loss, label="$loss$")
plt.legend()
plt.show()
关于这段代码主要是可以将前面进行了500次epoch的数据通过matplotlib的方法展示出来,省去了那些看繁琐的数据的步骤,从图中可以清晰的看到哪些部分发生了问题,或者在程序运行的过程中是否出现了过拟合,欠拟合的问题。我训练后得到了如下结果。
上图中展示了训练的精度图,可以看到结果表现得在训练集中,反响还不错,虽然前期的精度图处于振荡状态,到训练的后期也处于了平稳中,接下来看测试集出现了什么情况,从如下的代码中即可查看该数据集在该神经网络中的真实情况。总之,千言万语看一遍,不如手把手自己操作一次,这样会使得印象更加的深刻。最后,祝各位学弟可以在计算机视觉中可以发挥异彩。
# 绘制测试集accuracy
plt.title('Test Accuracy')
plt.xlabel('测试次数')
plt.ylabel('Acc')
plt.plot(acc_test, label="$Test_Accuracy$")
plt.legend()
plt.show()
# 绘制测试集loss
plt.title('Test loss')
plt.xlabel('测试次数')
plt.ylabel('loss')
plt.plot(loss_test, label="$Test_loss$")
plt.legend()
plt.show()