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

用1W字讲透数据预处理,数据增强

大家好!我是我不是小upper~

今天咱们来聊聊数据增强 —— 这个在机器学习领域堪称 “数据魔法” 的实用技术!

在深度学习的世界里,数据就像模型的 “养分”。数据的质量和数量,直接决定了模型最终能达到的 “高度”。当数据不足时,模型很容易陷入 “学不透彻” 的困境,甚至出现严重的过拟合问题,就像只背答案却不理解原理的学生,换道题就不会做了。而数据增强,正是解决这一难题的关键 —— 它能以巧妙的方式 “扩充” 数据集,让模型在有限的数据基础上,也能获得更丰富的学习素材。

打个形象的比方:如果想让小朋友真正认识 “猫”,只给他看一张照片显然不够。这张照片里的猫或许是橘色的,正趴在阳光下,角度也很固定。这样一来,小朋友可能会误以为 “猫都是橘色、趴着且在阳光下的样子”。但如果给他展示不同角度、毛色、姿态的猫,再搭配昏暗、明亮等各种光线条件下的照片,他就能快速掌握 “猫” 这个概念的本质特征。

数据增强的核心思路,就藏在这个简单的例子里:通过对原始数据进行多样化的变换,人为创造出更多具有差异性的样本,让模型在学习过程中接触到更广泛的 “数据变化”。这样一来,模型不仅能记住数据表面的特征,还能挖掘出内在规律,从而提升泛化能力,在面对新数据时表现得更加稳健!


在机器学习与深度学习领域,数据增强已成为提升模型性能的关键技术之一。接下来,我们将从作用、常见方法、原理详解三个维度,深入剖析数据增强技术,结合具体案例与公式,帮助大家全面理解其背后的逻辑。

一、数据增强的核心作用

1. 有效增加数据量

在实际项目中,收集大规模高质量的原始数据往往面临成本高、难度大等问题。数据增强技术通过对原始数据进行各种变换操作,能从有限的样本中扩展出大量新样本。例如,对于仅有 100 张图片的图像数据集,通过水平翻转、旋转等增强操作,可将数据集扩充至数百甚至上千张,极大缓解数据稀缺问题。

2. 显著提高模型泛化能力

模型的泛化能力指的是在面对未见过的数据时,模型依然能保持良好的预测效果。数据增强通过人为引入数据的多样性,让模型接触到更多不同形态的数据样本。例如,在图像识别任务中,对训练图像进行亮度、对比度调整,模型能学习到图像在不同光照条件下的特征,从而在测试阶段遇到类似变化的图像时,也能准确识别。

3. 大幅减少过拟合风险

过拟合是指模型在训练数据上表现优异,但在测试数据上却表现不佳,即模型过度 “记忆” 了训练数据的特征,而未学习到数据的通用规律。数据增强通过增加数据的多样性,迫使模型学习更具普适性的特征,避免模型 “死记硬背” 训练数据。例如,在文本分类任务中,对文本进行同义词替换、语序调整等增强操作,能使模型学习到文本的语义本质,而非仅仅记住特定的词语组合。

二、常见的数据增强方法

数据增强方法会根据数据类型的不同而有所差异,下面我们分别介绍图像、文本和音频数据的常用增强方法。

1. 图像数据增强方法

  • 翻转操作:包括水平翻转和垂直翻转。例如,将一张猫的图片进行水平翻转,得到一张新的猫的图片,猫的朝向发生了变化,但依然属于猫这个类别。
  • 几何变换
    • 旋转:将图像围绕中心旋转一定角度,如 90°、180° 等。
    • 缩放:对图像进行放大或缩小操作,可分为等比例缩放和非等比例缩放。
    • 平移:将图像在水平或垂直方向上进行移动,模拟图像在不同位置的场景。
  • 裁剪与添加噪声
    • 裁剪:从图像中裁剪出部分区域作为新样本,包括随机裁剪和中心裁剪等方式。
    • 加噪声:向图像中添加高斯噪声、椒盐噪声等,模拟图像在实际采集过程中受到的干扰。
  • 颜色调整
    • 调整亮度和对比度:通过改变图像的亮度和对比度,使图像变亮、变暗或增强色彩鲜明度。
    • 颜色扰动:对图像的色调、饱和度和明度进行随机调整,丰富图像的颜色表现。
  • 仿射变换:包括平移、旋转、缩放和错切等组合变换,通过矩阵运算实现对图像的线性变换,保持图像的几何结构关系。

2. 文本数据增强方法

  • 同义词替换:在句子中找到合适的词语,用其同义词进行替换。例如,将 “今天天气很好” 替换为 “今天天气很棒”,句子语义基本不变,但词语表达发生了变化。
  • 随机插入或删除词语
    • 插入:在句子中随机插入一些无关紧要的词语,如 “的”“了”“在” 等,增加文本的多样性。
    • 删除:随机删除句子中的某些词语,测试模型对信息缺失的鲁棒性。
  • 改变句子结构:通过调整句子的语序、使用不同的句式(如主动句变被动句)等方式,在保持语义的前提下改变文本的表达方式。例如,“我吃了苹果” 改为 “苹果被我吃了” 。

3. 音频数据增强方法

  • 改变语速或音调
    • 改变语速:加快或减慢音频的播放速度,使音频时长发生变化,同时语音频率也相应改变。
    • 改变音调:调整音频的音高,使声音变高或变低,模拟不同人说话的音调差异。
  • 添加背景噪声:向音频中混入各种背景噪声,如嘈杂的人声、风声、机器声等,模拟音频在实际环境中的采集情况。
  • 剪切、拼接音频段
    • 剪切:从音频中截取部分片段作为新样本,可用于模拟音频的局部内容。
    • 拼接:将不同的音频片段组合在一起,创造出新的音频样本,如将两段不同的音乐片段拼接成一段新的音乐。

三、原理详解

1. 学习任务的基本数学建模

在监督学习中,模型的目标是从给定的数据集中学习一个映射函数 f: \mathcal{X} \to \mathcal{Y},其中:

  • \mathcal{X} 表示输入空间,可以是图像、文本、音频等不同类型的数据。
  • \mathcal{Y} 表示输出空间,通常为分类标签(如 “猫”“狗”)或回归值(如预测的房价数值)。

训练集由 n 个样本组成,表示为:

\mathcal{D} = \{(x_i, y_i)\}_{i = 1}^{n}

其中 x_i \in \mathcal{X} 是输入样本,y_i \in \mathcal{Y} 是对应的标签。

模型的学习目标是通过最小化期望风险(Expected Risk)R(f) 来优化自身参数,期望风险的定义为:

R(f) = \mathbb{E}_{(x,y) \sim p(x,y)} [L(f(x), y)]

其中,L 是损失函数,用于衡量模型预测值 f(x) 与真实标签 y 之间的差异;p(x,y) 是数据的真实分布。

然而,在实际应用中,数据的真实分布 p(x,y) 往往是未知的,因此通常使用经验风险(Empirical Risk) \hat{R}(f) 来替代期望风险,经验风险的计算公式为:

\hat{R}(f) = \frac{1}{n} \sum_{i = 1}^{n} L(f(x_i), y_i) 

即通过计算训练集中所有样本的损失函数平均值,来近似模型在真实数据上的表现。

2. 数据增强的引入:数学视角

数据增强的核心思想是构造一个增强变换 T,对原始数据进行变换,同时保持标签不变或遵循一定的变换规则。以图像分类任务为例,对于原始图像样本 x 及其标签 y,数据增强后的样本表示为 T(x),且标签仍为 y,即:

(x, y) \rightarrow (T(x), y)

从数学角度看,数据增强可以理解为构造一个新的数据分布 p_{aug}(x,y),以模拟原始分布 p(x,y) 的变化形式。新的数据分布可表示为:

p_{aug}(x,y) = \int_{t \in \mathcal{T}} p(x) \cdot p(t) \cdot \delta(y - y') \cdot \delta(x' - T(x; t)) \, dt

 其中:

  • \mathcal{T} 是增强变换的集合,包含各种数据增强操作(如旋转、裁剪等)。
  • p(t) 是对变换的采样分布,通常采用均匀分布或高斯分布,表示从增强变换集合中选择某种变换的概率。
  • \delta 是狄拉克函数,用于确保增强后的样本 x' = T(x; t) 与其对应的标签 y' = y 保持一致性。

这一过程体现了 “局部平滑假设”:在局部区域内,对数据进行小幅度的扰动(即增强变换)不应改变其标签。例如,对一张猫的图像进行小角度旋转,图像内容依然属于 “猫” 这个类别,标签保持不变。

3. 泛化误差分析中的作用

数据增强的重要目标之一是提升模型的泛化能力,即降低模型在未知数据上的泛化误差。泛化误差定义为模型在真实分布上的期望风险与在训练集上的经验风险之差:

当数据增强被合理设计时,它可以从以下几个方面降低泛化误差:

  • 增加样本多样性:通过引入更多不同形态的数据样本,使模型能够学习到更广泛的数据特征,从而更好地适应真实数据分布。
  • 增强模型鲁棒性:让模型对输入空间的小扰动具有更强的适应性。例如,在图像数据中添加噪声进行增强,训练后的模型在面对实际场景中带有噪声的图像时,依然能够准确识别。
  • 促使模型学习平滑函数:数据增强促使模型在决策边界附近学到更平滑的函数。例如,在分类任务中,通过对边界附近的样本进行增强,模型能够更准确地区分不同类别,避免决策边界过于复杂导致过拟合。

这些效果与机器学习中的稳定性理论密切相关。如果数据增强能够使学习算法在对输入进行小扰动时,输出不发生显著变化(即模型稳定),根据学习稳定性理论,模型的泛化误差界将更小。

定义模型对输入扰动的敏感度为:

\epsilon(f) = \sup_{x \in \mathcal{X}, \| \Delta x \| \leq \delta} \| f(x + \Delta x) - f(x) \|

其中,\Delta x 是输入 x 的扰动,\delta 是扰动的幅度限制。

数据增强的目标是通过设计合适的变换 T,使得敏感度 \epsilon(f) 尽可能小,即:

\min_{T \in \mathcal{T}} \epsilon(f_T)

这意味着数据增强促使学习算法具备更高的局部一致性,在输入发生小幅度变化时,模型输出保持稳定,从而有效降低泛化误差,提升模型的泛化能力。


四、完整案例

这里,咱们以 PyTorch 框架为基础,结合 CIFAR-10 图像分类任务,全面展示数据增强的实际应用

包括:

  • 多种图像增强方法的组合与实现

  • 增强前后图像的可视化对比

  • 模型训练过程中的性能对比分析

  • 算法优化建议与实验结果

代码实现

包括数据加载、增强、可视化、模型训练与评估等步骤。

1. 导入必要的库
import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import time

这里导入了 PyTorch 及其视觉库 torchvision 用于数据处理和模型搭建;matplotlib 和 seaborn 用于可视化;numpy 处理数组;time 用于计算训练耗时。 

2. 设置设备 
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Using device: {device}") 

这里导入了 PyTorch 及其视觉库 torchvision 用于数据处理和模型搭建;matplotlib 和 seaborn 用于可视化;numpy 处理数组;time 用于计算训练耗时。

3. 定义数据增强策略
# 训练集增强
train_transform = transforms.Compose([transforms.RandomHorizontalFlip(),transforms.RandomRotation(15),transforms.RandomCrop(32, padding=4),transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),transforms.ToTensor(),transforms.Normalize((0.5,), (0.5,))
])# 测试集不进行增强
test_transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,), (0.5,))
])
  • 训练集增强
    • RandomHorizontalFlip()以 50% 的概率水平翻转图像,模拟同一物体的左右视角差异。例如,将一张面向左侧的汽车图像翻转后,变为面向右侧,让模型学习物体的对称性。
    • RandomRotation(15)在 -15° 到 15° 之间随机旋转图像,模拟拍摄时角度的微小偏差,增强模型对旋转的鲁棒性。
    • RandomCrop(32, padding=4)先在图像边缘填充 4 个像素,再随机裁剪出 32×32 的区域。这模拟了拍摄时物体在画面中的不同位置,让模型学会识别部分遮挡的物体。
    • ColorJitter(...)随机调整图像的亮度、对比度、饱和度和色调,模拟不同光照条件和色彩风格。例如,将明亮的图像变暗,或将鲜艳的颜色调淡,训练模型适应复杂的光照环境。
    • ToTensor()将 PIL 图像转换为 PyTorch 张量,并将像素值归一化到 [0, 1]。
    • Normalize((0.5,), (0.5,))对图像进行标准化,将像素值调整为均值 0、标准差 1,加速模型训练时的收敛速度。
  • 测试集不增强:仅进行张量转换和标准化,确保测试数据与真实场景一致,避免人为引入偏差。

4. 加载数据集

train_dataset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=train_transform)
test_dataset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=test_transform)train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=128, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=128, shuffle=False)

从本地或远程下载 CIFAR-10 数据集,分别构建训练集和测试集,并使用 DataLoader 按批次加载数据。训练集打乱数据顺序(shuffle=True),帮助模型学习更具泛化性的特征;测试集保持顺序不变,确保评估结果的一致性。

5. 可视化增强前后的图像

# 获取一批图像
dataiter = iter(train_loader)
images, labels = next(dataiter)# 定义类别标签
classes = ('plane', 'car', 'bird', 'cat', 'deer','dog', 'frog', 'horse','ship', 'truck')# 显示图像
def imshow(img):img = img / 2 + 0.5  # 反标准化npimg = img.numpy()plt.figure(figsize=(10, 4))plt.imshow(np.transpose(npimg, (1, 2, 0)))plt.title("Augmented Images")plt.axis('off')plt.show()# 显示前16张图像
imshow(torchvision.utils.make_grid(images[:16]))

上述代码是随机选取了一批训练图像,通过 imshow 函数将张量转换回图像格式并可视化。观察增强后的图像,你会发现同一类别的图像呈现出丰富的变化,如颜色、角度和位置差异,这为模型提供了更多学习样本。 

6. 定义卷积神经网络

import torch.nn as nn
import torch.nn.functional as Fclass SimpleCNN(nn.Module):def __init__(self):super(SimpleCNN, self).__init__()self.conv1 = nn.Conv2d(3, 32, 3, padding=1)  # 输入通道数3,输出通道数32,卷积核大小3self.pool = nn.MaxPool2d(2, 2)  # 池化层,窗口大小2self.conv2 = nn.Conv2d(32, 64, 3, padding=1)self.fc1 = nn.Linear(64 * 8 * 8, 512)  # 全连接层self.fc2 = nn.Linear(512, 10)  # 输出层,10个类别def forward(self, x):x = self.pool(F.relu(self.conv1(x)))  # 卷积 -> ReLU -> 池化x = self.pool(F.relu(self.conv2(x)))x = x.view(-1, 64 * 8 * 8)  # 展平x = F.relu(self.fc1(x))x = self.fc2(x)return x
  • 卷积层conv1 和 conv2 通过卷积操作提取图像的局部特征,增加通道数以捕捉更复杂的信息。
  • 池化层pool 采用最大池化,降低图像尺寸,减少计算量,同时保留主要特征。
  • 全连接层fc1 和 fc2 将卷积层输出的特征向量映射到 10 个类别,输出最终的分类结果。

7. 训练模型

net = SimpleCNN().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(net.parameters(), lr=0.001)num_epochs = 10
train_losses = []
test_losses = []
test_accuracies = []for epoch in range(num_epochs):net.train()running_loss = 0.0for inputs, labels in train_loader:inputs, labels = inputs.to(device), labels.to(device)optimizer.zero_grad()outputs = net(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()train_losses.append(running_loss / len(train_loader))# 测试集评估net.eval()correct = 0total = 0test_loss = 0.0with torch.no_grad():for inputs, labels in test_loader:inputs, labels = inputs.to(device), labels.to(device)outputs = net(inputs)loss = criterion(outputs, labels)test_loss += loss.item()_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()test_losses.append(test_loss / len(test_loader))accuracy = 100 * correct / totaltest_accuracies.append(accuracy)print(f"Epoch {epoch+1}/{num_epochs}, "f"Train Loss: {train_losses[-1]:.4f}, "f"Test Loss: {test_losses[-1]:.4f}, "f"Accuracy: {accuracy:.2f}%")
  • 初始化模型、损失函数和优化器:使用 CrossEntropyLoss 计算分类损失,Adam 优化器更新模型参数。
  • 训练循环:每个 epoch 中,模型在训练集上进行前向传播、计算损失、反向传播更新参数,并记录训练损失;在测试集上评估模型性能,计算测试损失和准确率。

8. 绘制训练过程图表

epochs = range(1, num_epochs + 1)plt.figure(figsize=(12, 5))# 绘制损失曲线
plt.subplot(1, 2, 1)
plt.plot(epochs, train_losses, 'bo-', label='Train Loss')
plt.plot(epochs, test_losses, 'ro-', label='Test Loss')
plt.title('Loss over Epochs')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()# 绘制准确率曲线
plt.subplot(1, 2, 2)
plt.plot(epochs, test_accuracies, 'go-', label='Test Accuracy')
plt.title('Test Accuracy over Epochs')
plt.xlabel('Epoch')
plt.ylabel('Accuracy (%)')
plt.legend()plt.tight_layout()
plt.show()

通过可视化训练和测试损失、测试准确率随 epoch 的变化,直观展示模型的学习过程和性能提升效果。


结果与分析

1. 数据增强策略解读

  • 提升数据多样性:通过水平翻转、旋转、裁剪和颜色调整,训练集图像呈现出丰富的变化,模拟了现实场景中物体的不同姿态、光照和位置。
  • 降低过拟合风险:增强后的数据迫使模型学习更通用的特征,避免记忆训练数据的细节,从而提高泛化能力。

2. 模型结构解析

SimpleCNN 虽然结构简单,但通过卷积层提取图像特征,池化层降维,全连接层分类,在 CIFAR-10 数据集上已能取得较好的效果。结合数据增强,模型性能进一步提升。

3. 训练结果分析

观察绘制的图表,你会发现:

  • 损失曲线:训练损失逐渐下降,测试损失也随之降低,且两者差距较小,说明模型未出现严重过拟合。
  • 准确率曲线:测试准确率随训练进行稳步提升,最终达到较高水平,验证了数据增强对模型泛化能力的积极作用。


数据增强策略深度解析

  1. RandomHorizontalFlip():该策略以 50% 的概率对图像进行水平翻转操作,模拟现实中物体左右视角的变化情况。比如在行人检测任务中,行人可能从左侧或右侧进入画面,通过水平翻转,能让模型学习到同一物体不同方向的特征,避免因只见过单一方向的图像而产生识别偏差。
  2. RandomRotation(15):此策略会在 [-15°, 15°] 的角度范围内对图像进行随机旋转。在实际场景中,拍摄角度不可能完全一致,这种旋转操作能够增强模型对物体不同倾斜角度的识别能力。例如在车牌识别任务里,车辆停放角度的不同可能导致车牌出现一定程度的倾斜,经过旋转增强的训练数据,能让模型更好地适应此类情况,提升旋转鲁棒性。
  3. RandomCrop(32, padding=4):首先在图像边缘填充 4 个像素,然后随机裁剪出 32x32 的区域。这一操作模拟了拍摄时物体在画面中位置的偏移,也模拟了部分遮挡的情况。在花卉识别任务中,花朵可能不会始终处于画面正中间,通过随机裁剪,模型可以学习到不同位置和部分遮挡下花卉的特征,提高对复杂场景的适应能力。
  4. ColorJitter(...):该策略可以随机调整图像的亮度、对比度、饱和度和色调,能够模拟不同光照条件和色彩风格。比如在街景识别中,白天和夜晚的光照差异巨大,阴天和晴天的色彩风格也不同,通过颜色扰动,模型能够学习到在各种光照和色彩变化下物体的特征,增强对光照变化的适应能力。
  5. ToTensor():将 PIL 格式的图像转换为 Tensor 格式,同时把像素值归一化到 [0,1] 区间。这是深度学习框架处理图像数据的标准格式转换,归一化操作能使数据分布更符合模型训练的要求,方便后续的计算和处理。
  6. Normalize((0.5,), (0.5,)):对图像进行标准化处理,使得图像的均值为 0,标准差为 1。在模型训练过程中,标准化后的数据能够让梯度更新更加稳定,加速模型的收敛速度,减少训练所需的时间和计算资源。

模型结构深度剖析

SimpleCNN 模型采用经典的卷积神经网络架构,由两个卷积层和两个全连接层构成,这种简洁的结构非常适合像 CIFAR - 10 这样的基础图像分类任务。

  1. conv1作为模型的第一层卷积层,它的输入通道数为 3,对应彩色图像的 RGB 三个通道。输出通道数为 32,意味着经过卷积操作后,会提取出 32 种不同的图像特征。卷积核大小为 3x3,使用填充(padding)操作保持图像尺寸不变,这样可以保证在提取特征的过程中,图像边缘的信息不会丢失,让模型能够充分利用图像的所有信息。
  2. pool最大池化层的窗口大小为 2x2,它的主要作用是对卷积层输出的特征图进行下采样。通过选取每个 2x2 区域内的最大值,不仅可以降低数据维度,减少计算量,还能突出图像中最显著的特征,提高模型的计算效率和特征表达能力。
  3. conv2第二层卷积层的输入通道数为 32,即上一层卷积层输出的特征图数量。输出通道数增加到 64,进一步提取更复杂、更抽象的图像特征。同样采用 3x3 的卷积核,继续对图像进行特征提取和变换。
  4. fc1(全连接层 1)该层接收上层经过卷积和池化操作后展平的向量,其维度为 64×8×8。通过全连接操作,将这些特征映射到 512 维的特征空间中。同时使用 ReLU 激活函数,它能够引入非线性因素,打破数据之间的线性关系,让模型学习到更复杂的函数映射,提高模型的表达能力。
  5. fc2(全连接层 2)作为模型的最后一层,它将上一层输出的 512 维特征向量映射到 10 个类别的得分(logits)。这 10 个得分将作为 softmax 函数的输入,softmax 函数会将这些得分转换为属于每个类别的概率,从而实现图像的分类任务。

虽然 SimpleCNN 网络结构相对简单,但通过合理的数据增强策略与之配合,在 CIFAR - 10 数据集上能够获得较为理想的分类效果,是初学者学习卷积神经网络和数据增强技术的绝佳范例。

总结

在图像领域的深度学习任务中,数据增强已经成为不可或缺的关键预处理步骤。它通过对原始训练数据进行多样化的变换操作,极大地丰富了数据的多样性。这种多样性能够让模型接触到更多不同形态的图像数据,从而提升模型对各种图像扰动的抵抗能力,即增强模型的鲁棒性。

数据增强的另一个重要作用是有效缓解模型的过拟合问题。当训练数据有限时,模型容易过度学习训练数据中的特定特征,导致在测试数据上表现不佳。而数据增强通过扩充数据集,使模型能够学习到更具普遍性的特征,增强模型的泛化能力,让模型在面对未见过的数据时也能做出准确的预测。特别是在数据量不足或存在类别不平衡问题时,数据增强更是提升模型性能的关键手段,能够显著提高模型的准确性和稳定性,为深度学习模型的成功应用奠定坚实基础。

相关文章:

  • C++ 迭代器
  • 【深度学习】目标检测算法大全
  • 从模型加密到授权交付,CodeMeter赋能3D打印商业化全流程
  • 【Nginx配置域名以及ssl证书】
  • 学习黑客5 分钟深入浅出理解Windows User Accounts, Profiles, and Permissions
  • Spring Boot 的 CommandLineRunner
  • Docker原理与使用教程
  • WebSocket集成方案对比
  • 测试文章标题01
  • 用Trae+Claude写一个学习网络基础的小网站
  • 【Python 变量类型】
  • 日常组件复用与基于构件开发的本质区别
  • MySQL 学习(七)undo log、redo log、bin log 的作用以及持久化机制
  • 多令牌预测Multi-Token Prediction(MTP)
  • 高防云的主要优势表现在哪些方面?
  • RabbitMQ 工作模式
  • Android音频解码中的时钟同步问题:原理、挑战与解决方案
  • Power BI 实操案例,将度量值转化为切片器(动态切换分析指标)
  • Redis——达人探店
  • 产品思维30讲-(梁宁)--实战2
  • 缺字危机:一本书背后有多少“不存在”的汉字?
  • 从普通人经历中发现历史,王笛解读《线索与痕迹》
  • 美股全线收涨:道指涨逾千点,纳斯达克中国金龙指数涨5.4%
  • 上海能源科技发展有限公司原董事长李海瑜一审获刑13年
  • 退休10年后,70岁成都高新区管委会原巡视员王晋成被查
  • 甩掉“肥胖刺客”,科学减重指南来了