网站关键词优化服务,网站推广费用大概需要多少钱,2345影视大全是免费追剧吗,wordpress整站源码带数据目录
前言
一、前期工作
1.1 设置GPU
1.2 导入数据
输出
二、数据预处理
2.1 加载数据
2.2 再次检查数据
2.3 配置数据集
2.4 可视化数据
三、构建VGG-16网络
3.1 VGG-16网络介绍
3.2 搭建VGG-16模型
四、编译
五、训练模型
5.1 上次程序的主要Bug
5.2 修改版…
目录
前言
一、前期工作
1.1 设置GPU
1.2 导入数据
输出
二、数据预处理
2.1 加载数据
2.2 再次检查数据
2.3 配置数据集
2.4 可视化数据
三、构建VGG-16网络
3.1 VGG-16网络介绍
3.2 搭建VGG-16模型
四、编译
五、训练模型
5.1 上次程序的主要Bug
5.2 修改版如下
六、模型评估
七、预测
总结 前言 本文为[365天深度学习训练营](https://mp.weixin.qq.com/s/rnFa-IeY93EpjVu0yzzjkw) 中的学习记录博客 原作者[K同学啊](https://mtyjkh.blog.csdn.net/) 说在前面
1本周任务找到并处理第8周的程序问题拔高--尝试增加数据增强部分的内容以提高准确率
2运行环境Python3.6、Pycharm2020、tensorflow2.4.0 一、前期工作
1.1 设置GPU
代码如下
# 1.1 设置GPU
import tensorflow as tf
gpus tf.config.list_physical_devices(GPU)if gpus:tf.config.experimental.set_memory_growth(gpus[0], True) #设置GPU显存用量按需使用tf.config.set_visible_devices([gpus[0]],GPU)
# 打印显卡信息确认GPU可用
print(gpus) 输出[PhysicalDevice(name/physical_device:GPU:0, device_typeGPU)] 1.2 导入数据
代码如下
# 1.2 导入数据
import numpy as np
import matplotlib.pyplot as plt
# 支持中文
plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签
plt.rcParams[axes.unicode_minus] False # 用来正常显示负号
import os,PIL,pathlib#隐藏警告
import warnings
warnings.filterwarnings(ignore)
data_dir ./data
data_dir pathlib.Path(data_dir)
image_count len(list(data_dir.glob(*/*)))
print(图片总数为,image_count)
输出 图片总数为 3400 二、数据预处理
2.1 加载数据
使用image_dataset_from_directory方法将磁盘中的数据加载到tf.data.Datasettf.keras.preprocessing.image_dataset_from_directory()是 TensorFlow 的 Keras 模块中的一个函数用于从目录中创建一个图像数据集dataset。这个函数可以以更方便的方式加载图像数据用于训练和评估神经网络模型
测试集与验证集的关系
验证集并没有参与训练过程梯度下降过程的狭义上来讲是没有参与模型的参数训练更新的。但是广义上来讲验证集存在的意义确实参与了一个“人工调参”的过程我们根据每一个epoch训练之后模型在valid data上的表现来决定是否需要训练进行early stop或者根据这个过程模型的性能变化来调整模型的超参数如学习率batch_size等等。因此我们也可以认为验证集也参与了训练但是并没有使得模型去overfit验证集因此我们也可以认为验证集也参与了训练但是并没有使得模型去overfit验证集
代码如下
# 二、数据预处理
# 2.1 加载数据
batch_size 64
img_height 224
img_width 224
train_ds tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split0.2,subsettraining,seed12,image_size(img_height, img_width),batch_sizebatch_size)
val_ds tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split0.2,subsetvalidation,seed12,image_size(img_height, img_width),batch_sizebatch_size)
class_names train_ds.class_names
print(class_names) 输出如下 Found 3400 files belonging to 2 classes. Using 2720 files for training. Found 3400 files belonging to 2 classes. Using 680 files for validation. [cat, dog] 2.2 再次检查数据
代码如下
# 2.2 再次检查数据
for image_batch, labels_batch in train_ds:print(image_batch.shape)print(labels_batch.shape)break 输出 (64, 224, 224, 3) (64,) 2.3 配置数据集
代码如下
# 2.3 配置数据集
AUTOTUNE tf.data.AUTOTUNE
def preprocess_image(image,label):return (image/255.0,label)
# 归一化处理
train_ds train_ds.map(preprocess_image, num_parallel_callsAUTOTUNE)
val_ds val_ds.map(preprocess_image, num_parallel_callsAUTOTUNE)
train_ds train_ds.cache().shuffle(1000).prefetch(buffer_sizeAUTOTUNE)
val_ds val_ds.cache().prefetch(buffer_sizeAUTOTUNE)2.4 可视化数据
代码如下
# 2.4 可视化数据
plt.figure(figsize(15, 10)) # 图形的宽为15高为10
for images, labels in train_ds.take(1):for i in range(8):ax plt.subplot(5, 8, i 1)plt.imshow(images[i])plt.title(class_names[labels[i]])plt.axis(off) 输出 三、构建VGG-16网络
3.1 VGG-16网络介绍
结构说明
13个卷积层Convolutional Layer分别用blockX_convX表示3个全连接层Fully connected Layer分别用fcX与predictions表示5个池化层Pool layer分别用blockX_pool表示
VGG优缺点分析
VGG优点VGG的结构非常简洁整个网络都使用了同样大小的卷积核尺寸3x3和最大池化尺寸2x2。VGG缺点1)训练时间过长调参难度大。2)需要的存储容量大不利于部署。例如存储VGG-16权重值文件的大小为500多MB不利于安装到嵌入式系统中。
网络结构图如下包含了16个隐藏层--13个卷积层和3个全连接层故称为VGG-16
3.2 搭建VGG-16模型
代码如下
# 三、构建VGG-16网络
from tensorflow.keras import layers, models, Input
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Flatten, Dropoutdef VGG16(nb_classes, input_shape):input_tensor Input(shapeinput_shape)# 1st blockx Conv2D(64, (3,3), activationrelu, paddingsame,nameblock1_conv1)(input_tensor)x Conv2D(64, (3,3), activationrelu, paddingsame,nameblock1_conv2)(x)x MaxPooling2D((2,2), strides(2,2), name block1_pool)(x)# 2nd blockx Conv2D(128, (3,3), activationrelu, paddingsame,nameblock2_conv1)(x)x Conv2D(128, (3,3), activationrelu, paddingsame,nameblock2_conv2)(x)x MaxPooling2D((2,2), strides(2,2), name block2_pool)(x)# 3rd blockx Conv2D(256, (3,3), activationrelu, paddingsame,nameblock3_conv1)(x)x Conv2D(256, (3,3), activationrelu, paddingsame,nameblock3_conv2)(x)x Conv2D(256, (3,3), activationrelu, paddingsame,nameblock3_conv3)(x)x MaxPooling2D((2,2), strides(2,2), name block3_pool)(x)# 4th blockx Conv2D(512, (3,3), activationrelu, paddingsame,nameblock4_conv1)(x)x Conv2D(512, (3,3), activationrelu, paddingsame,nameblock4_conv2)(x)x Conv2D(512, (3,3), activationrelu, paddingsame,nameblock4_conv3)(x)x MaxPooling2D((2,2), strides(2,2), name block4_pool)(x)# 5th blockx Conv2D(512, (3,3), activationrelu, paddingsame,nameblock5_conv1)(x)x Conv2D(512, (3,3), activationrelu, paddingsame,nameblock5_conv2)(x)x Conv2D(512, (3,3), activationrelu, paddingsame,nameblock5_conv3)(x)x MaxPooling2D((2,2), strides(2,2), name block5_pool)(x)# full connectionx Flatten()(x)x Dense(4096, activationrelu, namefc1)(x)x Dense(4096, activationrelu, namefc2)(x)output_tensor Dense(nb_classes, activationsoftmax, namepredictions)(x)model Model(input_tensor, output_tensor)return model
modelVGG16(1000, (img_width, img_height, 3))
model.summary()
四、编译
代码如下
model.compile(optimizeradam,losssparse_categorical_crossentropy,metrics[accuracy])
五、训练模型
5.1 上次程序的主要Bug
训练中的主要问题为acc、loss等的更新计算方式
修改前将每训练1个batch之后的损失和准确率直接记录进history_train/val_loss和history_train/val_accuracy当中最后记录的只是整个epoch中最后1个batch所得的损失和准确率而不是整个epoch中训练数据的平均值
# 记录训练数据方便后面的分析
history_train_loss []
history_train_accuracy []
history_val_loss []
history_val_accuracy []
for epoch in range(epochs):train_total len(train_ds)val_total len(val_ds)with tqdm(totaltrain_total, descfEpoch {epoch 1}/{epochs}, mininterval1, ncols100) as pbar:lr lr * 0.92K.set_value(model.optimizer.lr, lr)for image, label in train_ds:history model.train_on_batch(image, label)train_loss history[0]train_accuracy history[1]pbar.set_postfix({loss: %.4f % train_loss,accuracy: %.4f % train_accuracy,lr: K.get_value(model.optimizer.lr)})pbar.update(1)history_train_loss.append(train_loss)history_train_accuracy.append(train_accuracy)print(开始验证)with tqdm(totalval_total, descfEpoch {epoch 1}/{epochs}, mininterval0.3, ncols100) as pbar:for image, label in val_ds:history model.test_on_batch(image, label)val_loss history[0]val_accuracy history[1]pbar.set_postfix({loss: %.4f % val_loss,accuracy: %.4f % val_accuracy})pbar.update(1)history_val_loss.append(val_loss)history_val_accuracy.append(val_accuracy)print(结束验证)print(验证loss为%.4f % val_loss)print(验证准确率为%.4f % val_accuracy)
5.2 修改版如下
修改后 每次处理一个 batch后将该 batch 的损失和准确率保存在loss和accuracy列表中。计算1个epoch中所有batch的训练损失和准确率的平均值并将均值记录到history_train/val_loss或history_train/val_accuracy中。能够更准确地反映整个训练集和验证集上的表现。
代码如下
# 五、训练模型
from tqdm import tqdm
import tensorflow.keras.backend as K
epochs 10
lr 1e-4
# 记录训练数据方便后面的分析
history_train_loss []
history_train_accuracy []
history_val_loss []
history_val_accuracy []
for epoch in range(epochs):train_total len(train_ds)val_total len(val_ds)total预期的迭代数目ncols控制进度条宽度mininterval进度更新最小间隔以秒为单位默认值0.1with tqdm(totaltrain_total, descfEpoch {epoch 1}/{epochs}, mininterval1, ncols100) as pbar:lr lr * 0.92K.set_value(model.optimizer.lr, lr)train_loss []train_accuracy []for image, label in train_ds:# 这里生成的是每一个batch的acc与losshistory model.train_on_batch(image, label)train_loss.append(history[0])train_accuracy.append(history[1])pbar.set_postfix({train_loss: %.4f % history[0],train_acc: %.4f % history[1],lr: K.get_value(model.optimizer.lr)})pbar.update(1)history_train_loss.append(np.mean(train_loss))history_train_accuracy.append(np.mean(train_accuracy))print(开始验证)with tqdm(totalval_total, descfEpoch {epoch 1}/{epochs}, mininterval0.3, ncols100) as pbar:val_loss []val_accuracy []for image, label in val_ds:# 这里生成的是每一个batch的acc与losshistory model.test_on_batch(image, label)val_loss.append(history[0])val_accuracy.append(history[1])pbar.set_postfix({val_loss: %.4f % history[0],val_acc: %.4f % history[1]})pbar.update(1)history_val_loss.append(np.mean(val_loss))history_val_accuracy.append(np.mean(val_accuracy))print(结束验证)print(验证loss为%.4f % np.mean(val_loss))print(验证准确率为%.4f % np.mean(val_accuracy)) 打印训练过程 六、模型评估
代码如下
# 六、模型评估
from datetime import datetime
current_time datetime.now() # 获取当前时间
epochs_range range(epochs)
plt.figure(figsize(14, 4))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, history_train_accuracy, labelTraining Accuracy)
plt.plot(epochs_range, history_val_accuracy, labelValidation Accuracy)
plt.legend(loclower right)
plt.title(Training and Validation Accuracy)
plt.xlabel(current_time) # 打卡请带上时间戳否则代码截图无效
plt.subplot(1, 2, 2)
plt.plot(epochs_range, history_train_loss, labelTraining Loss)
plt.plot(epochs_range, history_val_loss, labelValidation Loss)
plt.legend(locupper right)
plt.title(Training and Validation Loss)
plt.show()
训练结果可视化如下
七、预测
代码如下
# 七、预测
# 采用加载的模型new_model来看预测结果
plt.figure(figsize(18, 3)) # 图形的宽为18高为5
plt.suptitle(预测结果展示)
for images, labels in val_ds.take(1):for i in range(8):ax plt.subplot(1, 8, i 1)# 显示图片plt.imshow(images[i].numpy())# 需要给图片增加一个维度img_array tf.expand_dims(images[i], 0)# 使用模型预测图片中的人物predictions model.predict(img_array)plt.title(class_names[np.argmax(predictions)])plt.axis(off)输出 1/1 [] - 0s 129ms/step 1/1 [] - 0s 19ms/step 1/1 [] - 0s 18ms/step 1/1 [] - 0s 18ms/step 1/1 [] - 0s 17ms/step 1/1 [] - 0s 18ms/step 1/1 [] - 0s 17ms/step 1/1 [] - 0s 17ms/step 总结
Tensorflow训练过程中打印多余信息的处理并且引入了进度条的显示方式更加方便及时查看模型训练过程中的情况可以及时打印各项指标发现了上次程序的Bug对于历次准确率和loss的保存逻辑下次继续探索采用不同数据增强方式来提高准确率的方法