西安做网站哪家便宜,建设工程合同补充协议范本,wordpress 订阅,电商网站销售数据分析文章目录 一、准备环境和数据1.环境2. 数据 二、数据增强#xff08;增加数据集中样本的多样性#xff09;三、将增强后的数据添加到模型中四、开始训练五、自定义增强函数六、一些增强函数 #x1f368; 本文为#x1f517;365天深度学习训练营 中的学习记录博客#x1f… 文章目录 一、准备环境和数据1.环境2. 数据 二、数据增强增加数据集中样本的多样性三、将增强后的数据添加到模型中四、开始训练五、自定义增强函数六、一些增强函数 本文为365天深度学习训练营 中的学习记录博客 参考文章365天深度学习训练营-第10周数据增强训练营内部成员可读 原作者K同学啊 | 接辅导、项目定制 文章来源K同学的学习圈子 本文说明了两种数据增强方式以及如何自定义数据增强方式并将其放到我们代码当中两种数据增强方式如下 ● 将数据增强模块嵌入model中 ● 在Dataset数据集中进行数据增强
常用的tf增强函数在文末有说明
一、准备环境和数据
1.环境
import matplotlib.pyplot as plt
import numpy as np
import sys
from datetime import datetime
#隐藏警告
import warnings
warnings.filterwarnings(ignore)from tensorflow.keras import layers
import tensorflow as tfprint(--------# 使用环境说明---------)
print(Today: , datetime.today())
print(Python: sys.version)
print(Tensorflow: , tf.__version__)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)
else:print(Use CPU)2. 数据
使用上一课的数据集即猫狗识别2的数据集。其次原数据集中不包括测试集所以使用tf.data.experimental.cardinality确定验证集中有多少批次的数据然后将其中的 20% 移至测试集。
# 从本地路径读入图像数据
print(--------# 从本地路径读入图像数据---------)
data_dir D:/jupyter notebook/DL-100-days/datasets/CatsDogs Data2/
img_height 224
img_width 224
batch_size 32# 划分训练集
print(--------# 划分训练集---------)
train_ds tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split0.3,subsettraining,seed12,image_size(img_height, img_width),batch_sizebatch_size)# 划分验证集
print(--------# 划分验证集---------)
val_ds tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split0.3,subsetvalidation,seed12,image_size(img_height, img_width),batch_sizebatch_size)# 从验证集中划20%的数据用作测试集
print(--------# 从验证集中划20%的数据用作测试集---------)
val_batches tf.data.experimental.cardinality(val_ds)
test_ds val_ds.take(val_batches // 5)
val_ds val_ds.skip(val_batches // 5)print(验证集的批次数: %d % tf.data.experimental.cardinality(val_ds))
print(测试集的批次数: %d % tf.data.experimental.cardinality(test_ds))# 显示数据类别
print(--------# 显示数据类别---------)
class_names train_ds.class_names
print(class_names)print(--------# 归一化处理---------)
AUTOTUNE tf.data.AUTOTUNEdef 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)
test_ds test_ds.map(preprocess_image, num_parallel_callsAUTOTUNE)train_ds train_ds.cache().prefetch(buffer_sizeAUTOTUNE)
val_ds val_ds.cache().prefetch(buffer_sizeAUTOTUNE)# 数据可视化
print(--------# 数据可视化---------)
plt.figure(figsize(15, 10)) # 图形的宽为15高为10for 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)二、数据增强增加数据集中样本的多样性
数据增强的常用方法包括但不限于随机平移、随机翻转、随机旋转、随机亮度、随机对比度可以在Tf中文网的experimental/preprocessing类目下查看也可以在Tf中文网的layers/类目下查看。
本文使用随机翻转和随机旋转来进行增强
● tf.keras.layers.experimental.preprocessing.RandomFlip水平和垂直随机翻转每个图像
● tf.keras.layers.experimental.preprocessing.RandomRotation随机旋转每个图像
# 第一个层表示进行随机的水平和垂直翻转而第二个层表示按照 0.2 的弧度值进行随机旋转。
print(--------# 数据增强随机翻转随机旋转---------)
data_augmentation tf.keras.Sequential([tf.keras.layers.experimental.preprocessing.RandomFlip(horizontal_and_vertical),tf.keras.layers.experimental.preprocessing.RandomRotation(0.2),
])# Add the image to a batch.
print(--------# 添加图像到batch中---------)
# Q这个i从哪来的
image tf.expand_dims(images[i], 0)print(--------# 显示增强后的图像---------)
plt.figure(figsize(8, 8))
for i in range(9):augmented_image data_augmentation(image)ax plt.subplot(3, 3, i 1)plt.imshow(augmented_image[0])plt.axis(off)--------# 数据增强随机翻转随机旋转---------
--------# 添加图像到batch中---------
--------# 显示增强后的图像---------
WARNING:tensorflow:Using a while_loop for converting RngReadAndSkip cause there is no registered converter for this op.
WARNING:tensorflow:Using a while_loop for converting Bitcast cause there is no registered converter for this op.三、将增强后的数据添加到模型中
两种方式
1将其嵌入model中
优点是
● 数据增强这块的工作可以得到GPU的加速如果使用了GPU训练的话
注意只有在模型训练时Model.fit才会进行增强在模型评估(Model.evaluate)以及预测(Model.predict)时并不会进行增强操作。 model tf.keras.Sequential([data_augmentation,layers.Conv2D(16, 3, paddingsame, activationrelu),layers.MaxPooling2D(),
])\nmodel tf.keras.Sequential([\n data_augmentation,\n layers.Conv2D(16, 3, paddingsame, activationrelu),\n layers.MaxPooling2D(),\n])\n2在Dataset数据集中进行数据增强
batch_size 32
AUTOTUNE tf.data.AUTOTUNEdef prepare(ds):ds ds.map(lambda x, y: (data_augmentation(x, trainingTrue), y), num_parallel_callsAUTOTUNE)return dsprint(--------# 增强后的图像加到模型中---------)
train_ds prepare(train_ds)四、开始训练
# 设置模型
print(--------# 设置模型---------)
model tf.keras.Sequential([layers.Conv2D(16, 3, paddingsame, activationrelu),layers.MaxPooling2D(),layers.Conv2D(32, 3, paddingsame, activationrelu),layers.MaxPooling2D(),layers.Conv2D(64, 3, paddingsame, activationrelu),layers.MaxPooling2D(),layers.Flatten(),layers.Dense(128, activationrelu),layers.Dense(len(class_names))
])# 设置编译参数
# ● 损失函数loss用于衡量模型在训练期间的准确率。
# ● 优化器optimizer决定模型如何根据其看到的数据和自身的损失函数进行更新。
# ● 评价函数metrics用于监控训练和测试步骤。以下示例使用了准确率即被正确分类的图像的比率。
print(--------# 设置编译器参数---------)
model.compile(optimizeradam,losstf.keras.losses.SparseCategoricalCrossentropy(from_logitsTrue),metrics[accuracy])print(--------# 开始训练---------)
epochs20
history model.fit(train_ds,validation_dataval_ds,epochsepochs
)print(--------# 查看训练结果---------)
loss, acc model.evaluate(test_ds)
print(Accuracy, acc)五、自定义增强函数
print(--------# 自定义增强函数---------)
import random
# 这是大家可以自由发挥的一个地方
def aug_img(image):seed (random.randint(0,9), 0)# 随机改变图像对比度stateless_random_brightness tf.image.stateless_random_contrast(image, lower0.1, upper1.0, seedseed)return stateless_random_brightnessimage tf.expand_dims(images[3]*255, 0)
print(Min and max pixel values:, image.numpy().min(), image.numpy().max())plt.figure(figsize(8, 8))
for i in range(9):augmented_image aug_img(image)ax plt.subplot(3, 3, i 1)plt.imshow(augmented_image[0].numpy().astype(uint8))plt.axis(off)# Q: 将自定义增强函数应用到我们数据上呢
# 请参考上文的 preprocess_image 函数将 aug_img 函数嵌入到 preprocess_image 函数中在数据预处理时完成数据增强就OK啦。# 从本地路径读入图像数据
print(--------# 从本地路径读入图像数据---------)
data_dir D:/jupyter notebook/DL-100-days/datasets/CatsDogs Data2/
img_height 224
img_width 224
batch_size 32# 划分训练集
print(--------# 划分训练集---------)
train_ds tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split0.3,subsettraining,seed12,image_size(img_height, img_width),batch_sizebatch_size)# 划分验证集
print(--------# 划分验证集---------)
val_ds tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split0.3,subsetvalidation,seed12,image_size(img_height, img_width),batch_sizebatch_size)# 从验证集中划20%的数据用作测试集
print(--------# 从验证集中划20%的数据用作测试集---------)
val_batches tf.data.experimental.cardinality(val_ds)
test_ds val_ds.take(val_batches // 5)
val_ds val_ds.skip(val_batches // 5)print(验证集的批次数: %d % tf.data.experimental.cardinality(val_ds))
print(测试集的批次数: %d % tf.data.experimental.cardinality(test_ds))# 显示数据类别
print(--------# 显示数据类别---------)
class_names train_ds.class_names
print(class_names)print(--------# 归一化处理---------)
AUTOTUNE tf.data.AUTOTUNEprint(--------# 将自定义增强函数应用到数据上---------)
def preprocess_image(aug_img,label):return (aug_img/255.0,label)# 归一化处理
train_ds train_ds.map(preprocess_image, num_parallel_callsAUTOTUNE)
val_ds val_ds.map(preprocess_image, num_parallel_callsAUTOTUNE)
test_ds test_ds.map(preprocess_image, num_parallel_callsAUTOTUNE)train_ds train_ds.cache().prefetch(buffer_sizeAUTOTUNE)
val_ds val_ds.cache().prefetch(buffer_sizeAUTOTUNE)# 数据可视化
print(--------# 数据可视化---------)
plt.figure(figsize(15, 10)) # 图形的宽为15高为10for 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)# 设置模型
print(--------# 设置模型---------)
model tf.keras.Sequential([layers.Conv2D(16, 3, paddingsame, activationrelu),layers.MaxPooling2D(),layers.Conv2D(32, 3, paddingsame, activationrelu),layers.MaxPooling2D(),layers.Conv2D(64, 3, paddingsame, activationrelu),layers.MaxPooling2D(),layers.Flatten(),layers.Dense(128, activationrelu),layers.Dense(len(class_names))
])# 设置编译参数
# ● 损失函数loss用于衡量模型在训练期间的准确率。
# ● 优化器optimizer决定模型如何根据其看到的数据和自身的损失函数进行更新。
# ● 评价函数metrics用于监控训练和测试步骤。以下示例使用了准确率即被正确分类的图像的比率。
print(--------# 设置编译器参数---------)
model.compile(optimizeradam,losstf.keras.losses.SparseCategoricalCrossentropy(from_logitsTrue),metrics[accuracy])print(--------# 开始训练---------)
epochs20
history model.fit(train_ds,validation_dataval_ds,epochsepochs
)print(--------# 查看训练结果---------)
loss, acc model.evaluate(test_ds)
print(Accuracy, acc)使用自定义增强函数增强后的数据重新训练的结果
六、一些增强函数 1随机亮度RandomBrightness
tf.keras.layers.RandomBrightness( factor, value_range(0, 255), seedNone, **kwargs )
2随机对比度RandomContrast
tf.keras.layers.RandomContrast( factor, seedNone, **kwargs )
3随机裁剪RandomCrop
tf.keras.layers.RandomCrop( height, width, seedNone, **kwargs )
4随机翻转RandomFlip
tf.keras.layers.RandomFlip( modeHORIZONTAL_AND_VERTICAL, seedNone, **kwargs ) 5随机高度RandomHeight和随机宽度RandomWidth
tf.keras.layers.RandomHeight( factor, interpolationbilinear, seedNone, **kwargs )
tf.keras.layers.RandomWidth( factor, interpolationbilinear, seedNone, **kwargs )
6随机平移RandomTranslation
tf.keras.layers.RandomTranslation( height_factor, width_factor, fill_modereflect, interpolationbilinear, seedNone, fill_value0.0, **kwargs )
7随机旋转RandonRotation
tf.keras.layers.RandomRotation( factor, fill_modereflect, interpolationbilinear, seedNone, fill_value0.0, **kwargs )
8随机缩放RandonZoom
tf.keras.layers.RandomZoom( height_factor, width_factorNone, fill_modereflect, interpolationbilinear, seedNone, fill_value0.0, **kwargs )