网站注册系统怎么做,东莞做网站首选企业铭,河北君卓展览装饰有限公司,青海省高等级公路建设管局网站文章目录 整体流程数据加载与预处理搭建网络模型优化网络模型学习率Drop-out操作权重初始化方法对比正则化加载模型进行测试 实战#xff1a;利用Keras框架搭建神经网络模型实现基本图像分类识别#xff0c;使用自己的数据集进行训练测试。 问#xff1a;为什么选择Keras利用Keras框架搭建神经网络模型实现基本图像分类识别使用自己的数据集进行训练测试。 问为什么选择Keras 答使用Keras便捷快速。用起来简单入门容易上手快。没有tensorflow那么复杂的规范。 整体流程
读取数据数据预处理切分数据集分为训练集和测试集搭建网络模型初始化参数训练网络模型评估测试模型通过对比不同参数下损失函数不断优化模型保存模型到本地
1手动配置参数设置数据存储路径、模型保存路径、图片保存路径
# 输入参数手动设置数据存储路径、模型保存路径、图片保存路径等
ap argparse.ArgumentParser()
ap.add_argument(-d, --dataset, requiredTrue,helppath to input dataset of images)
ap.add_argument(-m, --model, requiredTrue,helppath to output trained model)
ap.add_argument(-l, --label-bin, requiredTrue,helppath to output label binarizer)
ap.add_argument(-p, --plot, requiredTrue,helppath to output accuracy/loss plot)
args vars(ap.parse_args())数据加载与预处理
# 拿到图像数据路径方便后续读取
imagePaths sorted(list(utils_paths.list_images(args[dataset])))
random.seed(42)
random.shuffle(imagePaths)
# 数据洗牌前设置随机种子确保后面调参过程中训练数据集一样# 遍历读取数据
for imagePath in imagePaths:# 读取图像数据由于使用神经网络需要输入数据给定成一维image cv2.imread(imagePath)# 而最初获取的图像数据是三维的则需要将三维数据进行拉长image cv2.resize(image, (32, 32)).flatten()data.append(image)# 读取标签通过读取数据存储位置文件夹来判断图片标签label imagePath.split(os.path.sep)[-2]labels.append(label)# scale图像数据归一化
data np.array(data, dtypefloat) / 255.0
labels np.array(labels)# 转换标签one-hot格式
lb LabelBinarizer()
trainY lb.fit_transform(trainY)
testY lb.transform(testY)数据预处理①通过数据除以255进行数据归一化②对数据标签进行格式转换。
搭建网络模型
创建序列结构
model Sequential()添加全连接层
第一层全连接层Dense设计512个神经元当前输入特征个数输入神经元个数为3072设置激活函数为relu第二层设计256个神经元第三层设计类别数个神经元即3个并作softmax操作得到最终分类类别。
# 第一层
model.add(Dense(512, input_shape(3072,),activationrelu))
# 第二层
model.add(Dense(256, activationrelu,))
# 第三层
model.add(Dense(len(lb.classes_), activationsoftmax,))初始化参数
# 学习率
INIT_LR 0.01
# 迭代次数
EPOCHS 200训练网络模型
# 给定损失函数和评估方法
opt SGD(lrINIT_LR) # 指定优化器为梯度下降的优化器
model.compile(losscategorical_crossentropy, optimizeropt,metrics[accuracy])# 训练网络模型
H model.fit(trainX, trainY, validation_data(testX, testY),epochsEPOCHS, batch_size32)测试网络模型
使用上面训练所得网络模型对测试集进行预测并对比预测解国和数据集真实结果打印结果报告包括准确率、recall、f1-score并将损失函数以折线图的效果直观展示出来
predictions model.predict(testX, batch_size32)
print(classification_report(testY.argmax(axis1),predictions.argmax(axis1), target_nameslb.classes_))评估结果 从损失函数图像中可看出模型出现明显过拟合现象故而该初始参数所构建的模型效果较差需要通过调参优化模型。
优化网络模型
学习率
对比学习率为0.01和0.001的损失函数图像。 train_loss与val_loss之间差异仍然存在但是可看出学习率越大过拟合现象越明显。
Drop-out操作
Dropout操作在搭建网络模型中通过设置一0到1范围内的参数从而防止过拟合。
权重初始化方法对比
1RandomNormal随机高斯初始化
kernel_initializer initializers.random_normal(mean0.0,stddev0.05)model.add(Dense(512, input_shape(3072,),activationrelu,kernel_initializer initializers.random_normal(mean0.0,stddev0.05)))
model.add(Dense(256, activationrelu,kernel_initializer initializers.random_normal(mean0.0,stddev0.05)))
model.add(Dense(len(lb.classes_), activationsoftmax,kernel_initializer initializers.random_normal(mean0.0,stddev0.05)))图中可看出添加RandomNormal初始化后过拟合现象减弱了一丢丢。
2TruncatedNormal截断
kernel_initializer initializers.TruncatedNormal(mean0.0, stddev0.05, seedNone)相比于正常高斯分布截断了两边只取小于2倍stddev的值
model.add(Dense(512, input_shape(3072,), activationrelu ,kernel_initializer initializers.TruncatedNormal(mean0.0, stddev0.05)))
model.add(Dense(256, activationrelu,kernel_initializer initializers.TruncatedNormal(mean0.0, stddev0.05)))
model.add(Dense(len(lb.classes_), activationsoftmax,kernel_initializer initializers.TruncatedNormal(mean0.0, stddev0.05)))对比stddev取不同值时的loss函数图可得TruncatedNormal中stddev值越小过拟合风险越低模型效果越好。TruncatedNormal消除过拟合的效果RandomNormal好。
正则化
kernel_regularizerregularizers.l2(0.01)正则化后损失函数loss 初始loss aR(W)。正则化惩罚W让稳定的W减少过拟合。
model.add(Dense(512, input_shape(3072,), activationrelu ,kernel_initializer initializers.TruncatedNormal(mean0.0, stddev0.05, seedNone),kernel_regularizerregularizers.l2(0.01)))
model.add(Dense(256, activationrelu,kernel_initializer initializers.TruncatedNormal(mean0.0, stddev0.05, seedNone),kernel_regularizerregularizers.l2(0.01)))
model.add(Dense(len(lb.classes_), activationsoftmax,kernel_initializer initializers.TruncatedNormal(mean0.0, stddev0.05, seedNone),kernel_regularizerregularizers.l2(0.01)))对比正则化前后取迭代150到200的loss波动图可发现正则化后虽然开始时loss值较大但后期过拟合现象有明显减弱 再对比正则化参数l2 0.01和0.05的结果可得l2越大W的惩罚力度越大过拟合风险越小
加载模型进行测试
# 导入所需工具包
from keras.models import load_model
import argparse
import pickle
import cv2# 设置输入参数
ap argparse.ArgumentParser()
ap.add_argument(-i, --image, requiredTrue,helppath to input image we are going to classify)
ap.add_argument(-m, --model, requiredTrue,helppath to trained Keras model)
ap.add_argument(-l, --label-bin, requiredTrue,helppath to label binarizer)
ap.add_argument(-w, --width, typeint, default28,helptarget spatial dimension width)
ap.add_argument(-e, --height, typeint, default28,helptarget spatial dimension height)
ap.add_argument(-f, --flatten, typeint, default-1,helpwhether or not we should flatten the image)
args vars(ap.parse_args())# 加载测试数据并进行相同预处理操作
image cv2.imread(args[image])
output image.copy()
image cv2.resize(image, (args[width], args[height]))# scale the pixel values to [0, 1]
image image.astype(float) / 255.0# 对图像进行拉平操作
image image.flatten()
image image.reshape((1, image.shape[0]))# 读取模型和标签
print([INFO] loading network and label binarizer...)
model load_model(args[model])
lb pickle.loads(open(args[label_bin], rb).read())# 预测
preds model.predict(image)# 得到预测结果以及其对应的标签
i preds.argmax(axis1)[0]
label lb.classes_[i]# 在图像中把结果画出来
text {}: {:.2f}%.format(label, preds[0][i] * 100)
cv2.putText(output, text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7,(0, 0, 255), 2)# 绘图
cv2.imshow(Image, output)
cv2.waitKey(0)分类结果 通过预测结果可得该模型在预测猫上存在较大误差在预测熊猫上较为准确。或许改进增加迭代次数可进一步优化模型。