时间卷积网络(TCN)原理+代码详解

TCN(时间卷积网络)详解 本文详细介绍了时间卷积网络的结构以及设计原理 阅读详情
AI摘要

本文先回顾传统循环神经网络(RNN)处理长序列的缺点,引出时间卷积网络(TCN)。详细解析了 TCN 的原理,包括因果卷积和扩张卷积,突破了 RNN 的瓶颈。还介绍了代码实现,如 Chomp1d、TemporalBlock、TemporalConvNet 模块及完整代码示例,适用于长时间序列数据。

  在理解 TCN 的原理之前,我们可以先对传统的循环神经网络(RNN)进行简要回顾。RNN 是处理序列数据的常用方法,其核心思想是通过将前一个时间步的隐藏状态传递到下一个时间步,实现对序列依赖关系的建模。然而,RNN 在处理长序列时存在以下几个缺点:

  • 无法并行计算:RNN 的计算依赖于时间步的顺序,导致无法高效利用 GPU 并行计算。

  • 梯度消失/爆炸:在长时间依赖中,梯度在反向传播时会逐渐消失或变得不稳定。

  • 短期记忆限制:由于计算依赖于序列的逐步传递,RNN 难以捕获远距离的时间依赖。

  TCN 正是在这样的背景下提出的。它通过因果卷积和扩张卷积,突破了 RNN 的这些瓶颈,特别适用于长时间序列数据。接下来,我们将详细解析 TCN 的原理。

一、TCN原理

1.1 因果卷积(Causal Convolution)

  在卷积操作中,卷积核在输入上滑动时会同时处理前后时间步的数据,导致当前时间步的输出可能依赖于未来的输入。然而,对于时间序列任务,我们通常希望模型只依赖于过去的输入,不“窥探”未来,这样的结构称为“因果性”。

  TCN 使用因果卷积来确保这一点。因果卷积是指每个时间步的输出仅依赖于它之前的时间步,而不依赖于未来。简单来说,当前时间步的输出只会考虑卷积核覆盖的前几个时间步的输入。

  TCN 通过适当的填充(padding)来实现这一点,使得每一层的卷积不会跨越未来时间步。因果卷积的示意图如下:

在这里插入图片描述

1.2 扩张卷积(Dilated Convolution)

  为了捕捉长时间依赖关系,TCN 通过 扩张卷积(Dilated Convolution 来扩展卷积核的感受野。扩张卷积通过在卷积核的元素之间插入“间隔”,从而在保持卷积核大小不变的情况下,扩大卷积的感受野。

  例如,假设卷积核大小为 3,当扩张率 dilation=2 时,卷积核的元素之间插入 1 个间隔,感受野可以从 3 扩展到 5。通过这种扩张卷积,TCN 在每一层可以通过指数扩展的方式增大感受野,使得模型能够捕捉到远距离的依赖关系。例如,TCN 中第 i i i 层的感受野大小为 2 i 2^{i} 2i,这样层数越深,感受野就越大。如下图所示:

在这里插入图片描述

二、代码实现

2.1 Chomp1d 模块

  TCN 使用填充操作来保证卷积后的时间步不丢失,但填充会导致额外的时间步,因此需要 Chomp1d 来修剪掉多余部分,保证输入输出的时间维度一致。

class Chomp1d(nn.Module):
    def __init__(self, chomp_size):
        super(Chomp1d, self).__init__()
        self.chomp_size = chomp_size

    def forward(self, x):
        return x[:, :, :-self.chomp_size].contiguous()

  Chomp1d 的作用是对卷积结果的最后几个时间步进行修剪,这确保了卷积核在时间序列两端不会额外输出冗余的步长。

2.2 TemporalBlock 模块

  TemporalBlock 是 TCN 的基本构建单元,包含两层扩张卷积,每层后接激活函数和 Chomp1d 操作。

class TemporalBlock(nn.Module):
    def __init__(self, n_inputs, n_outputs, kernel_size, stride, dilation, padding, dropout):
        super(TemporalBlock, self).__init__()
        # 第一层卷积
        self.ll_conv1 = nn.Conv1d(n_inputs, n_outputs, kernel_size, stride=stride, padding=padding, dilation=dilation)
        self.chomp1 = Chomp1d(padding)
        self.relu1 = nn.LeakyReLU()

        # 第二层卷积
        self.ll_conv2 = nn.Conv1d(n_outputs, n_outputs, kernel_size, stride=stride, padding=padding, dilation=dilation)
        self.chomp2 = Chomp1d(padding)
        self.relu2 = nn.LeakyReLU()

        # Dropout 作为正则化,防止过拟合
        self.dropout = nn.Dropout(dropout)

    def forward(self, x):
        # 第一个卷积、修剪、激活和 Dropout
        out = self.ll_conv1(x)
        out = self.chomp1(out)
        out = self.relu1(out)
        out = self.dropout(out)

        # 第二个卷积、修剪、激活和 Dropout
        out = self.ll_conv2(out)
        out = self.chomp2(out)
        out = self.relu2(out)
        out = self.dropout(out)

        return out
  • ll_conv1 和 ll_conv2 是两层扩张卷积层,dilation 参数决定了每层的感受野大小。

  • Chomp1d 保证卷积结果不会产生额外的时间步。

  • LeakyReLU 是非线性激活函数,为模型引入非线性。

  • Dropout 用于防止过拟合,通过随机丢弃一部分神经元。

2.3 TemporalConvNet 模块

  TemporalConvNet 是由多个 TemporalBlock 级联组成的模型,每一层的卷积感受野逐层递增。

class TemporalConvNet(nn.Module):
    def __init__(self, num_inputs, num_channels, kernel_size=2, dropout=0.0):
        super(TemporalConvNet, self).__init__()
        layers = []
        self.num_levels = len(num_channels)

        for i in range(self.num_levels):
            dilation_size = 2 ** i  # 每层的扩张率递增
            in_channels = num_inputs if i == 0 else num_channels[i - 1]
            out_channels = num_channels[i]
            layers.append(
                TemporalBlock(
                    in_channels, out_channels, kernel_size, stride=1, dilation=dilation_size,
                    padding=(kernel_size - 1) * dilation_size, dropout=dropout
                )
            )

        self.network = nn.Sequential(*layers)

    def forward(self, x):
        return self.network(x)
  • TemporalConvNet 通过循环构建多层 TemporalBlock,每层的扩张率 dilation 是前一层的两倍,使得感受野指数级增长。

  • 使用 nn.Sequential 将所有层级联在一起,模型最终输出序列数据经过所有层的处理结果。

2.4 完整代码示例

  在这个例子中,输入数据有 8 个样本,每个样本有 3 个特征,序列长度为 10。经过 TCN 网络的三层处理,输出的特征维度从 3 增加到 64,但时间维度(10)保持不变。

import torch.nn as nn
import torch.nn.functional as F
import torch

class Chomp1d(nn.Module):
    def __init__(self, chomp_size):
        super(Chomp1d, self).__init__()
        self.chomp_size = chomp_size

    def forward(self, x):
        return x[:, :, : -self.chomp_size].contiguous()


class TemporalBlock(nn.Module):
    def __init__(
        self, n_inputs, n_outputs, kernel_size, stride, dilation, padding, dropout
    ):
        super(TemporalBlock, self).__init__()
        self.n_inputs = n_inputs
        self.n_outputs = n_outputs
        self.kernel_size = kernel_size
        self.stride = stride
        self.dilation = dilation
        self.padding = padding
        self.dropout = dropout
        self.ll_conv1 = nn.Conv1d(
            n_inputs,
            n_outputs,
            kernel_size,
            stride=stride,
            padding=padding,
            dilation=dilation,
        )
        self.chomp1 = Chomp1d(padding)

        self.ll_conv2 = nn.Conv1d(
            n_outputs,
            n_outputs,
            kernel_size,
            stride=stride,
            padding=padding,
            dilation=dilation,
        )
        self.chomp2 = Chomp1d(padding)
        self.sigmoid = nn.Sigmoid()

    def net(self, x, block_num, params=None):
        layer_name = "ll_tc.ll_temporal_block" + str(block_num)
        if params is None:
            x = self.ll_conv1(x)
        else:
            x = F.conv1d(
                x,
                weight=params[layer_name + ".ll_conv1.weight"],
                bias=params[layer_name + ".ll_conv1.bias"],
                stride=self.stride,
                padding=self.padding,
                dilation=self.dilation,
            )

        x = self.chomp1(x)
        x = F.leaky_relu(x)

        return x

    def init_weights(self):
        self.ll_conv1.weight.data.normal_(0, 0.01)
        self.ll_conv2.weight.data.normal_(0, 0.01)

    def forward(self, x, block_num, params=None):
        out = self.net(x, block_num, params)
        return out


class TemporalConvNet(nn.Module):
    def __init__(self, num_inputs, num_channels, kernel_size=2, dropout=0.0):
        super(TemporalConvNet, self).__init__()
        layers = []
        self.num_levels = len(num_channels)

        for i in range(self.num_levels):
            dilation_size = 2 ** i
            in_channels = num_inputs if i == 0 else num_channels[i - 1]
            out_channels = num_channels[i]
            setattr(
                self,
                "ll_temporal_block{}".format(i),
                TemporalBlock(
                    in_channels,
                    out_channels,
                    kernel_size,
                    stride=1,
                    dilation=dilation_size,
                    padding=(kernel_size - 1) * dilation_size,
                    dropout=dropout,
                ),
            )

    def forward(self, x, params=None):

        for i in range(self.num_levels):
            temporal_block = getattr(self, "ll_temporal_block{}".format(i))
            x = temporal_block(x, i, params=params)
        return x


# 定义一个 TCN 模型,输入通道数为 3,输出通道分别为 16, 32, 64,核大小为 2
tcn = TemporalConvNet(num_inputs=3, num_channels=[16, 32, 64], kernel_size=2, dropout=0.2)

# 假设输入的张量形状为 (batch_size, num_inputs, sequence_length)
x = torch.randn(8, 3, 10)  # 8 个样本,3 个输入特征,序列长度为 10

# 通过 TCN 进行前向传播
output = tcn(x)

print(output.shape)  # 输出的形状为 (batch_size, 64, sequence_length),即 (8, 64, 10)

参考文献

[1] https://github.com/locuslab/TCN

[2] 如何理解扩张卷积(dilated convolution)

[3] 【机器学习】详解 扩张/膨胀/空洞卷积 (Dilated / Atrous Convolution)

时间卷积网络(TCN):序列建模的强大工具(附Pytorch网络模型代码) 时间卷积网络(TCN)是一种专门用于处理序列数据的深度学习模型。实验证明,对于某些任务下的长序LSTM和GRU等RNN架构,因此如果大家有多输入单输出(MISO)或多输入多输出(MIMO)序列建模任务,可以尝试使用TCN来作为创新点。 阅读详情

相关推荐

时域卷积网络(Temporal Convolutional Network,TCN)

TCN基本结构 时域卷积网络(Temporal Convolutional Network,TCN)由Shaojie Bai et al.在2018年提出的,可以用于时序数据处理,详细内容请看论文。 1.因果卷积(Causal Convolution) [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-28ptyiiH-1618306487421)(https://www.programmersought.com/images/924/23daba19db5473ff38fb97

z2014z的博客 1万+

TCN(Temporal Convolutional Network,时间卷积网络)

1 前言 实验表明,RNN 在几乎所有的序列问题上都有良好表现,包括语音/文本识别、机器翻译、手写体识别、序列数据分析(预测)等。 在实际应用中,RNN 在内部设计上存在一个严重的问题:由于网络一次只能处理一个时间步长,后一步必须等前一步处理完才能进行运算。这意味着 RNN 不能像 CNN 那样进行大规模并行处理,特别是在 RNN/LSTM 对文本进行双向处理时。这也意味着 RNN 极度地计算密集,因为在整个任务运行完成之前,必须保存所有的中间结果。 ...

weixin_39910711的博客 12万+

【代码分享】基于TCN-Attention(时间卷积网络融合注意力机制)的多变量回归预测

基于VMD-TCN-Attention的锂电池寿命预测》《基于TCN-Attention神经网络的短期负荷预测》《基于XGBoost和TCN-Attention的棉花价格多影响因素选择及预测》《基于相似日匹配及TCN-Attention的短期光伏出力预测》《基于MIC-TCN-Attention的抽水蓄能机组发电电动机定子温度预警方法研究》《基于TCN-Attention模型的多变量黄河径流量预测》TCN-Attention结合了TCN的局部特征捕获和自注意力机制的全局特征捕获,以提高时间序列建模的性能。

2302_81053261的博客 2040

TCN(Temporal Convolutional Networks)详解

文章介绍了一种时序预测算法TCN(时域卷积网络)利用因果卷积和残差模块等,使得模型能更好的捕捉时序数据局部依赖关系以及稳定的梯度传播,与RNN相比有不同的优缺点;文中还对一维卷积做了简单介绍,以便初学这能更好的学习和了解,并附带详细代码示例。

weixin_57726558的博客 5万+

基于TCN的电力负荷预测:从原理到PyTorch实战

时间序列预测是数据分析与人工智能领域的核心任务之一,旨在根据历史数据推断未来趋势。其基本原理在于挖掘数据中的时序依赖关系,传统方法如ARIMA和循环神经网络(RNN)各有局限。时间卷积网络(TCN)作为一种新兴架构,通过膨胀因果卷积和残差连接技术,在保持卷积神经网络高效并行计算优势的同时,获得了处理长程依赖的能力,显著提升了训练速度与预测稳定性。这项技术在金融、物联网、能源管理等需要精准时序分析的场景中价值凸显。具体到电力行业,负荷预测关乎电网平衡与调度效率。本文聚焦于利用TCN解决电力负荷预测的工程实践,

weixin_29038155的博客 322

TCN时间卷积网络故障诊断Matlab实现:从原理到代码实战

时间序列分析是工业设备状态监测与故障诊断的核心技术之一,而深度学习模型的选择直接影响诊断精度与实时性。TCN(时间卷积网络)凭借因果卷积与扩张卷积的独特设计,在保证训练并行性的同时有效捕获长程时序特征,对比LSTM具有梯度路径更短、收敛更稳定的工程优势。本文从TCN的结构原理出发,解析感受野计算、残差连接与参数调优策略,并结合一份可直跑的Matlab故障诊断代码包,完整展示了数据预处理、网络搭建、训练验证及避坑要点。无论是学生完成课程设计,还是工程师验证振动信号诊断方案,都能通过这套流程快速落地基于时间卷积

weixin_31412781的博客 247

机器学习进阶之 时域/时间卷积网络 TCN 概念+由来+原理+代码实现

TCN 从“阿巴阿巴”到“巴拉巴拉” TCN的概念(干嘛来的!能解决什么问题) TCN的父母(由来) TCN的原理介绍 上代码! 1、TCN(时域卷积网络、时间卷积网络)是干嘛的,能干嘛 主要应用方向: 时序预测、概率预测、时间预测、交通预测 2、TCN的由来 ps:在了解TCN之前需要先对CNN和RNN有一定的了解。 处理问题: 是一种能够处理时间序列数据的网络结构,在特定条件下,效果优于传统的神经网络(RNN、CNN等)。 3、TCN的原理介绍 TCN 的网络结构 一、TCN的网络结构

un_lock的博客 3万+

国产大模型 coding plan 实战决策指南:GLM、Kimi、豆包、abab 四大模型分层选型与工程落地

大模型辅助编程(coding assistant)正从概念验证走向规模化工程落地,其核心已不再是‘能否生成代码’,而是‘如何在真实开发流程中精准赋能’。理解模型能力边界、匹配技术栈特征、构建分层工作流(L1行级补全/L2函数生成/L3模块重构),是实现稳定提效的关键。GLM系列以工程稳定性见长,适合代码审计与测试生成;Kimi-Max凭借200K超长上下文胜任深度重构与合规审查;豆包响应快、框架适配深,是IDE高频补全的理想选择;abab系列则在IoT固件等跨模态场景中展现独特价值。本文聚焦国产模型在金融、

weixin_32238157的博客 428

深度学习学习——TCN详解

初学TCN——TCN详细讲解 找到了几个写的非常好,讲得很清楚的网址。 1.原理详解 链接 2.代码详解 https://zhuanlan.zhihu.com/p/41513393

m0_37876745的博客 946

CLIP-Count代码配置以及踩坑记录

CLIP-Count代码配置以及踩坑记录

学术菜鸡 1011

用简单仿真链路产生 WiFi CSI(不依赖专用工具箱,matlab实现)

这篇文章详细介绍了使用MATLAB仿真生成WiFi信道状态信息(CSI)的过程。内容包括:准备工作(定义OFDM和MIMO参数)、基本参数设置(天线数、FFT点数等)、构造训练OFDM符号、多径瑞利信道建模、逐天线时分发射接收处理、CSI信道估计方法,以及幅值和相位的可视化。通过BPSK调制和瑞利衰落信道仿真,实现了简单的CSI生成流程,为初学者理解CSI产生机理提供了直观指导。文章强调这仅是基础仿真,更深入的研究需要实际数据采集。文末还提供了WiFi指纹定位的相关参考资料。

静水流深,沧笙踏歌 1205

tcn详解附matlab和Python代码-ChatGPT4o作答

TCN(时间卷积网络)通过因果卷积、扩张卷积和残差连接的结合,提供了一种高效且稳定的解决方案,尤其适合长时间序列数据的建模。与传统的RNN架构相比,TCN具有更强的并行计算能力和更稳定的训练过程,且能够有效处理时间序列中的长时间依赖关系。模型优点缺点TCN的优势RNN捕捉时间序列依赖关系无法并行计算,梯度消失/爆炸问题TCN并行计算,稳定的梯度传播LSTM长时间依赖建模计算复杂,不能并行计算TCN更高效,并行性强,训练更快GRU计算更高效,结构简单计算不并行,长时间依赖建模不如LSTM。

qq_46215223的博客 2197

ADS RFpro 射频阻抗仿真步骤

导入器件后,在库里面选取器件的对应模型,如图所示我们选取10pf 系统自带的村田模型。选取网络上的器件,拖入到下面component Models。导入成功后,截取需要仿真的区域(不截取仿真时间会非常长),可以生成对应如下原理图,通过原理图继续调整仿真。图上找到需要仿真链路上的网络,右键设置为信号。的叠层信息,按照PCB板厂提供信息填写完整。选择仿真的频率范围和频点数,生成如下图的RFPro仿真界。,然后再把GND也添加到下面。按图设置截取需要仿真的部分。添加成功后 网络就有了,15 双击run开始仿真。

m0_72954480的博客 3217

基于冠豪猪算法优化时间卷积网络(CPO-TCN)的数据多变量时序预测附Matlab代码

在工业生产、能源调度、金融市场等领域,多变量时序数据蕴含着复杂的动态关联与潜在规律,精准预测这类数据对决策优化至关重要。传统时间卷积网络(TCN)虽在时序建模中表现出色,但网络超参数(如卷积核大小、通道数、 dropout 率等)的选择依赖经验试错,易导致模型陷入局部最优,影响预测精度。2025 年,受冠豪猪 “防御 - 觅食” 行为启发的冠豪猪优化算法(CPO)凭借强全局搜索能力,为 TCN 超参数优化提供了新方案。本文将详细拆解 CPO-TCN 模型的构建逻辑、优化过程及在多变量时序预测场景中的应用。

Matlab_dashi的博客 610

小程序 video 控制器外观调整_Kessil 360X Tuna Sun无线控制器使用分享

之前分享了Kessil 360X Tuna Sun开箱记录,时间关系,没来得及使用WiFi Dongle无线控制器。昨晚抽空实操了一下,做个操作记录,希望对大家有参考Kessil无线模块操作指南官方视频英文教程配中文字幕,非常详尽语速较快,重点位置可以暂停操作点击边框调出视频工具条1、拆包取控制器,保存二维码Kessil WiFi Dongle包装打开包装就能看到Kessil无线控制模...

weixin_39759060的博客 4733

SAP-ABAP:SAP IDOC 全面学习指南

SAP-ABAP:SAP IDOC 全面学习指南

baidu_35680696的博客 1616

【TCN回归预测】基于TCN时间卷积神经网络实现数据多输入回归预测附matlab代码

时间卷积网络(TemporalConvolutionalNetwork,TCN)是一种特殊的卷积神经网络(CNN).① TCN结构中的卷积具有因果关系,如图3(a)所示,数据的传递是单向的,即每层的信息只依赖于之前层的信息。② 传统卷积神经网络对时间的建模长度受限于卷积核的大小,需要堆叠较多层来抓取更长的依赖关系。为解决该问题,如图3(b)所示,TCN采用膨胀卷积,即在因果卷积的基础上间隔采样输入。膨胀卷积使得输入信息量随层数的增加呈指数型增长,卷积网络就可以凭借较少的层来获得足够大的感受野。

matlab_dingdang的博客 963

第3讲:单端传输线的时域TDR仿真(基于实战的第一次仿真视角切换)

本文为CST仿真系列教程的第3讲,主要介绍传输线阻抗(TDR)的两种仿真方法:基于S参数的频域计算和基于高斯脉冲的时域计算。文章详细演示了在CST PCB Studio中修改电容参数、设置TDR仿真参数(包括截止时间和采样点数)的操作步骤,并通过对比实验展示TVS寄生电容对阻抗曲线的影响。最后将两种TDR方法的结果进行对比,验证了两种方法的一致性。本教程适合硬件工程师通过时域波形直观分析传输线阻抗特性,是信号完整性分析的重要技能。

一只豌豆象的博客 228

基于TCN时间卷积网络(含因果膨胀卷积)的多特征输入股票预测项目实战(pytorch)(六维特征)【有数据集和代码,可运行】——仅用于课程和编程学习,不作为任何金融推荐!!!!

该算法于2016年由Lea等人他们在做视频动作分割的研究首先提出,CNN模型以 CNN 模型为基础,并做了如下改进:①适用序列模型:因果卷积(Causal Convolution)②记忆历史:空洞卷积/膨胀卷积(Dilated Convolution),残差模块(Residual block)。config中定义了项目的基本参数,可以在里面修改训练参数。若有朋友需要可运行的源码和数据集,可以guan注【科研小条】gong众号,回复【TCN多特征股票预测】,即可获得。

weixin_44829487的博客 2214

如何用Python编程实现算术割圆术?

第10章 割圆术 Python编程要点 from … import …语句 math模块的sqrt()函数 round()函数 10.1 图解九章 {:–}觚( gū ):正多边形。“六觚”即正六边形,“十二觚”即正十二边形。 图10-1 六觚、十二觚、二十四觚 提示 图10-1所示由图解九章源码中的“图解割圆术.py”自动绘制而成,我们可运行脚本文件,查看动态的绘制过程。 割六觚以...

人邮异步社区 3237

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

TCN-GRU时间卷积门控循环单元多变量时间序列预测(Matlab完整源码和数据)

在大数据与人工智能深度融合的时代,多变量时间序列数据广泛存在于各个领域,从金融市场中股价、交易量、利率等指标的波动,到工业生产里设备温度、压力、转速等参数的变化,精准预测其趋势对风险防范、资源优化配置和科学决策意义重大。然而,多变量间复杂的非线性关系和时间序列的长程依赖特性,使得预测任务充满挑战。TCN-GRU 模型融合时间卷积网络(TCN)和门控循环单元(GRU)的优势,为多变量时间序列预测提供了新的解决方案。一、多变量时间序列预测:现状与挑战。

Matlab_dashi的博客 1015

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【电力负荷预测】基于matlab灰狼算法优化时间卷积网络结合多头注意力机制GWO-TCN-Multihead-Attention电力负荷预测【含Matlab源码 4151期】

灰狼算法优化时间卷积网络结合多头注意力机制GWO-TCN-Multihead-Attention电力负荷预测 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 973

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: 基于Node2Vec的图嵌入实现过程
下一篇: RT系列机器人详细介绍(BC-Z、RT-1、OMM、RT-Trajectory、Q-Transformer、RT-2、RT-X、RT-H)
晓shuo
晓shuo 优质创作者: 人工智能技术领域 优质创作者: 人工智能技术领域
博客等级 码龄6年 4万+粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓shuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值