酒店做网站,企业网站建设 cms,男做暧免费视频网站,怎建网站文章目录 前期工作1. 设置GPU#xff08;如果使用的是CPU可以忽略这步#xff09;我的环境#xff1a; 2. 导入数据3. 检查数据 二、数据预处理1. 加载数据2. 可视化数据3. 再次检查数据4. 配置数据集 三、构建CNN网络四、编译五、训练模型六、模型评估 前期工作
1. 设置GP… 文章目录 前期工作1. 设置GPU如果使用的是CPU可以忽略这步我的环境 2. 导入数据3. 检查数据 二、数据预处理1. 加载数据2. 可视化数据3. 再次检查数据4. 配置数据集 三、构建CNN网络四、编译五、训练模型六、模型评估 前期工作
1. 设置GPU如果使用的是CPU可以忽略这步
我的环境
语言环境Python3.6.5编译器jupyter notebook深度学习环境TensorFlow2.4.1
import tensorflow as tf
gpus tf.config.list_physical_devices(GPU)if gpus:gpu0 gpus[0] #如果有多个GPU仅使用第0个GPUtf.config.experimental.set_memory_growth(gpu0, True) #设置GPU显存用量按需使用tf.config.set_visible_devices([gpu0],GPU)2. 导入数据
import matplotlib.pyplot as plt
import numpy as np
import os
import PIL
import tensorflow as tffrom tensorflow import keras
from tensorflow.keras import layers,modelsimport pathlib
dataset_url https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgzdata_dir tf.keras.utils.get_file(fname flower_photos, # 下载到本地后的文件名称origin dataset_url, # 数据集(Dataset)的URL路径untar True, # 是否解压文件cache_dir DL-100-days)data_dir pathlib.Path(data_dir)
data_dirPosixPath(/tmp/.keras/datasets/flower_photos)3. 检查数据
image_count len(list(data_dir.glob(*/*.jpg)))print(图片总数为,image_count)roses list(data_dir.glob(roses/*))
PIL.Image.open(str(roses[1]))二、数据预处理
1. 加载数据
使用image_dataset_from_directory方法将磁盘中的数据加载到tf.data.Dataset中
batch_size 32
img_height 180
img_width 180train_ds tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split0.2,subsettraining,seed123,image_size(img_height, img_width),batch_sizebatch_size)Found 3670 files belonging to 5 classes.
Using 2936 files for training.val_ds tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split0.2,subsetvalidation,seed123,image_size(img_height, img_width),batch_sizebatch_size)Found 3670 files belonging to 5 classes.
Using 734 files for validation.我们可以通过class_names输出数据集的标签。标签将按字母顺序对应于目录名称。
class_names train_ds.class_names
print(class_names)[daisy, dandelion, roses, sunflowers, tulips]2. 可视化数据
plt.figure(figsize(20, 10))for images, labels in train_ds.take(1):for i in range(20):ax plt.subplot(5, 10, i 1)plt.imshow(images[i].numpy().astype(uint8))plt.title(class_names[labels[i]])plt.axis(off)3. 再次检查数据
for image_batch, labels_batch in train_ds:print(image_batch.shape)print(labels_batch.shape)break(32, 180, 180, 3)
(32,)Image_batch是形状的张量32,180,180,3。这是一批形状180x180x3的32张图片最后一维指的是彩色通道RGB。Label_batch是形状32的张量这些标签对应32张图片
4. 配置数据集
prefetch()功能详细介绍CPU 正在准备数据时加速器处于空闲状态。相反当加速器正在训练模型时CPU 处于空闲状态。因此训练所用的时间是 CPU 预处理时间和加速器训练时间的总和。prefetch()将训练步骤的预处理和模型执行过程重叠到一起。当加速器正在执行第 N 个训练步时CPU 正在准备第 N1 步的数据。这样做不仅可以最大限度地缩短训练的单步用时而不是总用时而且可以缩短提取和转换数据所需的时间。如果不使用prefetch()CPU 和 GPU/TPU 在大部分时间都处于空闲状态 使用prefetch()可显著减少空闲时间 cache()将数据集缓存到内存当中加速运行
AUTOTUNE tf.data.AUTOTUNEtrain_ds train_ds.cache().shuffle(1000).prefetch(buffer_sizeAUTOTUNE)
val_ds val_ds.cache().prefetch(buffer_sizeAUTOTUNE)三、构建CNN网络
卷积神经网络CNN的输入是张量 (Tensor) 形式的 (image_height, image_width, color_channels)包含了图像高度、宽度及颜色信息。不需要输入batch size。color_channels 为 (R,G,B) 分别对应 RGB 的三个颜色通道color channel。在此示例中我们的 CNN 输入fashion_mnist 数据集中的图片形状是 (28, 28, 1)即灰度图像。我们需要在声明第一层时将形状赋值给参数input_shape。
num_classes 5model models.Sequential([layers.experimental.preprocessing.Rescaling(1./255, input_shape(img_height, img_width, 3)),layers.Conv2D(16, (3, 3), activationrelu, input_shape(img_height, img_width, 3)), # 卷积层1卷积核3*3layers.MaxPooling2D((2, 2)), # 池化层12*2采样layers.Conv2D(32, (3, 3), activationrelu), # 卷积层2卷积核3*3layers.MaxPooling2D((2, 2)), # 池化层22*2采样layers.Conv2D(64, (3, 3), activationrelu), # 卷积层3卷积核3*3layers.Flatten(), # Flatten层连接卷积层与全连接层layers.Dense(128, activationrelu), # 全连接层特征进一步提取layers.Dense(num_classes) # 输出层输出预期结果
])model.summary() # 打印网络结构Model: sequential_1
_________________________________________________________________
Layer (type) Output Shape Param # rescaling_1 (Rescaling) (None, 180, 180, 3) 0
_________________________________________________________________
conv2d_3 (Conv2D) (None, 178, 178, 16) 448
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 89, 89, 16) 0
_________________________________________________________________
conv2d_4 (Conv2D) (None, 87, 87, 32) 4640
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 43, 43, 32) 0
_________________________________________________________________
conv2d_5 (Conv2D) (None, 41, 41, 64) 18496
_________________________________________________________________
flatten_1 (Flatten) (None, 107584) 0
_________________________________________________________________
dense_2 (Dense) (None, 128) 13770880
_________________________________________________________________
dense_3 (Dense) (None, 5) 645 Total params: 13,795,109
Trainable params: 13,795,109
Non-trainable params: 0
_________________________________________________________________四、编译
在准备对模型进行训练之前还需要再对其进行一些设置。以下内容是在模型的编译步骤中添加的
损失函数loss用于测量模型在训练期间的准确率。优化器optimizer决定模型如何根据其看到的数据和自身的损失函数进行更新。指标metrics用于监控训练和测试步骤。以下示例使用了准确率即被正确分类的图像的比率。
model.compile(optimizeradam,losstf.keras.losses.SparseCategoricalCrossentropy(from_logitsTrue),metrics[accuracy])五、训练模型
history model.fit(train_ds,validation_dataval_ds,epochs10
)Epoch 1/10
92/92 [] - 9s 29ms/step - loss: 1.7851 - accuracy: 0.3435 - val_loss: 1.0564 - val_accuracy: 0.5640
Epoch 2/10
92/92 [] - 1s 11ms/step - loss: 1.0037 - accuracy: 0.5867 - val_loss: 1.0490 - val_accuracy: 0.5708
Epoch 3/10
92/92 [] - 1s 11ms/step - loss: 0.8206 - accuracy: 0.6746 - val_loss: 0.9763 - val_accuracy: 0.6158
Epoch 4/10
92/92 [] - 1s 12ms/step - loss: 0.6061 - accuracy: 0.7864 - val_loss: 0.9745 - val_accuracy: 0.6158
Epoch 5/10
92/92 [] - 1s 12ms/step - loss: 0.3319 - accuracy: 0.8929 - val_loss: 1.2550 - val_accuracy: 0.6076
Epoch 6/10
92/92 [] - 1s 11ms/step - loss: 0.1607 - accuracy: 0.9473 - val_loss: 1.4897 - val_accuracy: 0.6172
Epoch 7/10
92/92 [] - 1s 11ms/step - loss: 0.0864 - accuracy: 0.9757 - val_loss: 1.5388 - val_accuracy: 0.6226
Epoch 8/10
92/92 [] - 1s 12ms/step - loss: 0.0621 - accuracy: 0.9818 - val_loss: 2.0122 - val_accuracy: 0.6008
Epoch 9/10
92/92 [] - 1s 11ms/step - loss: 0.0390 - accuracy: 0.9893 - val_loss: 1.9353 - val_accuracy: 0.6267
Epoch 10/10
92/92 [] - 1s 11ms/step - loss: 0.0061 - accuracy: 0.9995 - val_loss: 2.1597 - val_accuracy: 0.6335六、模型评估
plt.plot(history.history[accuracy], labelaccuracy)
plt.plot(history.history[val_accuracy], label val_accuracy)
plt.xlabel(Epoch)
plt.ylabel(Accuracy)
plt.ylim([0.5, 1])
plt.legend(loclower right)
plt.show()test_loss, test_acc model.evaluate(val_ds, verbose2)从上面可以看出随着迭代次数的增加训练准确率与验证准确率之间的差距逐步增加这是由于过拟合导致.
print(验证准确率为,test_acc)验证准确率为 0.6035422086715698
[0.5, 1])
plt.legend(loclower right)
plt.show()test_loss, test_acc model.evaluate(val_ds, verbose2)[外链图片转存中…(img-fF61lXFP-1700232748127)]
从上面可以看出随着迭代次数的增加训练准确率与验证准确率之间的差距逐步增加这是由于过拟合导致.
print(验证准确率为,test_acc)验证准确率为 0.6035422086715698