当前位置: 首页 > news >正文

Kaggle图像分类竞赛实战总结详细代码解读

前言

我是跟着李沐的动手学深度学习v2视频学习深度学习的,光看不做假把式,所以在学习完第七章-现代卷积神经网络之后,参加了一次李沐发布的Kaggle竞赛。自己动手,从组织数据集开始,到训练,再到推理,把整个流程走了一遍,收获颇丰,感觉学到了很多东西,(完整代码:https://www.kaggle.com/code/leyoubaloy/competition-classifyleaves/notebook?scriptVersionId=114980812 )现总结如下:

组织数据集

我相信很多小伙伴跟我一样,学习深度学习不是为了在这个领域做出创新性的贡献,而是仅仅会用它解决实际问题即可,但是在用别人的模型的过程中卡在了第一步——组织数据集。

先搞明白两个类,Dataset和Dataloader(需要有python面向对象知识基础)。Dataset是对整体数据集的一个抽象,它定义了数据的读取方法等属性,而Dataloader是用于训练和、评估和测试的迭代器,它能控制batch_size,shuffle等属性。Dataset代码的编写是很灵活的,针对不同的数据集有不同的写法,想要会用深度学习一定先学会写Dataset类。

class MyDataset(Dataset):def __init__(self, mode='train', valid_ratio=0.2, resize_height=256, resize_width=256):self.resize_height = resize_heightself.resize_width = resize_widthself.mode = modeif mode == 'train':data = pd.read_csv('/kaggle/input/classify-leaves/train.csv')self.train_len = int(data.shape[0] * (1 - valid_ratio))self.train_image = np.asarray(data.loc[:self.train_len, 'image'])self.train_label = np.asarray(data.loc[:self.train_len, 'label'])self.image_arr = self.train_imageself.label_arr = self.train_labelelif mode == 'valid':data = pd.read_csv('/kaggle/input/classify-leaves/train.csv')self.train_len = int(data.shape[0] * (1 - valid_ratio))self.valid_image = np.asarray(data.loc[self.train_len:, 'image'])self.valid_label = np.asarray(data.loc[self.train_len:, 'label'])self.image_arr = self.valid_imageself.label_arr = self.valid_labelelif mode == 'test':data = pd.read_csv('/kaggle/input/classify-leaves/test.csv')self.test_image = np.asarray(data.loc[:, 'image'])self.image_arr = self.test_imageself._len = len(self.image_arr)def __getitem__(self, index):image_path = self.image_arr[index]image = Image.open(os.path.join('/kaggle/input/classify-leaves/', image_path))if self.mode == 'train':transform = transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])else:transform = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])image = transform(image)if self.mode == 'test':return imagelabel = self.label_arr[index]label_num = label2num[label]return image, label_numdef __len__(self):return self._len

这次竞赛等数据集是一个树叶图像分类数据集,在我的代码中定义了一个MyDataset类,在init方法中,我用pandas读取图像列表为一个Series。在getitem方法中,传入一个参数index,用Image库读取第index个图像,再用transforms对它做一些预处理(包括resize、裁切、转化成tensor、标准化),使其能够被输入到神经网络。

有三种模式,训练、验证和测试。训练和验证模式的数据是从训练集中划分的,是有标签的,而测试集是没有标签的,需要我们训练完推理得到答案,上传答案。在训练模式下,随机裁切图像即可,但是验证和测试模式最好用中心裁切,使待测试的图像尽可能完整的输入到网络中。训练和验证模式的getitem返回的是tensor和label,而测试模式返回的是tensor。

然后就可以实例化,得到train_dataset,valid_dataset,test_dataset。

train_dataset = MyDataset(mode='train')
valid_dataset = MyDataset(mode='valid')
test_dataset =  MyDataset(mode='test')

最后用dataset生成dataloader,这个就很简单了,传几个参数就可以。batch_size是每个batch的训练样本个数,shuffle是否打乱数据,num_worker是读取数据所用的进程数,因为读取数据通常比较花时间,所以有时候需要用不止一个进程来读取数据。对于训练和验证数据,需要打乱,对于测试数据就不需要打乱了。

train_loader = DataLoader(train_dataset, batch_size=10, shuffle=True, num_workers=2)
valid_loader = DataLoader(valid_dataset, batch_size=10, shuffle=True, num_workers=2)
test_loader = DataLoader(test_dataset, batch_size=10, shuffle=False, num_workers=2)

label的格式

这个问题困扰了我比较久。这是一个176类的分类问题,模型输出的是有176个元素的向量,可以理解为向量中的每个元素表示该样本属于此类的概率,所以我们选择最大的元素值的index即可,也就是argmax。

按理来说,我们的label的格式也应该是one-hot编码,然鹅这样太占内存了,所以,在pytorch中规定我们的label格式是index,即只有一个数字,表示所属类的下标。

现实中的label往往是字符串,要先对其编码,用两个字典就可以了,num2label和label2num。

labels = train['label'].unique()
label2num = {}
for idx,label in enumerate(labels):label2num[label] = idx
print('label2num:',label2num)
num2label = { a : b for b, a in label2num.items()}
print('num2label:',num2label)

网络调整

网络需要改的地方是输入size和输出size,在d2l第七章的教学中mnist数据集是黑白的,输入只有一个通道,而我们的数据集是彩色的,有三个通道,所以要改一下。mnist的输出是10类,而我们的输出有176类,这个也要改一下。

损失函数

训练过程是一个epoch一个epoch进行训练的,所以网络的输入输出都是是若干个样本,损失也是若干个样本一起计算一次损失。分类任务常用的是交叉熵损失,即nn.CronssEntropyLoss(),它的输入是y_hat和y_real,注意哟这两个格式是不一样的,y_hat是模型的输出,类似于one-hot编码,而y_real只是一个index。

关于这个损失函数,最好理解一下,上百度搜一下它是怎么计算类别的损失的。

如何推理

验证精度和推理测试集的时候都需要用到推理,推理也是分epoch进行的,推理时要把自动梯度关掉。在训练的代码中有一个细节是torch.max()函数不仅返回的是最大值,还有它的index,我们所需要的主要是它的index。

net.load_state_dict(torch.load('./net.ckpt'))
net.eval()
test_labels = []
with torch.no_grad():for test_x in test_loader:test_x = test_x.to(device)output = net(test_x)for label in torch.max(output, 1)[1]:
#             print('label:',)test_labels.append(num2label[label.item()])

总结

很多看似简单的代码其实包含了很多理论知识,可以花个一两天的时间把这些代码好好理一理,观察一下每行代码的输出形式是什么样的。

相关文章:

Kaggle图像分类竞赛实战总结详细代码解读

前言 我是跟着李沐的动手学深度学习v2视频学习深度学习的,光看不做假把式,所以在学习完第七章-现代卷积神经网络之后,参加了一次李沐发布的Kaggle竞赛。自己动手,从组织数据集开始,到训练,再到推理&#x…...

开源AI对比--dify、n8n

原文网址:开源AI对比--dify、n8n-CSDN博客 简介 本文介绍开源AI工作流工具的选型。 对比 项difyn8n占优者学习难度简单中等dify核心理念用LLM构建应用。“连接一切”。以工作流自动化连接各系统。平手工作模式 Chatflow:对话。支持用户意图识别、上下…...

【SQL系列】多表关联更新

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

软件设计师教程——第一章 计算机系统知识(下)

前言 在竞争激烈的就业市场中,证书是大学生求职的重要加分项。中级软件设计师证书专业性强、认可度高,是计算机相关专业学生考证的热门选择,既能检验专业知识,又有助于职业发展。本教程将聚焦核心重点,以点带面构建知…...

华为银河麒麟 V10(ARM)系统软件部署全攻略:Redis、RabbitMQ、MySQL 等集群搭建指南

一、Redis 集群部署(主从 哨兵模式) 1. 环境准备 系统:华为银河麒麟 V10(ARM64)节点:3 台服务器(1 主 2 从 3 哨兵) 2. 安装包下载 bash # 华为镜像站 wget https://update.c…...

World of Warcraft [CLASSIC][80][Deluyia] [Fragment of Val‘anyr]

瓦兰奈尔的碎片 [Fragment of Valanyr] 有时候下个班打个游戏,没想到套路也这么多,唉,何况现实生活,这一个片版本末期才1000G,30个,也就30000G,时光徽章等同月卡15000G,折合一下也就…...

C++:求分数序列和

【描述】 有一个分数序列 2/1,3/2,5/3,8/5,13/8,21/13,.... 求这个分数序列的前n项之和。 输入 输入有一行:正整数n。 输出 输出有一行:分数序列的和(浮点数,精确到小数点后4位)。 【样例输入】 99 【样例输出】 160.4…...

支付宝沙盒模式商家转账经常出现 响应异常: 解包错误

2025年5月9日16:27:08 php8.3 laravel11 octane swoole加速 测试时不时就出现 响应异常: 解包错误 错误信息: Yansongda\Artful\Exception\InvalidResponseException: 响应异常: 解包错误 in /opt/www/vendor/yansongda/artful/src/Direction/CollectionDirect…...

第04章—技术突击篇:如何根据求职意向进行快速提升与复盘

经过上一讲的内容阐述后,咱们定好了一个与自身最匹配的期望薪资,接着又该如何准备呢? 很多人在准备时,通常会选择背面试八股文,这种做法效率的确很高,毕竟能在“八股文”上出现的题,也绝对是面…...

数据统计的意义:钱包余额变动

钱包余额变动统计的核心意义在于通过数据可视化实现资金流动的透明化管理,其价值主要体现在以下五个维度: 一、财务健康诊断() 资金流动可视化 通过期初/期末余额对比,可快速识别异常波动(如连续3个月余额…...

单调栈模版型题目(3)

单调栈型题目贡献法 基本模版 这是数组a中的 首先我们要明白什么叫做贡献,在一个数组b{1,3,5}中,连续包含1的连续子数组为{1},{1,3},{1,3,5},一共有三个,这三个数一共能组成6个连续子数组,而其…...

PostgreSQL 的 pg_advisory_lock 函数

PostgreSQL 的 pg_advisory_lock 函数 pg_advisory_lock 是 PostgreSQL 提供的一种应用级锁机制,它不锁定具体的数据库对象(如表或行),而是通过数字键值来协调应用间的并发控制。 锁的基本概念 PostgreSQL 提供两种咨询锁(advi…...

NLP基础

1. 基本概念 自然语言处理(Natural Language Processing,简称NLP)是人工智能和语言学领域的一个分支,它涉及到计算机和人类(自然)语言之间的相互作用。它的主要目标是让计算机能够理解、解释和生成人类语言…...

[AI Tools] Dify 工具插件上传指南:如何将插件发布到官方市场

Dify 作为开源的 LLM 应用开发平台,不仅支持本地化插件开发,也提供了插件市场机制,让开发者能够将自己构建的插件发布并供他人使用。本文将详细介绍如何将你开发的 Dify Tools 插件上传至官方插件市场,包括 README 编写、插件打包、仓库 PR 等核心步骤。 一、准备 README 文…...

Qt读写XML文档

XML 结构与概念简介 XML(可扩展标记语言) 是一种用于存储和传输结构化数据的标记语言。其核心特性包括: 1、树状结构:XML 数据以层次化的树形结构组织,包含一个根元素(Root Element)&#xff…...

htmlUnit和Selenium的区别以及使用BrowserMobProxy捕获网络请求

1. Selenium:浏览器自动化之王 核心定位: 跨平台、跨语言的浏览器操控框架,通过驱动真实浏览器实现像素级用户行为模拟。 技术架构: 核心特性: 支持所有主流浏览器(含移动端模拟) 精…...

C#黑魔法:鸭子类型(Duck Typing)

C#黑魔法:鸭子类型(Duck Typing) 如果它走起路来像鸭子,叫起来像鸭子,那么它就是鸭子。 鸭子类型,主要应用于动态语言类型,比如JS、Python等,核心理念为:关注对象的行为(方法或属性…...

2025 年数维杯数学建模B题完整论文代码模型

《2025 年数维杯数学建模B题完整论文代码模型》 B题完整论文 一、赛事背景与题目总览 2025 年第十届数维杯大学生数学建模挑战赛的 B 题聚焦于“马拉松经济的高质量发展思路探索”。近年来,我国马拉松赛事如同一颗颗璀璨的星星,在城市的天空中闪耀&am…...

C++23 中的 views::chunk:深入探索与应用

文章目录 一、views::chunk 的背景与动机二、views::chunk 的基本用法语法与参数示例代码 三、views::chunk 的高级用法处理不完整块与 views::drop 和 views::take 结合 四、性能分析五、应用场景1. 批量处理数据2. 分页显示3. 并行处理 六、与其他范围适配器的组合1. 与 view…...

库室指静脉人脸门禁机 LK-BM-S10C/JR

1、采用大于等于四核处理器,主频大于1G; 2、内存≥4G DDR3;存储≥8G 3、核心模块采用国产工业级处理芯片和嵌入式Android实时多任务系统,采用模块化设计,模块间通过标准接口相连; 4、大于等于10英寸电容屏&#xf…...

低成本自动化改造的18个技术锚点深度解析

执行摘要 本文旨在深入剖析四项关键的低成本自动化技术,这些技术为工业转型提供了显著的运营和经济效益。文章将提供实用且深入的指导,涵盖老旧设备联网、AGV车队优化、空压机系统智能能耗管控以及此类项目投资回报率(ROI)的严谨…...

线程中常用的方法

知识点详细说明 Java线程的核心方法集中在Thread类和Object类中,以下是新增整合后的常用方法分类解析: 1. 线程生命周期控制 方法作用注意事项start()启动新线程,JVM调用run()方法多次调用会抛出IllegalThreadStateException(线程状态不可逆)。run()线程的任务逻辑直接调…...

运维体系架构规划

运维体系架构规划是一个系统性工程,旨在构建高效、稳定、安全的运维体系,保障业务系统的持续运行。下面从规划目标、核心模块、实施步骤等方面进行详细阐述: 一、规划目标 高可用性:确保业务系统 724 小时不间断运行&#xff0c…...

C++结构体介绍

结构体的定义 在C中,结构体(struct)是一种用户定义的数据类型,允许将不同类型的数据组合在一起。结构体的定义使用struct关键字,后跟结构体名称和一对花括号{},花括号内包含成员变量的声明。 struct Pers…...

RoPE长度外推:外插内插

RoPE:假定 α \alpha α是定值 其中一半位置是用cos表示的 cos ⁡ ( k α − 2 i d ) \cos(k\alpha^{-\frac{2i}{d}}) cos(kα−d2i​)(另一半是sin)(d是词嵌入维度) 当太长如何解决: 1 直接不管—外插 缺点:超过一定长度性能急剧下降。(较大时,对应的很多位置编码…...

牛客练习赛138-题解

牛客练习赛138-题解 https://ac.nowcoder.com/acm/contest/109081#question A-小s的签到题 题目描述 给定一个比赛榜单: 第一行是 n 个不同的大写字母,代表题号第二行是 n 个形如a/b的字符串,表示每道题的通过人数和提交人数 找到通过人…...

MySQL高可用方案全攻略:选型指南与AI运维实践

MySQL高可用方案全攻略:选型指南与AI运维实践 引言:当数据库成为业务生命线 在数字化时代,数据库就是企业的"心脏"。一次数据库宕机可能导致: 电商网站每秒损失上万元订单游戏公司遭遇玩家大规模流失金融系统引发连锁反应本文将为你揭秘: MySQL主流高可用方案…...

【库(Library)、包(Package)和模块(Module)解析】

在Python中,**库(Library)、包(Package)和模块(Module)**是代码组织的不同层级,而import语句的导入行为与它们密切相关。以下是详细对比和解释: 📦 1. 核心概…...

记录一次使用thinkphp使用PhpSpreadsheet扩展导出数据,解决身份证号码等信息科学计数法问题处理

PhpSpreadsheet官网 PhpSpreadsheet安装 composer require phpoffice/phpspreadsheet使用composer安装时一定要下载php对应的版本&#xff0c;下载之前使用php -v检查当前php版本 简单使用 <?php require vendor/autoload.php;use PhpOffice\PhpSpreadsheet\Spreadshee…...

为什么业务总是被攻击?使用游戏盾解决方案

业务频繁遭受攻击的核心原因在于攻防资源不对等&#xff0c;攻击者利用技术漏洞、利益驱动及企业防护短板发起攻击&#xff0c;而游戏盾通过针对性架构设计实现高效防御。以下是具体分析与解决方案&#xff1a; ​​一、业务被攻击的根源​​ ​​利益驱动攻击​​ ​​勒索与数…...

4.1【LLaMA-Factory 实战】医疗领域大模型:从数据到部署的全流程实践

【LLaMA-Factory实战】医疗领域大模型&#xff1a;从数据到部署的全流程实践 一、引言 在医疗AI领域&#xff0c;构建专业的疾病诊断助手需要解决数据稀缺、知识专业性强、安全合规等多重挑战。本文基于LLaMA-Factory框架&#xff0c;详细介绍如何从0到1打造一个垂直领域的医…...

二维旋转矩阵:让图形动起来的数学魔法 ✨

大家好&#xff01;今天我们要聊一个超酷的数学工具——旋转矩阵。它就像数学中的"旋转魔法"&#xff0c;能让图形在平面上优雅地转圈圈。别被"矩阵"这个词吓到&#xff0c;其实它就是一个数字表格&#xff0c;但功能超级强大&#xff01; 一、什么是旋转…...

go语言封装、继承与多态:

1.封装&#xff1a; 封装是通过将数据和操作数据的方法绑定在一起来实现的。在Go语言中&#xff0c;封装通过结构体&#xff08;struct&#xff09;和方法&#xff08;method&#xff09;来实现。结构体的字段可以通过大小写来控制访问权限。 package stutype Person struct …...

golang -- 如何获取变量类型

目录 前言获取变量类型一、fmt.Printf二、类型断言三、类型选择四、反射 reflect.TypeOf五、reflect.Value的Type()方法 前言 在学习反射的时候&#xff0c;对reflect包中获取变量类型的函数很迷惑 比如下面这个 用Type获取变量类型的方法&#xff08;在下面提到&#xff09; …...

Missashe考研日记-day36(改版说明)

Missashe考研日记-day36 改版说明 经过一天的思考、纠结和尝试&#xff0c;博主决定对更新内容进行改版&#xff0c;如下&#xff1a;1.不再每天都发一篇日记&#xff0c;改为一周发一篇包含一周七天学习进度的周记&#xff0c;但为了标题和以前相同&#xff08;强迫症&#…...

opencv中的图像特征提取

图像的特征&#xff0c;一般是指图像所表达出的该图像的特有属性&#xff0c;其实就是事物的图像特征&#xff0c;由于图像获得的多样性&#xff08;拍摄器材、角度等&#xff09;&#xff0c;事物的图像特征有时并不特别突出或与无关物体混杂在一起&#xff0c;因此图像的特征…...

一文了解氨基酸的分类、代谢和应用

氨基酸&#xff08;Amino acids&#xff09;是在分子中含有氨基和羧基的一类化合物。氨基酸是生命的基石&#xff0c;人类所有的疾病与健康状况都与氨基酸有直接或间接的关系。氨基酸失衡可引起肝硬化、神经系统感染性疾病、糖尿病、免疫性疾病、心血管疾病、肾病、肿瘤等各类疾…...

Linux 系统安装Minio详细教程

一、&#x1f50d; MinIO 简介 MinIO 是一个高性能的对象存储服务&#xff0c;兼容 Amazon S3 接口&#xff0c;适用于大数据、AI、云原生等场景&#xff0c;支持分布式部署和高可用性&#xff0c;可作为轻量级的私有云对象存储解决方案。 二、&#x1f4e6; 安装准备 ✅ 系…...

排序算法-归并排序

归并排序是一种分治算法&#xff08;Divide and Conquer&#xff09;。对于给定的一组数据&#xff0c;利用递归与分治技术将数据序列划分成为越来越小的半子表&#xff0c;在对半子表排序后&#xff0c;再用递归方法将排好序的半子表合并成为越来越大的有序序列。 核心思想 分…...

js 两个数组中的指定参数(id)相同,为某个对象设置disabled属性

在JavaScript中&#xff0c;如果想要比较两个数组并根据它们的id属性来设置某个对象的disabled属性为true&#xff0c;你可以使用几种不同的方法。这里我将介绍几种常用的方法&#xff1a; 方法1&#xff1a;使用循环和条件判断 const array1 [{ id: 1, name: Item 1 },{ id…...

【Java基础】——集合篇

目标&#xff1a; 1.每个集合用的场景 2.每个集合的底层 一.概述 二. 三.Collection 1.通用方法 其中&#xff0c;contains方法&#xff0c;它的底层一定调用了equals方法进行比对&#xff0c;而且一定重写了equals方法&#xff0c;如果不重写equals方法&#xff0c;就是调用…...

小红书视频无水印下载方法

下载小红书&#xff08;RED/Xiaohongshu&#xff09;视频并去除水印可以通过以下几种方法实现&#xff0c;但请注意尊重原创作者版权&#xff0c;下载内容仅限个人使用&#xff0c;避免侵权行为。 方法一&#xff1a;使用在线解析工具&#xff08;推荐&#xff09; 复制视频链…...

代发考试战报:思科华为HCIP HCSE CCNP 考试通过

CCNP 300-410考试通过战报&#xff0c;HCIP云计算通过&#xff0c;HCIP数通 H12-821考试通过&#xff0c;H12-831考试通过&#xff0c;HCSP金融 H19-611考试通过&#xff0c;HCSE金融 H21-293 考试通过 报名考试一定要找正规报名&#xff0c;避免后续考试成绩被取消&#xff0…...

辉芒微离线烧录器“文件格式错误”问题解决

最近在使用辉芒微离线烧录器烧录程序时&#xff0c;提示“文件格式错误”&#xff0c;记录一下解决方法。 一、问题现象 经过多次尝试和排查&#xff0c;发现以下几种情况&#xff1a; 情况一&#xff1a;使用离线烧录器导入固件1&#xff08;boot程序&#xff09;&#xff0c…...

系统的从零开始学习电子的相关知识,该如何规划?

一、基础理论奠基&#xff08;6-12个月&#xff09; 1.1 数学与物理基础 核心内容&#xff1a; 微积分与线性代数&#xff08;高频电路建模必备&#xff09;复变函数与概率论&#xff08;信号处理与通信系统基础&#xff09;电磁场基础&#xff08;麦克斯韦方程组的物理意义&…...

网络研讨会开发注册中, 5月15日特励达力科,“了解以太网”

在线研讨会主题 Understanding Ethernet - from basics to testing & optimization 了解以太网 - 从基础知识到测试和优化 注册链接# https://register.gotowebinar.com/register/2823468241337063262 时间 北京时间 2025 年 5 月 15 日 星期四 下午 3:30 - 4:30 适宜…...

LSTM的简单模型

好的&#xff0c;我来用通俗易懂的语言解释一下这个 LSTMTagger 类是如何工作的。 1️⃣ 类的目的 这个 LSTMTagger 类是一个用于自然语言处理&#xff08;NLP&#xff09;任务的模型&#xff0c;目的是标注输入的句子&#xff0c;通常用于词性标注&#xff08;例如&#xff…...

聊聊Spring AI autoconfigure模块的拆分

序 本文主要研究一下Spring AI autoconfigure模块的拆分 v1.0.0-M6版本 (base) ➜ spring-ai-spring-boot-autoconfigure git:(v1.0.0-M6) tree -L 9 . ├── pom.xml ├── src │ ├── main │ │ ├── java │ │ │ └── org │ │ │ └…...

LVGL源码学习之渲染、更新过程(3)---绘制和刷写

LVGL版本&#xff1a;8.1 往期回顾&#xff1a; LVGL源码学习之渲染、更新过程(1)---标记和激活 LVGL源码学习之渲染、更新过程(2)---无效区域的处理 前文提到&#xff0c;在处理完无效区域后&#xff0c;会得到一个个需要重新绘制的对象&#xff0c;这些对象将在DRAW事件中…...

CTF-DAY11

[NSSRound#16 Basic]了解过PHP特性吗 题目&#xff1a; <?php error_reporting(0); highlight_file(__FILE__); include("rce.php"); $checker_1 FALSE; $checker_2 FALSE; $checker_3 FALSE; $checker_4 FALSE; $num $_GET[num]; if (preg_match("/…...