第T10周:数据增强

article/2025/7/18 10:35:00
import matplotlib.pyplot as plt
import numpy as np
#隐藏警告
import warnings
warnings.filterwarnings('ignore')from tensorflow.keras import layers
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)
data_dir   = "./34-data/"
img_height = 224
img_width  = 224
batch_size = 32train_ds = tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split=0.3,subset="training",seed=12,image_size=(img_height, img_width),batch_size=batch_size)
Found 600 files belonging to 2 classes.
Using 420 files for training.
val_ds = tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split=0.3,subset="validation",seed=12,image_size=(img_height, img_width),batch_size=batch_size)
Found 600 files belonging to 2 classes.
Using 180 files for validation.
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('Number of validation batches: %d' % tf.data.experimental.cardinality(val_ds))
print('Number of test batches: %d' % tf.data.experimental.cardinality(test_ds))
Number of validation batches: 5
Number of test batches: 1
class_names = train_ds.class_names
print(class_names)

 

['cat', 'dog']
AUTOTUNE = tf.data.AUTOTUNEdef preprocess_image(image,label):return (image/255.0,label)# 归一化处理
train_ds = train_ds.map(preprocess_image, num_parallel_calls=AUTOTUNE)
val_ds   = val_ds.map(preprocess_image, num_parallel_calls=AUTOTUNE)
test_ds  = test_ds.map(preprocess_image, num_parallel_calls=AUTOTUNE)train_ds = train_ds.cache().prefetch(buffer_size=AUTOTUNE)
val_ds   = val_ds.cache().prefetch(buffer_size=AUTOTUNE)

 

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")

from tensorflow.keras import layers
from tensorflow.keras.models import Sequentialdata_augmentation = Sequential([layers.Rescaling(1./255),layers.RandomFlip("horizontal_and_vertical"),layers.RandomRotation(0.2),
])# Add the image to a batch.
image = tf.expand_dims(images[i], 0)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")

 

model = tf.keras.Sequential([data_augmentation,layers.Conv2D(16, 3, padding='same', activation='relu'),layers.MaxPooling2D(),
])model = tf.keras.Sequential([layers.Conv2D(16, 3, padding='same', activation='relu'),layers.MaxPooling2D(),layers.Conv2D(32, 3, padding='same', activation='relu'),layers.MaxPooling2D(),layers.Conv2D(64, 3, padding='same', activation='relu'),layers.MaxPooling2D(),layers.Flatten(),layers.Dense(128, activation='relu'),layers.Dense(len(class_names))
])model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])epochs=20
history = model.fit(train_ds,validation_data=val_ds,epochs=epochs
)
Epoch 1/20
14/14 ━━━━━━━━━━━━━━━━━━━━ 7s 221ms/step - accuracy: 0.5332 - loss: 1.4747 - val_accuracy: 0.6149 - val_loss: 0.6562
Epoch 2/20
14/14 ━━━━━━━━━━━━━━━━━━━━ 3s 186ms/step - accuracy: 0.7401 - loss: 0.6087 - val_accuracy: 0.8243 - val_loss: 0.4336
Epoch 3/20
14/14 ━━━━━━━━━━━━━━━━━━━━ 3s 189ms/step - accuracy: 0.8792 - loss: 0.3209 - val_accuracy: 0.8311 - val_loss: 0.4042
Epoch 4/20
14/14 ━━━━━━━━━━━━━━━━━━━━ 3s 185ms/step - accuracy: 0.9527 - loss: 0.1470 - val_accuracy: 0.8851 - val_loss: 0.2969
Epoch 5/20
14/14 ━━━━━━━━━━━━━━━━━━━━ 3s 183ms/step - accuracy: 0.9618 - loss: 0.0960 - val_accuracy: 0.8919 - val_loss: 0.2645
Epoch 6/20
14/14 ━━━━━━━━━━━━━━━━━━━━ 3s 177ms/step - accuracy: 0.9918 - loss: 0.0439 - val_accuracy: 0.8919 - val_loss: 0.2542
Epoch 7/20
14/14 ━━━━━━━━━━━━━━━━━━━━ 2s 177ms/step - accuracy: 1.0000 - loss: 0.0131 - val_accuracy: 0.8986 - val_loss: 0.3860
Epoch 8/20
14/14 ━━━━━━━━━━━━━━━━━━━━ 3s 192ms/step - accuracy: 1.0000 - loss: 0.0125 - val_accuracy: 0.8784 - val_loss: 0.6349
Epoch 9/20
14/14 ━━━━━━━━━━━━━━━━━━━━ 3s 187ms/step - accuracy: 1.0000 - loss: 0.0189 - val_accuracy: 0.8446 - val_loss: 0.6983
Epoch 10/20
14/14 ━━━━━━━━━━━━━━━━━━━━ 3s 179ms/step - accuracy: 0.9861 - loss: 0.0564 - val_accuracy: 0.8176 - val_loss: 0.6384
Epoch 11/20
14/14 ━━━━━━━━━━━━━━━━━━━━ 2s 178ms/step - accuracy: 0.9861 - loss: 0.0658 - val_accuracy: 0.8581 - val_loss: 0.6085
Epoch 12/20
14/14 ━━━━━━━━━━━━━━━━━━━━ 3s 184ms/step - accuracy: 0.9987 - loss: 0.0110 - val_accuracy: 0.8716 - val_loss: 0.6948
Epoch 13/20
14/14 ━━━━━━━━━━━━━━━━━━━━ 3s 179ms/step - accuracy: 0.9956 - loss: 0.0157 - val_accuracy: 0.9189 - val_loss: 0.2913
Epoch 14/20
14/14 ━━━━━━━━━━━━━━━━━━━━ 2s 177ms/step - accuracy: 0.9948 - loss: 0.0129 - val_accuracy: 0.8851 - val_loss: 0.3093
Epoch 15/20
14/14 ━━━━━━━━━━━━━━━━━━━━ 2s 176ms/step - accuracy: 0.9982 - loss: 0.0141 - val_accuracy: 0.8716 - val_loss: 0.3558
Epoch 16/20
14/14 ━━━━━━━━━━━━━━━━━━━━ 3s 181ms/step - accuracy: 0.9963 - loss: 0.0087 - val_accuracy: 0.8784 - val_loss: 0.4718
Epoch 17/20
14/14 ━━━━━━━━━━━━━━━━━━━━ 3s 178ms/step - accuracy: 0.9946 - loss: 0.0170 - val_accuracy: 0.8986 - val_loss: 0.3190
Epoch 18/20
14/14 ━━━━━━━━━━━━━━━━━━━━ 3s 185ms/step - accuracy: 1.0000 - loss: 0.0042 - val_accuracy: 0.9257 - val_loss: 0.3658
Epoch 19/20
14/14 ━━━━━━━━━━━━━━━━━━━━ 3s 189ms/step - accuracy: 1.0000 - loss: 8.3204e-04 - val_accuracy: 0.9122 - val_loss: 0.3734
Epoch 20/20
14/14 ━━━━━━━━━━━━━━━━━━━━ 3s 191ms/step - accuracy: 1.0000 - loss: 5.7922e-04 - val_accuracy: 0.9054 - val_loss: 0.3889

 

loss, acc = model.evaluate(test_ds)
print("Accuracy", acc)
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 135ms/step - accuracy: 0.9062 - loss: 0.3615
Accuracy 0.90625
import random
# 这是大家可以自由发挥的一个地方
def aug_img(image):seed = (random.randint(0,9), 0)# 随机改变图像对比度stateless_random_brightness = tf.image.stateless_random_contrast(image, lower=0.1, upper=1.0, seed=seed)return stateless_random_brightness

 

image = tf.expand_dims(images[3]*255, 0)
print("Min and max pixel values:", image.numpy().min(), image.numpy().max())

 

Min and max pixel values: 0.0 255.0
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")

 

收获:由于tf版本较新 在数据增强处进行代码修改 代码如下:

from tensorflow.keras import layers
from tensorflow.keras.models import Sequential

data_augmentation = Sequential([
    layers.Rescaling(1./255),
    layers.RandomFlip("horizontal_and_vertical"),
    layers.RandomRotation(0.2),
])  学会了根据所导入库的版本对代码进行修改 


http://www.hkcw.cn/article/pHHpOuPfRJ.shtml

相关文章

Python_day40

昨天我们介绍了图像数据的格式以及模型定义的过程,发现和之前结构化数据的略有不同,主要差异体现在2处 1. 模型定义的时候需要展平图像 2. 由于数据过大,需要将数据集进行分批次处理,这往往涉及到了dataset和dataloader来规范代码…

MSTNet:用于糖尿病视网膜病变分类的多尺度空间感知 Transformer 与多实例学习方法|文献速递-深度学习医疗AI最新文献

Title 题目 MSTNet: Multi-scale spatial-aware transformer with multi-instance learning for diabetic retinopathy classification MSTNet:用于糖尿病视网膜病变分类的多尺度空间感知 Transformer 与多实例学习方法 01 文献速递介绍 糖尿病视网膜病变&#…

Linux上安装MongoDB

目录 一、在Linux系统安装MongoDB服务器 1、下载MongoDB 2、上传MongoDB并解压 3、创建必要目录 4、配置环境变量 5、创建配置文件 6、启动命令 7、验证安装 二、在Linux系统安装MongoDB客户端Shell 1、下载MongoDB Shell 2、上传MongoDB Shell并解压 3、配置环境变…

muduo库的初步认识和基本使用,创建一个简单查询单词服务系统

小编在学习完muduo库之后,觉得对于初学者,muduo库还是有点不好理解,所以在此,小编来告诉大家muduo库的初步认识和基本使用,让初学者也可以更快的上手和使用muduo库。 Muduo由陈硕大佬开发,是⼀个基于 非阻塞…

格恩朗超声波水表 助力农业精准灌溉与振兴​

在农业现代化的征程中,水资源的精准利用至关重要,而这离不开高精度计量设备的支持。大连格恩朗品牌积极响应国家全面推进乡村振兴、加快农业农村现代化的号召,精心打造的超声波水表,凭借其超高精度,成为绿色灌溉领域的…

Nginx进阶篇(静态资源的缓存处理、Nginx中与浏览器缓存相关的指令、Nginx的跨域问题、静态资源防盗链)

文章目录 1. 静态资源的缓存处理1.1 什么是缓存1.2 什么是Web缓存1.3 Web缓存的种类1.3.1 客户端缓存1.3.2 服务端缓存 1.4 为什么要用浏览器缓存1.5 浏览器缓存的执行流程1.6 浏览器强缓存和弱缓存的区别1.6.1 强缓存(Strong Cache)1.6.2 弱缓存&#x…

云游戏混合架构

云游戏混合架构通过整合本地计算资源与云端能力,形成了灵活且高性能的技术体系,其核心架构及技术特征可概括如下: 一、混合架构的典型模式 分层混合模式‌ 前端应用部署于公有云(如渲染流化服务),后端逻辑…

Origin教程010:Origin绘制同心圆图

文章目录 10、绘制同心圆弧图1、同心圆弧图绘制2、调整绘图顺序3、设置标签内容、样式4、指引线设置5、添加图形标题6、练习数据10、绘制同心圆弧图 本节要点: 同心圆弧图的绘制调整绘图顺序(对象管理器)设置标签内容、样式指引线设置添加图形标题1、同心圆弧图绘制 1️⃣拖…

rs485/232转profinet网关与长陆-UNI800称重显示控制仪通讯

rs485/232转profinet网关与长陆-UNI800称重显示控制仪通讯 在现代工业自动化系统中,RS485转Profinet网关作为一种关键的通信接口设备,其重要性不言而喻。它能够将传统的RS485接口设备接入先进的Profinet网络,实现不同协议之间的无缝转换和数…

【速通RAG实战:进阶】20、改进RAG检索质量有哪些诀窍?

一、数据层优化:构建高质量检索基础 (一)动态语义分块技术 传统固定长度分块易切断完整语义,采用基于相似度的动态分块策略可显著提升上下文连贯性。通过LangChain的SemanticChunker实现语义边界检测,当相邻文本相似度低于0.4时自动切分,避免将“设备型号-参数-操作步骤…

Nginx网站服务:从入门到LNMP架构实战

🏡作者主页:点击! Nginx-从零开始的服务器之旅专栏:点击! 🐧Linux高级管理防护和群集专栏:点击! ⏰️创作时间:2025年5月30日14点22分 前言 说起Web服务器&#xff0c…

早发现=早安心!超导心磁图如何捕捉早期病变信号?

随着生活节奏的加快,心血管疾病已成为威胁人们健康的“隐形杀手”。据国家心血管病中心发布的《中国心血管健康与疾病报告2022》显示,我国心血管病现患者人数已高达3.3亿,每5例死亡中就有2例死于心血管病。这一数据触目惊心,提醒我…

AI感知与行动:考拉悠然发布空间智能世界模型,让AI走进物理世界

本文转自:《封面新闻》 5月,2025福布斯中国人工智能科技企业TOP50评选结果发布,成都考拉悠然科技有限公司成功入选,成为榜单中唯一专注“空间智能”的企业。 ,时长02:55 而在近日,考拉悠然发布了面向空间…

Arduino学习-跑马灯

1、效果 2、代码 /**** 2025-5-30 跑马灯的小程序 */ //时间间隔 int intervaltime200; //初始化函数 void setup() {// put your setup code here, to run once://设置第3-第7个引脚为输出模式for(int i3;i<8;i){pinMode(i,OUTPUT);} }//循环执行 void loop() {// put you…

CAD多边形密堆积2D插件

插件介绍 CAD多边形密堆积2D插件可在AutoCAD内建立模拟重力堆积状态的随机多边形颗粒及界面过渡区&#xff08;ITZ&#xff09;模型。 模型可分为多边形颗粒、界面过渡区&#xff08;ITZ&#xff09;、长方形试件三部分&#xff0c;各部分在CAD内分图层绘制&#xff0c;可批…

特伦斯 S75:重塑钢琴体验的数码钢琴之选

当传统钢琴的典雅质感与现代科技的精准赋能相遇&#xff0c;特伦斯 S75 立式数码钢琴应运而生。这款专为追求品质的演奏者与音乐爱好者设计的高端乐器&#xff0c;以 “还原三角钢琴灵魂&#xff0c;革新数字钢琴体验” 为核心理念&#xff0c;在音色、触感、音质与智能交互间达…

methods的实现原理

一、直观的感受methods的使用 首先直观的感受methods方法的使用&#xff0c;同样以计数器为例&#xff0c; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widt…

晨控CK-FR03与TwinCAT3配置EtherCAT通讯连接手册

晨控CK-FR03与TwinCAT3配置EtherCAT通讯连接手册 晨控CK-FR03系列作为晨控智能工业级别RFID读写器,支持大部分工业协议如RS232、RS485、以太网。支持工业协议Modbus RTU、Modbus TCP、Profinet、EtherNet/lP、EtherCat以及自由协议TCP/IP等。 本期主题&#xff1a;围绕CK-FR03…

大模型-attention汇总解析之-MLA

一、核心思想 先看下初始的MLA的一般性公式&#xff1a; 我们一般会缓存的是投影后的k_i, v_i而不是投影前的x_i, c_i &#xff0c;根据 MLA 的这个做法&#xff0c;通过不同的投影矩阵再次让所有的 K、V Head 都变得各不相同&#xff0c;那么 KV Cache 的大小就恢复成跟 MHA …

多线程(3)

1volatile关键字: 1.1volatile的功能 volatile关键字能够保证内存可见性 当变量被volatile修饰后: 写操作--->会将寄存器内的值修改后会第一时间将新值写回内存(主内存),不会引起一个另外一个线程去读的时候还读个旧数据,导致出现bug,比如将01改为1后就应该立马写回内存…