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

第二十九章:AI的“原子与批次”:高维数据表示与操作精炼【总结前面(1)】

AI数字语言

  • 1. 拆解AI的“基础构成”
  • 2.Tensor:AI世界的“原子”——核心属性精炼
    • 2.1 概念回顾:Tensor就是多维数组,它是AI的唯一语言
    • 2.2 亲手创建0D到3D Tensor,巩固核心概念
    • 2.3 维度的魔法:Tensor的“整形”与“变形记”
    • 2.3 permute vs. transpose:维度顺序变换——AI的“空间扭转术”
  • 3. Batch:AI的“集装箱”——高效并行计算的艺术
    • 3.1 概念回顾:为什么AI总是“批发”数据?GPU的并行秘密
    • 3.2 DataLoader:PyTorch的“自动化装箱员”
    • 3.3 使用DataLoader加载批次数据,并可视化Batch的内部结构
  • 4. 综合应用:看一个Batch如何在模型中“流动”
  • 5. 总结:你已掌握AI世界的“数字语言”。

1. 拆解AI的“基础构成”

你可能已经知道,AI模型并不认识文字、图片或声音,它只认识数字。这些数字,以一种特殊的“容
器”——**Tensor(张量)**的形式,在AI的“大脑”中流动、计算。

Tensor,就是AI世界的**“原子”,也是AI“乐高积木”的最小单元。理解它,并能熟练地操纵它,是掌握AI编程的第一步,也是最重要的一步**。

本章将是对Tensor和Batch这两个核心概念的深度精炼与实战巩固。
ai基础

我们将跳过重复的理论(因为在之前已经详细讲解),直接通过大量的代码案例,让你亲手创建、变换和操作各种维度的Tensor,理解Batch在GPU并行计算中的核心作用,并建立起AI数据处理的“肌肉记忆”。

2.Tensor:AI世界的“原子”——核心属性精炼

2.1 概念回顾:Tensor就是多维数组,它是AI的唯一语言

Tensor:PyTorch中用于存储和操作数据(数字)的基本数据结构。它是一个可以有任意维度的多维数组,是numpy中ndarray的“GPU加速版”。

三大核心属性:shape(形状)、dtype(数据类型)、device(存放设备)。这些属性是Tensor的“身份证”,是理解其在模型中如何流动的基础。

2.2 亲手创建0D到3D Tensor,巩固核心概念

代码演示

# case_10_1_tensor_basics.pyimport torch# --- 1. 创建0维Tensor (标量) ---
# 概念:一个没有维度、只有一个数字的Tensor
scalar = torch.tensor(3.14)
print("--- 0维Tensor (标量) ---")
print(f"数据: {scalar}")
print(f"形状 (Shape): {scalar.shape}") # () 表示0维
print(f"数据类型 (Dtype): {scalar.dtype}") # 默认float32
print(f"设备 (Device): {scalar.device}") # 默认cpu
print("-" * 30)# --- 2. 创建1维Tensor (向量) ---
# 概念:一串数字,只有一个维度
vector = torch.tensor([1, 2, 3, 4, 5])
print("--- 1维Tensor (向量) ---")
print(f"数据: {vector}")
print(f"形状 (Shape): {vector.shape}") # (5,) 表示长度为5的1维
print(f"数据类型 (Dtype): {vector.dtype}") # 默认int64 (因为输入是整数)
# 尝试创建浮点型向量
float_vector = torch.tensor([1.0, 2.0, 3.0])
print(f"浮点型向量数据: {float_vector}, Dtype: {float_vector.dtype}")
print("-" * 30)# --- 3. 创建2维Tensor (矩阵) ---
# 概念:一个表格,有两个维度 (行和列)
matrix = torch.tensor([[10, 20, 30], [40, 50, 60]])
print("--- 2维Tensor (矩阵) ---")
print(f"数据:\n{matrix}")
print(f"形状 (Shape): {matrix.shape}") # (2, 3) 表示2行3列
print("-" * 30)# --- 4. 创建3维Tensor (图片/Batch序列) ---
# 概念:一叠表格,有三个维度 (例如:Batch, Height, Width) 或 (Channel, Height, Width)
# 模拟一张灰度图 (1通道, 28x28像素)
img_tensor_gray = torch.randn(1, 28, 28) 
print("--- 3维Tensor (灰度图片) ---")
print(f"形状 (Shape): {img_tensor_gray.shape}") # (1, 28, 28)
print("-" * 30)# 模拟一个Batch的词嵌入向量 (Batch_size, Sequence_length, Embedding_dim)
batch_embeddings = torch.randn(4, 10, 768) 
print("--- 3维Tensor (Batch的词嵌入) ---")
print(f"形状 (Shape): {batch_embeddings.shape}") # (4, 10, 768)
print("-" * 30)# --- 5. Tensor与设备 (GPU vs CPU) ---
# 检查CUDA是否可用
if torch.cuda.is_available():device = torch.device("cuda")print(f"检测到GPU: {torch.cuda.get_device_name(0)}")
else:device = torch.device("cpu")print("未检测到GPU,使用CPU。")# 将Tensor移动到GPU
tensor_on_gpu = torch.tensor([1.0, 2.0, 3.0]).to(device)
print(f"Tensor在设备上: {tensor_on_gpu.device}")

代码解读】
运行这段代码,你会看到不同维度的Tensor是如何被创建的,以及它们的shape如何直观地反映其结构。特别注意device属性,它决定了你的计算是在CPU还是GPU上进行,这是深度学习高效计算的关键。

2.3 维度的魔法:Tensor的“整形”与“变形记”

维度的魔法

view vs. reshape:内容不变,形状变——AI数据的“整容术”

这两个方法都是用来改变Tensor形状的,它们改变的是Tensor的“高矮胖瘦”,但不改变Tensor内部数据的存储顺序。

共同点:
总元素数量不变:新形状的所有维度大小相乘,必须等于原Tensor的总元素数量。

不创建新数据:两者都不会复制底层数据,只是返回一个新的Tensor“视图”(view)。这意味着修改视图也会修改原始Tensor。

差异点:

view():要求原始Tensor的存储是连续的 (contiguous)。如果Tensor不是连续存储(例如,经过了某些
permute或transpose操作后),view()会报错。

reshape():更灵活。它不要求原始Tensor连续存储。如果Tensor不连续,reshape()会悄悄地在内部进行一次数据复制,使其变得连续,然后再返回视图。

【推荐】:在大多数情况下,直接使用reshape()更方便、更安全,因为它会自动处理连续性问题。

【应用场景】

展平图片:将[C, H, W]的图片展平为[CHW],以适应全连接层的输入。
调整Batch维度:将[B, L, D]的序列数据,在某些操作前展平为[B*L, D]。

通过图像数据的展平操作,直观感受view和reshape如何改变Tensor的“形状”。我们将使用view(-1)来自动推断维度。

代码演示

# case_10_1_tensor_operations.py (新文件或合并到之前文件)import torchprint("--- View / Reshape 实战:改变形状而不改变内容 ---")# 1. 准备一个2D矩阵
matrix_2d = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.float32) # 形状: [2, 3]
print(f"原始矩阵:\n{matrix_2d}\n形状: {matrix_2d.shape}")# 2. 使用 .view() 展平为1D向量
flat_view = matrix_2d.view(-1) # -1 表示自动推断总长度
print(f"使用 .view(-1) 展平:\n{flat_view}\n形状: {flat_view.shape}")# 3. 使用 .reshape() 改变形状
reshaped_matrix = matrix_2d.reshape(3, 2) # 形状: [3, 2]
print(f"使用 .reshape(3, 2) 变形:\n{reshaped_matrix}\n形状: {reshaped_matrix.shape}")# 4. 验证 View 和 Reshape 是视图(共享底层数据)
flat_view[0] = 99 # 修改视图的第一个元素
print(f"修改视图后,原始矩阵:\n{matrix_2d}") # 原始矩阵的对应元素也变了!
print("-" * 30)# 5. 图像展平以适应全连接层 (更实际的例子)
# 假设一张灰度图 (1通道, 28x28像素)
img_tensor = torch.randn(1, 28, 28) # 形状: [C, H, W]
print(f"原始图片Tensor形状 (C, H, W): {img_tensor.shape}")
# 展平为 [C*H*W] 的一维向量,例如作为全连接层输入
flattened_img = img_tensor.view(-1) 
print(f"展平后形状 (1D向量): {flattened_img.shape}") # 形状: [1*28*28] = [784]# 模拟Batch的处理 (例如,将[B, C, H, W]展平为[B, C*H*W])
batch_size_sim = 4
batch_images = torch.randn(batch_size_sim, 3, 28, 28) # 模拟4张28x28的彩色图
print(f"Batch图片原始形状: {batch_images.shape}")
# Batch维度保持不变,剩余维度展平
flattened_batch_images = batch_images.view(batch_size_sim, -1) 
print(f"Batch图片展平后形状: {flattened_batch_images.shape}")print("\n✅ View/Reshape:改变Tensor的“外部形状”,不改变内部数据顺序。")

代码解读】
运行这段代码,你会看到view和reshape如何轻松地改变Tensor的形状,且通过修改视图能影响原始Tensor,验证了它们是“视图”而非“复制”。这是将多维数据适配为线性层输入的核心操作。

2.3 permute vs. transpose:维度顺序变换——AI的“空间扭转术”

这两个方法都是用来交换Tensor维度的顺序的。它们不改变Tensor的元素数量和值,但会改变Tensor在内存中的存储顺序(如果原始Tensor是连续的,permute后可能变得不连续)。这就像你旋转魔方,方块的数量没变,但颜色面的朝向变了。

共同点:
都用于交换维度顺序。
不复制底层数据,返回视图。

差异点:
transpose(dim0, dim1):只能交换两个指定的维度。
permute(*dims):可以一次性重新排列所有维度,你需要传入一个表示新顺序的元组。

【推荐】:permute()更通用、更灵活,推荐使用。

【应用场景】
图像通道变换:将PyTorch习惯的[C, H, W]转换为matplotlib或某些模型要求的[H, W, C]。
多头注意力:将[B, L, head, dim]重新排列为[B, head, L, dim],以便并行计算注意力。
CNN层输入:某些框架的CNN层可能期望不同的维度顺序。

通过真实图像数据的维度变换,让你直观感受permute如何改变Tensor的“视角”。我们将使用简化后的数值矩阵来更清晰地展示数据流向。

# case_10_1_tensor_operations.py (续)import torch
import matplotlib.pyplot as plt
from PIL import Image
import torchvision.transforms as T
from io import BytesIO # 用于网络备用图
import requests
import numpy as np# --- 1. 准备一张本地图片Tensor (同前) ---
local_image_path = "example_image.jpg" # 请确保图片存在
try:input_image_pil = Image.open(local_image_path).convert("RGB").resize((100, 100)) # 缩小尺寸方便观察
except FileNotFoundError:url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/input_image.png"response = requests.get(url, stream=True)input_image_pil = Image.open(BytesIO(response.content)).convert("RGB").resize((100, 100))transform = T.Compose([T.ToTensor()])
image_tensor_chw = transform(input_image_pil) # 形状: [3, 100, 100] (C, H, W)
print("\n--- Permute / Transpose 实战:改变维度顺序 ---")
print(f"原始图像Tensor形状 (C, H, W): {image_tensor_chw.shape}")# --- 2. 使用 .permute() 将 [C, H, W] 变为 [H, W, C] ---
image_tensor_hwc_permute = image_tensor_chw.permute(1, 2, 0) 
# 1 -> H (新0维), 2 -> W (新1维), 0 -> C (新2维)
print(f"使用 .permute(1, 2, 0) 后形状 (H, W, C): {image_tensor_hwc_permute.shape}")# --- 3. 使用 .transpose() 验证其效果 (只能交换两个维度) ---
# 先将 [C, H, W] 中的 C 和 H 交换,得到 [H, C, W]
image_tensor_hcw_transpose = image_tensor_chw.transpose(0, 1) 
print(f"使用 .transpose(0, 1) 后形状 (H, C, W): {image_tensor_hcw_transpose.shape}")# --- 4. 可视化原始和Permute后的图片 ---
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
plt.imshow(input_image_pil)
plt.title("Original PIL Image")
plt.axis('off')plt.subplot(1, 3, 2)
# plt.imshow 默认期望 (H, W, C)
plt.imshow(image_tensor_hwc_permute.numpy()) # .numpy() 转为Numpy方便显示
plt.title("Tensor after Permute (H, W, C)")
plt.axis('off')# 示例:用一个小矩阵直观感受 permute 的数据重排
# 原始矩阵: dim0=行, dim1=列
simple_matrix = torch.tensor([[1, 2], [3, 4]]) # 形状: [2, 2]
print(f"\n小型演示矩阵:\n{simple_matrix}\n形状: {simple_matrix.shape}")
# 转置: 交换0维和1维
transposed_matrix = simple_matrix.permute(1, 0) # 等同于 simple_matrix.transpose(0, 1)
print(f"Permute(1,0)或Transpose(0,1)后:\n{transposed_matrix}\n形状: {transposed_matrix.shape}")
# 观察数据:[[1,3],[2,4]],确实是原矩阵的转置plt.subplot(1, 3, 3)
# 我们可以只显示其中一个通道的灰度图,例如红色通道
plt.imshow(image_tensor_hwc_permute[:, :, 0].numpy(), cmap='gray') # 只显示第一个通道 (红色)
plt.title("HWC Image - Red Channel")
plt.axis('off')plt.tight_layout()
plt.show()print("\n✅ Permute/Transpose:改变Tensor的“内部解读方式”,不改变内容。")

3. Batch:AI的“集装箱”——高效并行计算的艺术

自动化流水线

3.1 概念回顾:为什么AI总是“批发”数据?GPU的并行秘密

Batch (批次):将多个独立的样本(如图片、文本)打包成一个Tensor,一次性喂给AI模型。

GPU的本质:数千个并行处理器,为Batch计算而生。Batch越大,GPU利用率越高。

3.2 DataLoader:PyTorch的“自动化装箱员”

DataLoader封装了数据加载、批次打包、数据打乱等复杂操作,让你能高效地为模型提供“食粮”。

3.3 使用DataLoader加载批次数据,并可视化Batch的内部结构

使用MNIST数据集,通过DataLoader获取一个批次数据,并将其可视化,直观感受Batch中多个图片是如何排列的。

# case_10_1_dataloader_batch.py (继续或新文件)import torch
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
import numpy as np# --- 1. 定义数据加载超参数 ---
BATCH_SIZE = 64 # 每个批次包含64张图片
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")# --- 2. 加载MNIST数据集 ---
# 归一化到[-1, 1]或[0, 1]范围,这里使用To Tenosr默认归一化到[0, 1]
transform = transforms.ToTensor()train_dataset = datasets.MNIST('data', train=True, download=True, transform=transform)
train_loader = DataLoader(dataset=train_dataset, batch_size=BATCH_SIZE, shuffle=True)print("--- DataLoader与Batch ---")
print(f"数据集总样本数: {len(train_dataset)}")
print(f"每个Batch包含 {BATCH_SIZE} 张图片")
print(f"总共有 {len(train_loader)} 个Batch")# --- 3. 从DataLoader中获取第一个Batch ---
# next(iter(dataloader)) 用于获取迭代器中的第一个元素
first_batch_data, first_batch_labels = next(iter(train_loader))print(f"\n获取到第一个Batch的数据形状: {first_batch_data.shape}") # 应该为 [BATCH_SIZE, 1, 28, 28]
print(f"获取到第一个Batch的标签形状: {first_batch_labels.shape}") # 应该为 [BATCH_SIZE]# --- 4. 可视化Batch中的多张图片 ---
# 将Batch数据移动到CPU并转换为numpy
batch_images_np = first_batch_data.cpu().numpy()plt.figure(figsize=(10, 5))
for i in range(min(BATCH_SIZE, 10)): # 显示Batch中的前10张图片plt.subplot(2, 5, i + 1) # 2行5列的子图布局plt.imshow(batch_images_np[i].squeeze(), cmap='gray') # .squeeze() 移除单维度通道plt.title(f"Label: {first_batch_labels[i].item()}")plt.axis('off')
plt.suptitle(f"第一个Batch中的前{min(BATCH_SIZE, 10)}张图片", fontsize=16)
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
plt.show()print("\n✅ 成功!你已亲眼看到Batch中数据是如何组织的。")

【代码解读】
这段代码将通过实际的图像数据和简化的小矩阵,清晰地展示permute和transpose的作用。**关键是观察打印出来的形状和数据,理解它们如何被“重新组织”的。**特别是小矩阵的例子,能让你一眼看出数据是如何从行变列的。

4. 综合应用:看一个Batch如何在模型中“流动”

数据流动

# dimension_flow_demo.pyimport torch
import torch.nn as nn
import torch.nn.functional as F# --- 定义通用超参数 ---
BATCH_SIZE = 4
EMBED_DIM = 768 # 假设嵌入维度
MAX_SEQ_LEN = 10 # 假设序列长度# --- 1. 语言模型中的维度流转演示 ---
# 目标: [B, L] -> [B, L, D] -> [B, L, D] -> [B, L, V]class LanguageModelSkeleton(nn.Module):def __init__(self, vocab_size, embed_dim, num_transformer_layers, max_seq_len):super().__init__()self.vocab_size = vocab_sizeself.embed_dim = embed_dim# 词嵌入层 (将 Token ID 转换为语义向量)self.token_embedding = nn.Embedding(vocab_size, embed_dim)# 模拟Transformer Blocks (这里使用 nn.TransformerEncoderLayer 简化)# LLaMA / GPT 等模型会堆叠多个这样的 Blockself.transformer_layers = nn.ModuleList([nn.TransformerEncoderLayer(d_model=embed_dim, nhead=8, dim_feedforward=embed_dim*4, batch_first=True) for _ in range(num_transformer_layers)])# 输出层 (将最终的语义向量映射回词汇表大小,用于预测下一个词)self.lm_head = nn.Linear(embed_dim, vocab_size)def forward(self, input_ids):print("\n--- 语言模型维度流转 ---")print(f"1. 输入Token IDs: {input_ids.shape}  [B, L]")# Step 1: 嵌入层 (Embedding Layer)# 将 [B, L] 的 Token IDs 映射为 [B, L, D] 的语义向量embeddings = self.token_embedding(input_ids)print(f"2. 经过Embedding层后: {embeddings.shape}  [B, L, D]")# Step 2: Transformer Blocks (核心处理层)# Transformer Block 保持输入输出形状不变: [B, L, D] -> [B, L, D]x = embeddingsfor i, layer in enumerate(self.transformer_layers):x = layer(x) # 实际可能需要 mask,这里只演示形状print(f"3.{i+1} 经过Transformer Block {i+1} 后: {x.shape}  [B, L, D] (形状不变)")# Step 3: 输出层 (LM Head)# 将 [B, L, D] 映射为 [B, L, V] 的 Logits (预测分数)logits = self.lm_head(x)print(f"4. 经过输出层 (LM Head) 后: {logits.shape}  [B, L, V]")return logits# --- 2. 图像模型中的维度流转演示 ---
# 目标: [B, C, H, W] -> [B, N_pixels, D] -> [B, N_pixels, D] -> [B, Num_Classes]class ImageModelSkeleton(nn.Module):def __init__(self, num_classes, embed_dim, patch_size, img_size, num_transformer_layers):super().__init__()self.num_classes = num_classes# 模拟Patch Embedding层 (例如 ViT 的 Patch Embedding)# 它将 [B, C, H, W] 转换为 [B, N_patches, D]self.patch_embedding = nn.Conv2d(3, embed_dim, kernel_size=patch_size, stride=patch_size)self.flatten = nn.Flatten(2) # 将 (C, H, W) 展平为 (Num_Patches, D)# 添加一个可学习的分类Token,通常形状为 [1, 1, embed_dim]self.cls_token = nn.Parameter(torch.randn(1, 1, embed_dim)) # 模拟Transformer Encoder (例如 ViT 的 Encoder)self.transformer_encoder_layers = nn.ModuleList([nn.TransformerEncoderLayer(d_model=embed_dim, nhead=8, dim_feedforward=embed_dim*4, batch_first=True)for _ in range(num_transformer_layers)])# 分类头 (Classifier Head)# 通常只取第一个Token (CLS Token) 的输出来进行分类self.classifier_head = nn.Linear(embed_dim, num_classes)def forward(self, images):print("\n--- 图像模型维度流转 ---")print(f"1. 原始图像 (输入模型): {images.shape}  [B, C, H, W]")# Step 1: 图像预处理 (Patch Embedding)# Conv2d -> [B, D, H/patch_size, W/patch_size]# flatten -> [B, D, N_patches]# permute -> [B, N_patches, D]patch_embeds = self.patch_embedding(images)patch_embeds = self.flatten(patch_embeds).permute(0, 2, 1) # [B, N_patches, D]# 添加分类Tokencls_tokens = self.cls_token.expand(images.shape[0], -1, -1) # 扩展到Batch维度# 将CLS Token拼接到Patch Embeddings前面x = torch.cat((cls_tokens, patch_embeds), dim=1) # [B, N_patches+1, D]print(f"2. 经过Patch Embedding与CLS Token后: {x.shape}  [B, N_patches+1, D]")# Step 2: Transformer Encoder (核心处理层)# Transformer Encoder 保持输入输出形状不变: [B, N_seq, D] -> [B, N_seq, D]for i, layer in enumerate(self.transformer_encoder_layers):x = layer(x)print(f"3.{i+1} 经过Transformer Encoder Block {i+1} 后: {x.shape}  [B, N_seq, D] (形状不变)")# Step 3: 分类头 (Classifier Head)# 仅取第一个Token (CLS Token) 的输出来进行分类cls_output = x[:, 0, :] # 形状: [B, D]logits = self.classifier_head(cls_output)print(f"4. 经过分类头后: {logits.shape}  [B, Num_Classes]")return logits# --- 主运行部分 ---
def main():# --- 语言模型演示 ---vocab_size_lang = 30000num_layers_lang = 2 # 简化层数lang_model = LanguageModelSkeleton(vocab_size_lang, EMBED_DIM, num_layers_lang, MAX_SEQ_LEN)dummy_input_ids = torch.randint(0, vocab_size_lang, (BATCH_SIZE, MAX_SEQ_LEN))lang_model(dummy_input_ids)# --- 图像模型演示 ---num_classes_img = 100patch_size_img = 16img_size_img = 224num_layers_img = 2 # 简化层数img_model = ImageModelSkeleton(num_classes_img, EMBED_DIM, patch_size_img, img_size_img, num_layers_img)dummy_input_images = torch.randn(BATCH_SIZE, 3, img_size_img, img_size_img) # RGB图像img_model(dummy_input_images)if __name__ == "__main__":main()

代码解读与见证奇迹】
完整可运行:这是一个可以直接运行的Python脚本。
骨架模型:我们定义了两个“骨架”模型LanguageModelSkeleton和ImageModelSkeleton。它们只包含了关键的网络层(nn.Embedding,nn.Linear,nn.TransformerEncoderLayer等),但没有进行复杂的权重初始化和训练。它们的唯一目的就是展示数据在其中的维度变化。
维度追踪:在每个关键步骤后,我们都用print(f"形状: {tensor.shape}")来清晰地展示当前Tensor的形状。
语言模型流转:你会看到输入[B, L]如何通过nn.Embedding变成[B, L, D],经过nn.TransformerEncoderLayer(形状保持不变),最终被nn.Linear映射成[B, L, V]的Logits。
图像模型流转:你会看到原始图像[B, C, H, W]如何通过nn.Conv2d模拟的Patch Embedding和nn.Flatten变成[B, N_pixels, D],经过nn.TransformerEncoderLayer(形状保持不变),最终被nn.Linear映射成[B, Num_Classes]的分类结果。
【结论】
运行这段代码,你将亲眼看到并理解,无论是文本还是图像,它们在进入Transformer这类复杂模型后,是如何被标准化为[B, L, D]或[B, N_pixels, D]这种序列形式,然后在模型核心中进行形状不变的加工,最终再根据任务(生成文本或分类图像)转换到对应的输出形状。这是理解所有现代大模型代码的“地图”和“GPS”

5. 总结:你已掌握AI世界的“数字语言”。

恭喜你!今天你已经通过大量的代码实战,对Tensor这一AI世界的“原子”,以及Batch这个“集装箱”有了深刻的理解和操作经验。
✨ 本章惊喜概括 ✨

你掌握了什么?对应的核心操作/概念
Tensor基础与属性✅ 0D-3D Tensor创建,shape, dtype, device
Tensor维度变换✅ view/reshape用于“整形”,permute用于“扭转”
Batch数据处理✅ DataLoader装箱,Batch对GPU并行计算的重要性
数据流转地图✅ 理解[B, L, D]等维度在模型中的常见流转
你不再只是“听说过”Tensor,而是能够熟练地创建、操作、甚至在脑中“看到”它的“变形记”。这份“数字语言”的功底,将是你阅读和编写任何PyTorch深度学习代码的坚实基础。
🔮 敬请期待! 在下一章**《AI的“思考引擎”:神经网络、损失与优化器的核心机制》**中,我们将把今天掌握的“数字语言”应用起来,亲手搭建一个简单的神经网络,并驱动它完成“学习”过程。你将看到数据如何在你的模型中,一步步地被加工、评估、然后被优化!
http://www.dtcms.com/a/308572.html

相关文章:

  • Windows 安全中心是什么?如何关闭 Windows 11 的安全中心
  • 算法导论第三版代码python实现与部分习题答案-第六章:堆排序
  • DooTask非营利性组织:让高效协作触手可及
  • Day 5: 深度学习理论与PyTorch实现 - 神经网络训练的艺术
  • RocketMQ消息队列:从入门到Spring Boot实战
  • 【React】fiber 架构
  • OS架构整理
  • Spring Boot音乐服务器项目-移除喜欢和操作
  • C语言07
  • 【n8n】mysql凭证设置,及注意问题
  • 智能交通顶刊TITS论文分享|跨区域自适应车辆轨迹预测:TRACER框架攻克域偏移难题!
  • Linux进程创建,终止与等待
  • 哈希的概念及其应用
  • Java学习------Executor框架
  • C++语言的发展历程、核心特性与学习指南
  • Tang Prime 20K板OV5640例程
  • 【软件架构】八大架构解析
  • 点控云数据洞察智能体:让汽车行业决策有据可循,让业务增长稳健前行
  • OpenCV 的 Mat 类详解
  • 亚马逊自然流量增长密码:从算法逻辑到运营体系的全维度解析
  • WSL配置网络说明
  • 太阳光模拟器测试包装材料的耐候性
  • SUID/SGID是啥?如何让普通用户拥有root的能力?
  • WinForm之CheckBox 控件
  • Conda环境下配置的基本命令
  • 【Android】PopupWindow实现长按菜单
  • 难以逾越的夏天
  • 小架构step系列31:处理异常
  • documentPictureInPicture API 教程
  • IK 字段级别词典的升级之路