Day50

手把手教你用芯驰X9HP驱动MAX96755/MAX96752点亮智能座舱仪表屏(附完整寄存器配置表) 本文详细介绍了如何使用芯驰X9HP驱动MAX96755/MAX96752实现智能座舱仪表屏的完整开发流程,包括硬件架构解析、关键寄存器配置、Linux BSP集成及调试技巧。通过实战指南和完整寄存器配置表,帮助开发者快速掌握驱动开发核心技术,提升智能座舱系统的显示性能与稳定性。 阅读详情

知识点回顾:

  1. resnet结构解析
  2. CBAM放置位置的思考
  3. 针对预训练模型的训练策略
    1. 差异化学习率
    2. 三阶段微调

作业:

  1. 好好理解下resnet18的模型结构
  2. 尝试对vgg16+cbam进行微调策略

vgg16+cbam

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms, models
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
import numpy as np
import time
 
# 设置中文字体支持
plt.rcParams["font.family"] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
 
# 通道注意力模块(与原代码一致)
class ChannelAttention(nn.Module):
    def __init__(self, in_channels, ratio=16):
        super().__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)
        self.fc = nn.Sequential(
            nn.Linear(in_channels, in_channels // ratio, bias=False),
            nn.ReLU(),
            nn.Linear(in_channels // ratio, in_channels, bias=False)
        )
        self.sigmoid = nn.Sigmoid()
 
    def forward(self, x):
        b, c, h, w = x.shape
        avg_out = self.fc(self.avg_pool(x).view(b, c))
        max_out = self.fc(self.max_pool(x).view(b, c))
        attention = self.sigmoid(avg_out + max_out).view(b, c, 1, 1)
        return x * attention
 
# 空间注意力模块
class SpatialAttention(nn.Module):
    def __init__(self, kernel_size=7):
        super().__init__()
        self.conv = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2, bias=False)
        self.sigmoid = nn.Sigmoid()
 
    def forward(self, x):
        avg_out = torch.mean(x, dim=1, keepdim=True)
        max_out, _ = torch.max(x, dim=1, keepdim=True)
        pool_out = torch.cat([avg_out, max_out], dim=1)
        attention = self.conv(pool_out)
        return x * self.sigmoid(attention)
 
# CBAM模块
class CBAM(nn.Module):
    def __init__(self, in_channels, ratio=16, kernel_size=7):
        super().__init__()
        self.channel_attn = ChannelAttention(in_channels, ratio)
        self.spatial_attn = SpatialAttention(kernel_size)
 
    def forward(self, x):
        x = self.channel_attn(x)
        x = self.spatial_attn(x)
        return x
 
# 数据预处理
train_transform = transforms.Compose([
    transforms.RandomCrop(32, padding=4),
    transforms.RandomHorizontalFlip(),
    transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),
    transforms.RandomRotation(15),
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])
 
test_transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])
 
# 加载数据集
train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=train_transform)
test_dataset = datasets.CIFAR10(root='./data', train=False, transform=test_transform)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)
 
# 自定义VGG16模型,插入CBAM模块
class VGG16_CBAM(nn.Module):
    def __init__(self, num_classes=10, pretrained=True, cbam_ratio=16, cbam_kernel=7):
        super().__init__()
        # 加载预训练VGG16
        self.backbone = models.vgg16(pretrained=pretrained).features
        
        # 修改首层卷积以适应32x32输入(CIFAR10)
        # VGG16原输入尺寸为224x224,首层卷积stride=2,这里改为stride=1
        self.backbone[0] = nn.Conv2d(
            in_channels=3, out_channels=64, kernel_size=3, stride=1, padding=1, bias=False
        )
        
        # 在VGG的不同block后添加CBAM模块
        # VGG16的block划分:
        # block1: 0-1 (2层卷积)
        # block2: 2-5 (4层卷积)
        # block3: 6-13 (8层卷积)
        # block4: 14-23 (12层卷积)
        # block5: 24-33 (16层卷积)
        self.cbam_block1 = CBAM(in_channels=64, ratio=cbam_ratio, kernel_size=cbam_kernel)
        self.cbam_block2 = CBAM(in_channels=128, ratio=cbam_ratio, kernel_size=cbam_kernel)
        self.cbam_block3 = CBAM(in_channels=256, ratio=cbam_ratio, kernel_size=cbam_kernel)
        self.cbam_block4 = CBAM(in_channels=512, ratio=cbam_ratio, kernel_size=cbam_kernel)
        self.cbam_block5 = CBAM(in_channels=512, ratio=cbam_ratio, kernel_size=cbam_kernel)
        
        # 定义自适应平均池化,将特征图统一为7x7(适应32x32输入)
        self.avgpool = nn.AdaptiveAvgPool2d((7, 7))
        
        # 修改分类头(VGG16原分类头为3层全连接,改为适合10分类)
        self.classifier = nn.Sequential(
            nn.Linear(512 * 7 * 7, 4096),
            nn.ReLU(True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(True),
            nn.Dropout(),
            nn.Linear(4096, num_classes),
        )
 
    def forward(self, x):
        # 主干特征提取
        # Block 1
        x = self.backbone[0](x)  # 卷积层1
        x = self.backbone[1](x)  # ReLU
        x = self.backbone[2](x)  # 最大池化
        x = self.cbam_block1(x)  # CBAM
        
        # Block 2
        x = self.backbone[3](x)  # 卷积层1
        x = self.backbone[4](x)  # ReLU
        x = self.backbone[5](x)  # 最大池化
        x = self.cbam_block2(x)  # CBAM
        
        # Block 3
        x = self.backbone[6](x)  # 卷积层1
        x = self.backbone[7](x)  # ReLU
        x = self.backbone[8](x)  # 卷积层2
        x = self.backbone[9](x)  # ReLU
        x = self.backbone[10](x) # 卷积层3
        x = self.backbone[11](x) # ReLU
        x = self.backbone[12](x) # 最大池化
        x = self.cbam_block3(x)  # CBAM
        
        # Block 4
        x = self.backbone[13](x) # 卷积层1
        x = self.backbone[14](x) # ReLU
        x = self.backbone[15](x) # 卷积层2
        x = self.backbone[16](x) # ReLU
        x = self.backbone[17](x) # 卷积层3
        x = self.backbone[18](x) # ReLU
        x = self.backbone[19](x) # 最大池化
        x = self.cbam_block4(x)  # CBAM
        
        # Block 5
        x = self.backbone[20](x) # 卷积层1
        x = self.backbone[21](x) # ReLU
        x = self.backbone[22](x) # 卷积层2
        x = self.backbone[23](x) # ReLU
        x = self.backbone[24](x) # 卷积层3
        x = self.backbone[25](x) # ReLU
        x = self.backbone[26](x) # 最大池化
        x = self.cbam_block5(x)  # CBAM
        
        # 自适应平均池化 + 分类
        x = self.avgpool(x)
        x = torch.flatten(x, 1)
        x = self.classifier(x)
        return x
 
# 分阶段训练相关函数
def set_trainable_layers(model, trainable_parts):
    print(f"\n---> 解冻以下部分并设为可训练: {trainable_parts}")
    for name, param in model.named_parameters():
        param.requires_grad = False
        for part in trainable_parts:
            if part in name:
                param.requires_grad = True
                break
 
def train_staged_finetuning(model, criterion, train_loader, test_loader, device, epochs):
    optimizer = None
    
    # 初始化历史记录列表
    all_iter_losses, iter_indices = [], []
    train_acc_history, test_acc_history = [], []
    train_loss_history, test_loss_history = [], []
 
    for epoch in range(1, epochs + 1):
        epoch_start_time = time.time()
        
        # --- 动态调整学习率和冻结层 ---
        if epoch == 1:
            print("\n" + "="*50 + "\n🚀 **阶段 1:训练注意力模块和分类头**\n" + "="*50)
            set_trainable_layers(model, ["cbam", "classifier"])
            optimizer = optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-3)
        elif epoch == 6:
            print("\n" + "="*50 + "\n✈️ **阶段 2:解冻高层卷积块 (block4, block5)**\n" + "="*50)
            set_trainable_layers(model, ["cbam", "classifier", "backbone.13", "backbone.20"])
            optimizer = optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-4)
        elif epoch == 21:
            print("\n" + "="*50 + "\n🛰️ **阶段 3:解冻所有层,进行全局微调**\n" + "="*50)
            for param in model.parameters(): param.requires_grad = True
            optimizer = optim.Adam(model.parameters(), lr=1e-5)
        
        # --- 训练循环 ---
        model.train()
        running_loss, correct, total = 0.0, 0, 0
        for batch_idx, (data, target) in enumerate(train_loader):
            data, target = data.to(device), target.to(device)
            optimizer.zero_grad()
            output = model(data)
            loss = criterion(output, target)
            loss.backward()
            optimizer.step()
            
            # 记录每个iteration的损失
            iter_loss = loss.item()
            all_iter_losses.append(iter_loss)
            iter_indices.append((epoch - 1) * len(train_loader) + batch_idx + 1)
            
            running_loss += iter_loss
            _, predicted = output.max(1)
            total += target.size(0)
            correct += predicted.eq(target).sum().item()
            
            # 每100个batch打印一次
            if (batch_idx + 1) % 100 == 0:
                print(f'Epoch: {epoch}/{epochs} | Batch: {batch_idx+1}/{len(train_loader)} '
                      f'| 单Batch损失: {iter_loss:.4f} | 累计平均损失: {running_loss/(batch_idx+1):.4f}')
        
        epoch_train_loss = running_loss / len(train_loader)
        epoch_train_acc = 100. * correct / total
        train_loss_history.append(epoch_train_loss)
        train_acc_history.append(epoch_train_acc)
 
        # --- 测试循环 ---
        model.eval()
        test_loss, correct_test, total_test = 0, 0, 0
        with torch.no_grad():
            for data, target in test_loader:
                data, target = data.to(device), target.to(device)
                output = model(data)
                test_loss += criterion(output, target).item()
                _, predicted = output.max(1)
                total_test += target.size(0)
                correct_test += predicted.eq(target).sum().item()
        
        epoch_test_loss = test_loss / len(test_loader)
        epoch_test_acc = 100. * correct_test / total_test
        test_loss_history.append(epoch_test_loss)
        test_acc_history.append(epoch_test_acc)
        
        # 打印每个epoch的最终结果
        print(f'Epoch {epoch}/{epochs} 完成 | 耗时: {time.time() - epoch_start_time:.2f}s | 训练准确率: {epoch_train_acc:.2f}% | 测试准确率: {epoch_test_acc:.2f}%')
    
    # 训练结束后调用绘图函数
    print("\n训练完成! 开始绘制结果图表...")
    plot_iter_losses(all_iter_losses, iter_indices)
    plot_epoch_metrics(train_acc_history, test_acc_history, train_loss_history, test_loss_history)
    
    # 返回最终的测试准确率
    return epoch_test_acc
 
# 绘图函数
def plot_iter_losses(losses, indices):
    plt.figure(figsize=(10, 4))
    plt.plot(indices, losses, 'b-', alpha=0.7, label='Iteration Loss')
    plt.xlabel('Iteration(Batch序号)')
    plt.ylabel('损失值')
    plt.title('每个 Iteration 的训练损失')
    plt.legend()
    plt.grid(True)
    plt.tight_layout()
    plt.show()
 
def plot_epoch_metrics(train_acc, test_acc, train_loss, test_loss):
    epochs = range(1, len(train_acc) + 1)
    plt.figure(figsize=(12, 4))
    plt.subplot(1, 2, 1)
    plt.plot(epochs, train_acc, 'b-', label='训练准确率')
    plt.plot(epochs, test_acc, 'r-', label='测试准确率')
    plt.xlabel('Epoch')
    plt.ylabel('准确率 (%)')
    plt.title('训练和测试准确率')
    plt.legend(); plt.grid(True)
    plt.subplot(1, 2, 2)
    plt.plot(epochs, train_loss, 'b-', label='训练损失')
    plt.plot(epochs, test_loss, 'r-', label='测试损失')
    plt.xlabel('Epoch')
    plt.ylabel('损失值')
    plt.title('训练和测试损失')
    plt.legend(); plt.grid(True)
    plt.tight_layout()
    plt.show()
 
# 执行训练
if __name__ == "__main__":
    # 检查GPU是否可用
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    print(f"使用设备: {device}")
    
    # 初始化模型并移至设备
    model = VGG16_CBAM().to(device)
    criterion = nn.CrossEntropyLoss()
    epochs = 50
    
    print("开始使用带分阶段微调策略的VGG16+CBAM模型进行训练...")
    final_accuracy = train_staged_finetuning(model, criterion, train_loader, test_loader, device, epochs)
    print(f"训练完成!最终测试准确率: {final_accuracy:.2f}%")
    
    # torch.save(model.state_dict(), 'vgg16_cbam_finetuned.pth')
    # print("模型已保存为: vgg16_cbam_finetuned.pth")

今天时间紧,来不及了

@浙大疏锦行

思科路由器重分发(静态路由+OSPF动态路由+RIP动态路由) 阅读详情

相关推荐

【sap2000】部分模型通过.s2k文件合并模型generating a global model through partial models by .s2k text file

现在需要通过选项File → Import → SAP2000 .s2k Text File → Add to existing model(如果使用其中一个部分模型作为基础)或New model(如果使用新文件)添加部分模型,并使用以下导入选项。模型A(阶段1/5) Model A (Phase 1/5)模型B(阶段2/5) Model B (Phase 2/5)模型C(阶段3/5) Model C (Phase 3/5)模型E(阶段5/5) Model E (Phase 5/5)

hmywillstronger的博客 1750

DAY50

【代码】DAY50。

2502_91794092的博客 209

保姆级教程:5分钟搞定微信小程序live-player组件接入监控视频流

本文提供了一份详细的微信小程序接入实时监控视频流的实战指南。文章对比了live-player与video组件的核心差异,重点解析了如何申请并开通live-player组件的严格权限,并提供了播放RTMP流(低延迟)的完整配置、状态监听与错误处理代码。同时,也介绍了使用video组件播放HLS流的备选方案,帮助开发者根据项目需求快速选择并实现稳定可靠的监控视频播放功能。

open4的博客 296

day50

【代码】day50。

mutongyindi的博客 383

基于SHIS凝视型短波红外高光谱相机(900-1700nm)区分不同宝石的差异性和可分性(宝石分选)

SHIS系列凝视型高光谱相机基于液晶可调谐滤波器(LCTF),通过电控LCTF进行连续细分窄波段分光,对每个波段进行高分辨率的二维面阵成像,进行图像处理后,获得完整的高光谱高清图像序列。具有低功耗、小型化、使用方便和易于扩展的优势。其工作波段覆盖400nm至1000nm,能够捕捉宝石在不同波长下的光谱特征,为宝石鉴定提供了新的工具。

wayho的博客 709

SPSS篇—卡方检验

今天依旧跟大家分享一个在SPSS中使用率比较高的分析方法:卡方检验。 在开始做分析之前,我们需要明白两件事情:卡方检验是什么?一般用来干什么?我们只有充分了解分析方法以后才能够正确的使用它。 卡方检验在百科中的解释是:卡方检验是用途非常广的一种假设检验方法,它在分类资料统计推断中的应用,包括:两个率或两个构成比比较的卡方检验;多个率或多个构成比比较的卡方检验以及分类资料的相关分析等。它的原理是...

小白数据营的博客 20万+

DAY50打卡

可以将其看作一个处理流水线,图像数据从一端进去,分类结果从另一端出来。整个过程可以分为三个主要部分。针对预训练模型的训练。

weixin_71046789的博客 330

nvlddmkm事件ID14报错排查全指南:从找不到描述到显卡驱动崩溃

系统日志中的“无法找到描述”往往让人一头雾水,但这类提示其实隐藏着驱动故障的关键线索。Windows事件查看器通过事件源和ID记录系统异常,其中显卡驱动相关的内核模式驱动组件一旦超时失败,就会触发TDR机制,产生13、14、153等不同事件ID。理解这些ID的含义,比纠结“找不到描述”本身更重要。对于频繁出现的驱动崩溃问题,可以从日志频率和发生场景判断方向,再通过安全模式下彻底清理驱动、关闭冲突软件、检查供电和温度等步骤逐层定位。无论是游戏满载黑屏,还是睡眠唤醒后闪退,掌握NVIDIA驱动日志的解读逻辑,都

weixin_30545945的博客 414

Day50 预训练模型+CBAM模块

【代码】Day50 预训练模型+CBAM模块。

m0_61080320的博客 207

《Linux运维总结:etcd 3.5.15集群数据备份与恢复》

《Linux运维总结:etcd 3.5.15集群数据备份与恢复》

东城绝神 1080

基于咸鱼最新九宫格图标验证码的语义增强模型识别

本文探讨了破解复杂验证码的技术思路,重点分析了某平台的九宫格验证码应对策略。作者提出通过图像语义抽取和增强技术来扩充数据集:先采集少量真实样本,利用形态学操作进行前增强生成变形图像,再通过叠加背景噪声进行后增强。同时强调真实数据集的重要性,建议采用真实+生成数据的混合训练方法。实验表明该方法可使模型准确率达到95%以上,但作者特别声明本文仅供技术研究,严禁用于非法用途。

码王吴彦祖的博客 601

50Days-Day1:拓展卡片的实现

关于这个项目,我想很多人早已耳熟能详,本人作为一个前端开发爱好者,也来写着玩玩,随便分享给大家我的一些基本思路。静态页面呈现已给出,动态页面就是点击就变大,就是我们常做的口风琴效果啦,下面是我的代码分享。因为是外网的地址,估计要使用魔法,没魔法的小伙伴,在下先给出day1的示例图。该项目核心实现即,利用点击事件实现动态添加类名。是的我利用foreach遍历每个元素并统一管理。

improt的博客 354

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【Day50】

ps:今日的代码训练时长较长,3080ti大概需要40min的训练时长。DAY 50 预训练模型+CBAM模块。尝试对vgg16+cbam进行微调策略。好好理解下resnet18的模型结构。针对预训练模型的训练策略。CBAM放置位置的思考。resnet结构解析。

m0_70583395的博客 236

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

day50 shell

shell

m0_72595899的博客 139

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

day50/60

通过这些比喻,可以把复杂的网络结构和训练策略想象成生活中的生产、管理和优化流程,帮助你理解它们的设计思路和作用。这些技术都是为了让模型训练更高效、性能更优,在实际应用中可根据任务需求灵活组合使用。下面我将通过详细注释和可视化方式帮助你理解 ResNet18 的结构,并实现 VGG16+CBAM 的三阶段微调策略。python运行# 定义CBAM模块(简化版)nn.ReLU(),return x# 修改VGG16结构,插入CBAM# 在每个MaxPooling后插入CBAM。

qq_64525873的博客 705

Python训练营打卡Day50

DAY 50 预训练模型+CBAM模块知识点回顾:1.resnet结构解析2.CBAM放置位置的思考3.针对预训练模型的训练策略a.差异化学习率b.三阶段微调ps:今日的代码训练时长较长,3080ti大概需要40min的训练时长作业:1.好好理解下resnet18的模型结构2.尝试对vgg16+cbam进行微调策略。

m0_70431145的博客 1083

Day50 算法训练营

115.不同的子序列;583.两个字符串的删除操作;

qq_54162207的博客 601

腾讯精选50题—Day2题目7,8,9

腾讯精选50题—Day2题目7,8,9 今天是打卡的第二天,元气满满的冲鸭~~~ 1. 题目7 整数反转 (1)题目描述 (2)题目思路 (3)题解

Fox_Alex的博客 263

Python训练营-Day50

【代码】Python训练营-Day50。

m0_72314023的博客 455

Leetcode 腾讯50题 day2

Leetcode 腾讯50题 day2 今天的题目整体都比昨天简单一些,主要涉及到字符串处理及整数的位数操作,也没有什么可以分享的,就简单贴一下思路和代码吧,以下解法都是用Python解的。 No.7 整数反转 题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 输入:x = 123 输出:321 提示: -231 <= x <= 231 - 1 解题思路 我将整数作为字符串处理,反转完成后再生成整数 代码 class Solution: def r

qq_32844743的博客 192

Python训练打卡DAY50

DAY50:预训练模型+CBAM模块。一、观察resnet内部结构。针对预训练模型的训练策略。CBAM放置位置的思考。二、CBAM的放置位置。resnet结构解析。

m0_73782374的博客 257

Leetcode 腾讯50题 day3

Leetcode 腾讯50题 day3 今天因为在做上一期pandas的综合测试题,第三题三数之和还没有写出更好的实现思路,暂时贴了官方题解的答案,主要和大家分享一些利用时间复杂度进行解题的技巧,在No.11盛最多水的容器的题解中分享 No.11 盛最多水的容器 题目描述 给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容

qq_32844743的博客 267

Python 训练 day50

尝试对vgg16+cbam进行微调策略。好好理解下resnet18的模型结构。针对预训练模型的训练策略。CBAM放置位置的思考。resnet结构解析。

2501_90913745的博客 135

【Python训练营打卡】day50 @浙大疏锦行

DAY 50 预训练模型+CBAM模块知识点回顾:1.resnet结构解析2.CBAM放置位置的思考3.针对预训练模型的训练策略a.差异化学习率b.三阶段微调作业:1.好好理解下resnet18的模型结构2.尝试对vgg16+cbam进行微调策略。

2301_77865880的博客 849

Day 50 卡玛笔记

这是一篇算法打卡文章

“只要有信念,就一定会成功” 332

Leetcode 腾讯50题 day13

Leetcode 腾讯50题 day13 No.160 相交链表 题目描述 编写一个程序,找到两个单链表相交的起始节点。 代码 # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def getIntersectionNode(self, headA

qq_32844743的博客 197
上一篇: Day49
下一篇: Day51
cr123study
博客等级 码龄3年 72粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值