白话文1讲---python开发的图像分类

关于代码的实现环境在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()
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值