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

深度学习_2 数据操作

数据操作

机器学习包括的核心组件有:

  1. 可以用来学习的数据(data);
  2. 如何转换数据的模型(model);
  3. 一个目标函数(objective function),用来量化模型的有效性;
  4. 调整模型参数以优化目标函数的算法(algorithm)。

我们要从数据中提取出特征,机器学习、深度学习通过特征来进一步计算得到模型。因此下面主要介绍的是对数据要做哪些操作。

基本操作

深度学习里最多操作的数据结构是N维的数组。

0维:一个数,一个标量,比如1.

1维:比如一个一维数组,他的数据是一个一维的向量(特征向量)。

2维:比如二维数组(特征矩阵)。

当然还有更多维度,比如视频的长,宽,时间,批量大小,通道……

如果我们想创建这样一个数组,需要明确的因素:

  1. 数组结构,比如3*4.
  2. 数组数据类型,浮点?整形?
  3. 具体每个元素的值。

访问元素的方式:

1698545535004

1:3 是左闭右开,表示不包含第3行。

双冒号是跳着访问,后跟步长。比如 ::3 表示从第0行开始访问,每3行访问一次。

明白了这些,那接下来我们就创建一个数组。在机器学习中这种数据的容器一般被称作张量.

创建张量

这部分代码在 jupyter/pytorch/chapter_preliminaries/ndarray.ipynb 里。

在其中可以运行尝试代码部分,创建一维张量:

import torch
X = torch.arange(12) 	# 自动创建 0-11 的一维张量。输入 X 查看 X 内元素数据,输出:
# tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
X.shape					# 查看向量形状。输出 torch.Size([12]),指长12的一维向量
X.numel()				# 只获取长度,输出12
X = X.reshape(3, 4)		# 重新改成了3行4列形状。变成了0123 4567 891011
torch.zeros((2, 3, 4))	# 创建了一个形状为(2,3,4)的全0张量
# tensor([[[0., 0., 0., 0.],
#          [0., 0., 0., 0.],
#          [0., 0., 0., 0.]],
# 
#         [[0., 0., 0., 0.],
#          [0., 0., 0., 0.],
#          [0., 0., 0., 0.]]])
# torch.ones 同理,是全1的
# torch.randn 是取随机数,随机数是均值=0,方差=1的一个高斯分布中取
torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])	# 给定值创建
torch.exp(X)			# 求e^x中每个元素值得到的新张量

reshape 很有意思,它不是复制原数组后重新开辟了一片空间,而是还是对原数组元素的操作(只不过原来是连续12个数,现在我们把他们视作4个一行的3行元素。存储空间都是连续的)。因此如果我们对 reshape 后的数组赋值,原数组值也会改变。

算术运算

对于两个相同形状的向量可以进行+ - * / **(求幂运算)运算。

x = torch.tensor([1.0, 2, 4, 8])	# 1.0 为了让这个数组变成浮点数组
y = torch.tensor([2, 2, 2, 2])
x + y, x - y, x * y, x / y, x ** y  # **运算符是求幂运算
# Output: 
(tensor([ 3.,  4.,  6., 10.]),tensor([-1.,  0.,  2.,  6.]),tensor([ 2.,  4.,  8., 16.]),tensor([0.5000, 1.0000, 2.0000, 4.0000]),tensor([ 1.,  4., 16., 64.]))
x==y								# 每一项分别判断是否相等。我试了一下,数据类型不影响。2.0==2
x.sum()								# 所有元素求和
张量连接
X = torch.arange(12, dtype=torch.float32).reshape((3,4))	# 创建 float32 位的张量
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
torch.cat((X, Y), dim=0), torch.cat((X, Y), dim=1)			# 行和列两个维度的拼接
# Output: 
(tensor([[ 0.,  1.,  2.,  3.],[ 4.,  5.,  6.,  7.],[ 8.,  9., 10., 11.],[ 2.,  1.,  4.,  3.],[ 1.,  2.,  3.,  4.],[ 4.,  3.,  2.,  1.]]),tensor([[ 0.,  1.,  2.,  3.,  2.,  1.,  4.,  3.],[ 4.,  5.,  6.,  7.,  1.,  2.,  3.,  4.],[ 8.,  9., 10., 11.,  4.,  3.,  2.,  1.]]))
# 这里我看到弹幕前辈的讲解,感觉很受用。行是样例,列是特征属性,这个类似 MySQL 的关系数据库理解
广播机制

即使两个张量形状不同,也有可能通过广播机制进行按元素操作。

a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a, b
# Output: 
(tensor([[0],[1],[2]]),tensor([[0, 1]]))a + b			# 把a按列复制2份,b按行复制3份,都变成3*2的张量进行操作
# Output:
tensor([[0, 1],[1, 2],[2, 3]])
索引
X[-1], X[1:3]						# 这里和前面介绍的概念一样。-1 是倒数第一个元素(一个n-1维度张量),1:3 是第2,第3个元素不包括第4个元素。
# Output:
(tensor([ 8.,  9., 10., 11.]),tensor([[ 4.,  5.,  6.,  7.],[ 8.,  9., 10., 11.]]))
X[1,2]=9							# 写入
X[0:2, :] = 12						# 批量写入,给0-1行,所有列写成12
X
# Output:
tensor([[12., 12., 12., 12.],[12., 12., 12., 12.],[ 8.,  9., 10., 11.]])
节省内存

有一些操作会分配新内存。比如 Y=Y+X,并不是直接在 Y 的原地址上加了X,而是在新地址上计算得到 Y+X,让 Y 指向新地址。

可以通过 id(X) 函数来查看地址。

Y[:]=Y+X 或者 Y+=X 会在原地执行计算,Y 地址不变。

类型转换

转换为 numpy 张量:A=X.numpy()

张量转换为标量:

a=torch.tensor([3.5])
a.item()				# 3.5
float(a)				# 3.5
int(a)					# 3

数据预处理

实际处理数据的时候我们并不是从张量数据类型开始的,我们可能得到一个 excel 文件,自己把它转换成 python 张量。以及在转换之前,我们可能对数据进行预处理,比如把其中的空值统一赋值为0之类的操作。以下是转换步骤。

首先我们创建一个 csv 文件作为原始数据集。

import osos.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file = os.path.join('..', 'data', 'house_tiny.csv')
with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n')  # 列名f.write('NA,Pave,127500\n')  # 每行表示一个数据样本f.write('2,NA,106000\n')f.write('4,NA,178100\n')f.write('NA,NA,140000\n')

三个属性分别是 room 数量,走廊状态(比如铺了地板),价格。

然后我们把这个数据读入 python,加载原始数据集。

# 如果没有安装pandas,只需取消对以下行的注释来安装pandas
# !pip install pandas
import pandas as pddata = pd.read_csv(data_file)

这个数据集里还是有很多 NaN 项的,我们要对其进行修改替换。数值类典型处理方式是插值删除

首先最后一列数据是完整不需要修改的,那么我们只要处理前两列,我们把前两列数据单独拿出来做完处理最后进行张量拼接。

inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]

然后我们把 NumEooms 中的 NaN 值用均值替代,

inputs = inputs.fillna(inputs.mean(numeric_only=True))
print(inputs)
# Output:NumRooms Alley
0       3.0  Pave
1       2.0   NaN
2       4.0   NaN
3       3.0   NaN

对于 Alley 列,只有两种状态:NaN 和 Pave。我们用 pandas 的方法,把 NaN 也视作一个类,自动拆成两列设置值。

inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)
# Output:NumRooms  Alley_Pave  Alley_nan
0       3.0           1          0
1       2.0           0          1
2       4.0           0          1
3       3.0           0          1

最后,我们将前两列处理后得到的结果与最后一列转换为张量后进行拼接。

import torchX = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
y=y.reshape(4,1)
torch.cat((X,y),dim=1)
# Output:
tensor([[3.0000e+00, 1.0000e+00, 0.0000e+00, 1.2750e+05],[2.0000e+00, 0.0000e+00, 1.0000e+00, 1.0600e+05],[4.0000e+00, 0.0000e+00, 1.0000e+00, 1.7810e+05],[3.0000e+00, 0.0000e+00, 1.0000e+00, 1.4000e+05]], dtype=torch.float64)

相关文章:

深度学习_2 数据操作

数据操作 机器学习包括的核心组件有: 可以用来学习的数据(data);如何转换数据的模型(model);一个目标函数(objective function),用来量化模型的有效性&…...

win 下安装 nvm 的使用与配置

nvm 全名 node.js version management,是一个 nodejs 的版本管理工具。通过它可以安装和切换不同版本的 nodejs。 注:如果已经安装了 nodejs 需先卸载后再安装 nvm 为了确保 nodejs 已彻底删除,可以看看安装目录中是否有 node 文件夹&#x…...

Git笔记

删除最后一次提交 git reset --hard HEAD~1...

省钱兄共享茶室共享娱乐室小程序都有哪些功能

随着共享经济的兴起,共享茶室和共享娱乐室作为一种新型的共享空间,逐渐受到了年轻人的青睐。省钱兄共享茶室共享娱乐室小程序作为该领域的优秀代表,集多种功能于一身,为用户提供了一个便捷、舒适、高效的社交娱乐平台。本文将详细…...

vue-cli方式创建vue3工程

创建工程前,可先用命令行查看是否安装vue-cli。 通过命令行查看vue-cli版本 vue --version 如果已安装vue-cli,则会显示当前安装版本 vue/cli 4.5.13 如果没有安装vue-cli,会提示安装 vue : 无法识别“vue”命令 需要通过npm全局安装v…...

四、W5100S/W5500+RP2040树莓派Pico<TCP Server数据回环测试>

文章目录 1. 前言2. 协议简介2.1 简述2.2 优点2.3 应用 3. WIZnet以太网芯片4. TCP Server数据回环测试4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 测试现象 5. 注意事项6. 相关链接 1. 前言 在计算机网络中,TCP Server是不可或缺的角色,它…...

技术视角下的跑腿小程序开发:关键挑战和解决方案

跑腿小程序作为连接服务提供者和用户的桥梁,面临着诸多技术挑战。本文将聚焦于技术层面的关键挑战,并提供解决方案,以帮助开发者应对技术上的复杂问题。 1. 实时性与性能挑战 挑战: 跑腿小程序需要实时地匹配订单、更新状态和提…...

Mysql进阶-索引篇(下)

SQL性能分析 SQL执行频率 MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次,通过sql语句的访问频次,我们可…...

从龙湖智创生活入选金钥匙联盟,透视物业服务力竞争风向

假设你是业主,物业“服务”和“管理”,哪个名词看起来更加亲切、讨喜? 站在个人角度,“服务”更让人感受到温度。但对于一个要长期运营下去的住宅或者商企项目来说,整体的管理又必不可少。前者面向人,后者…...

什么是 CNN? 卷积神经网络? 怎么用 CNN 进行分类?(2)

参考视频:https://www.youtube.com/watch?vE5Z7FQp7AQQ&listPLuhqtP7jdD8CD6rOWy20INGM44kULvrHu 视频4:CNN 中 stride 的概念 如上图,stride 其实就是 ”步伐“ 的概念。 默认情况下,滑动窗口一次移动一步。而当 stride …...

样式迁移 - Style Transfer

所谓风格迁移,其实就是提供一幅画(Reference style image),将任意一张照片转化成这个风格,并尽量保留原照的内容(Content)。 将样式图片中的样式迁移到内容图片上,得到合成图片。 基于CNN的样式迁移 奠基性工作: 首先…...

UE5.3启动C++项目报错崩溃

最近尝试用C来练习,碰到一个启动崩溃的事情 按照官方给的步骤做的:官方链接 结果是自定义的Character的问题,在自定义Character的构造函数里调用了: check(GEngine ! nullptr); GEngine->AddOnScreenDebugMessage(-1, 5, FCol…...

C/S架构和B/S架构

1. C/S架构和B/S架构简介 C/S 架构(Client/Server Architecture)和 B/S 架构(Browser/Server Architecture)是两种不同的软件架构模式,它们描述了客户端和服务器之间的关系以及数据交互的方式。 C/S 架构&#xff08…...

【AD9361 数字接口CMOS LVDSSPI】C 并行数据 LVDS

接上一部分,AD9361 数字接口CMOS &LVDS&SPI 目录 一、LVDS模式数据路径和时钟信号LVDS模式数据通路信号[1] DATA_CLK[2] FB_CLK[3] Rx_FRAME[4] Rx_D[5:0][5] Tx_FRAME[6]Tx_D[5:0][7] ENABLE[8] TXNRX系列 二、LVDS最大时钟速率和信…...

开关电源测试方案分享:电源纹波及噪声测试方法、测试标准

纹波及噪声影响着设备的性能和稳定性,是开关电源测试的重要环节。通过电源纹波噪声测试,检测电源纹波情况,从而提升开关电源的性能。纳米软件开关电源自动化测试软件助力纹波和噪声测试,提升测试效能。 开关电源纹波及噪声测试方法…...

git的使用——如何创建.gitignore文件,排除target、.idea文件夹的提交

前言 git作为开发人员必备的技能,需要熟练掌握,本篇博客记录一些git使用的场景,结合具体问题进行git使用的记录。以gitee的使用为例。 本篇博客介绍如何创建.gitignore文件,排除一些文件夹的提交,比如排除target、.i…...

react-antd组件 input输入框: 实现按回车搜索

目录 法1: 法2: 法1: 在Input组件上绑定onKeyUp方法 import { Input, message } from antd;class App extends React.Component{handeleSousuo () > {this.props.form.validateFields((error, values) > {if(!error){axios.post().t…...

python_PyQt5日周月K线纵向对齐显示_1_数据处理

目录 写在前面: 图形结果显示: 数据设计: 代码: 从日数据中计算周数据、月数据 生成图形显示需要的数据格式 写在前面: “PyQt5日周月K线纵向对齐显示”,将分三篇博文描述 1 数据处理。将数据处理成…...

leetcode经典面试150题---4.删除有序数组中的重复项II

目录 题目描述 前置知识 代码 方法一 双指针 思路 图解 实现 复杂度 题目描述 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。 不要使用额外的数组空间&…...

Transformer英语-法语机器翻译实例

依照Transformer结构来实例化编码器-解码器模型。在这里,指定Transformer编码器和解码器都是2层,都使用4头注意力。为了进行序列到序列的学习,我们在英语-法语机器翻译数据集上训练Transformer模型,如图11.2所示。 da…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...