Tensorflow2.0之LeNet-5实战

【TensorFlow2 之014】在 TF 2.0 中实现 LeNet-5 在这篇文章中,我们将展示如何在 TensorFlow 中实现像 \(LeNet-5\) 这样的基础卷积神经网络。LeNet-5 架构由 Yann LeCun 于 1998 年发明,是第一个卷积神经网络。 阅读详情

Tensorflow2.0之LeNet-5实战

LeNet-5 神经网络讲解

1990 年代,Yann LeCun 等人提出了用于手写数字和机器打印字符图片识别的神经网络,被命名为LeNet-5 [4]。LeNet-5 的提出,使得卷积神经网络在当时能够成功被商用,广泛应用在邮政编码、支票号码识别等任务中。下图 10.30 是LeNet-5 的网络结构图,它接受32 × 32大小的数字、字符图片,经过第一个卷积层得到[b,28,28,6] 形状的张量,经过一个向下采样层,张量尺寸缩小到 ,[b,14,14,6]经过第二个卷积层,得到 形状的张量,同样经过下采样层,张量尺寸缩小到[b,5,5,6] ,在进入全连接层之前,先将张量打成 的张量,送入输出节点数分别为120、84 的2 个全连接层,得到 8 的张量,最后通过Gaussian connections 层。
在这里插入图片描述
现在看来,LeNet-5 网络层数较少(2 个卷积层和2 个全连接层),参数量较少,计算代价较低,尤其在现代GPU 的加持下,数分钟即可训练好LeNet-5 网络。

我们在LeNet-的基础上进行少许的调整,使他更容易在现代深度学习的框架上实现。首先我们将输入X形状由32X32调整为28X28,然后将2个下采样层实现为最大池化层,最后利用全连接层替换掉Gaussian connections层。下文统一称修改的网络也为LeNet-5 网络。
在这里插入图片描述
我们基于MNIST手写数字图片数据集训练LeNet-5网络,并测试其最终准确度。

代码部分(完整代码在最后):

导入相关的包

import tensorboard
import tensorflow as tf
from tensorflow.keras import Sequential, layers, losses, optimizers, datasets
import datetime

加载训练集并进行预处理:

在进行训练之前先加载训练姐并进行预处理:

# 加载手写数据集文件
def preprocess(x, y):
    """
    预处理函数
    """
    # [b, 28, 28], [b]
    x = tf.cast(x, dtype=tf.float32) / 255.
    y = tf.cast(y, dtype=tf.int32)
    y = tf.one_hot(y, depth=10)
    return x, y
(x, y), (x_test, y_test) = datasets.mnist.load_data()  # 加载手写数据集数据
batchsz = 1000
train_db = tf.data.Dataset.from_tensor_slices((x, y))  # 转化为Dataset对象
train_db = train_db.shuffle(100000)  # 随机打散
train_db = train_db.batch(batchsz)  # 批训练
train_db = train_db.map(preprocess)  # 数据预处理
train_db = train_db.repeat(30)  # 复制30份数据
test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test))
test_db = test_db.shuffle(1000).batch(batchsz).map(preprocess)

这样训练集和测试集就准备完毕了,这里我批训练的数量设置的是1000是因为我的电脑还可以,如果配置不行的可以调小批训练的个数,至于为什么是1000,类似于这种超参数的调节都是根据结果一步步调节的。我的这个网络从一开始的80%的准确度,不停的调节批训练的个数和学习率这两个超参数最后网络的准确度达到了98.61%

创建tensorboard环境:

current_time = datetime.datetime.now().strftime(('%Y%m%d-%H%M%S'))
log_dir = 'logs/' + current_time
summary_writer = tf.summary.create_file_writer(log_dir)

当然了在运行代码的时候不要忘了,打开代码所在位置的终端并启动tensorboard哦

创建网络层

网络层在前面已经介绍过了,这里直接搭建就ok了

# 通过Sequnentia容器创建LeNet-5
network = Sequential([
    layers.Conv2D(6, kernel_size=3, strides=1),  # 第一个卷积核,6个3X3的卷积核,
    layers.MaxPooling2D(pool_size=2, strides=2),  # 高宽各减半的池化层
    layers.ReLU(),  # 激活函数
    layers.Conv2D(16, kernel_size=3, strides=1),  # 第二个卷积核,16个3X3的卷积核,
    layers.MaxPooling2D(pool_size=2, strides=2),  # 高宽各减半的池化层
    layers.ReLU(),  # 激活函数
    layers.Flatten(),  # 打平层,方便全连接层处理
    layers.Dense(120, activation='relu'),  # 全连接层,120个结点
    layers.Dense(84, activation='relu'),  # 全连接层,84个结点
    layers.Dense(10, activation='relu')  # 全连接层,10个结点
])
# build 一次网络模型,给输入X的形状
network.build(input_shape=(1000, 28, 28, 1))
# 统计网络信息
print(network.summary)

模型训练和保存:

optimizer = tf.keras.optimizers.RMSprop(0.01)
# 训练20个epoch
for step, (x, y) in enumerate(train_db):
    with tf.GradientTape() as tape:
        # 插入通道维度 =》[b,28,28,1]
        x = tf.expand_dims(x, axis=3)
        # 前向计算,获取10类别的概率分布 [b,784]=>[b,10]
        out = network(x)
        # 计算交叉熵损失函数,标量
        loss = criteon(y, out)
    # 自动计算梯度
    grads = tape.gradient(loss, network.trainable_variables)
    # 自动更新参数
    optimizer.apply_gradients(zip(grads, network.trainable_variables))
    if step % 100 == 0:
        with summary_writer.as_default():
            tf.summary.scalar('loss', float(loss), step=step)
    # 计算准确度
    if step % 100 == 0:
        correct, total = 0, 0
        for x, y in test_db:
            # 插入通道维度 =>[b,28,28,1]
            x = tf.expand_dims(x, axis=3)
            # 前向计算,获得10类别的预测分布 [b,784] => [b,10]
            out = network(x)
            # 真实的流程时先经过softmax,再argmax
            # 但是由于softmax不改变元素的大小相对关系,故省去
            pred = tf.argmax(out, axis=-1)
            y = tf.cast(y, tf.int64)
            y = tf.argmax(y, axis=-1)
            # 统计预测正确的数量
            correct += float(tf.reduce_sum(tf.cast(tf.equal(pred, y), tf.float32)))
            # 统计预测样本的总数量
            total += x.shape[0]
        with summary_writer.as_default():
            tf.summary.scalar('acc', float(correct / total), step=step)
tf.saved_model.save(network, 'model-savedmodel')

tensorboard的图像

在这里插入图片描述

完整的代码:

"""
LetNet-5 实战
"""
import tensorboard
import tensorflow as tf
from tensorflow.keras import Sequential, layers, losses, optimizers, datasets
import datetime

devices = tf.config.experimental.list_physical_devices('GPU')
tf.config.experimental.set_memory_growth(devices[0], True)


# 加载手写数据集文件
def preprocess(x, y):
    """
    预处理函数
    """
    # [b, 28, 28], [b]
    x = tf.cast(x, dtype=tf.float32) / 255.
    y = tf.cast(y, dtype=tf.int32)
    y = tf.one_hot(y, depth=10)
    return x, y


current_time = datetime.datetime.now().strftime(('%Y%m%d-%H%M%S'))
log_dir = 'logs/' + current_time
summary_writer = tf.summary.create_file_writer(log_dir)
(x, y), (x_test, y_test) = datasets.mnist.load_data()  # 加载手写数据集数据
batchsz = 1000
train_db = tf.data.Dataset.from_tensor_slices((x, y))  # 转化为Dataset对象
train_db = train_db.shuffle(100000)  # 随机打散
train_db = train_db.batch(batchsz)  # 批训练
train_db = train_db.map(preprocess)  # 数据预处理
train_db = train_db.repeat(30)  # 复制30份数据
test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test))
test_db = test_db.shuffle(1000).batch(batchsz).map(preprocess)
# 通过Sequnentia容器创建LeNet-5
network = Sequential([
    layers.Conv2D(6, kernel_size=3, strides=1),  # 第一个卷积核,6个3X3的卷积核,
    layers.MaxPooling2D(pool_size=2, strides=2),  # 高宽各减半的池化层
    layers.ReLU(),  # 激活函数
    layers.Conv2D(16, kernel_size=3, strides=1),  # 第二个卷积核,16个3X3的卷积核,
    layers.MaxPooling2D(pool_size=2, strides=2),  # 高宽各减半的池化层
    layers.ReLU(),  # 激活函数
    layers.Flatten(),  # 打平层,方便全连接层处理
    layers.Dense(120, activation='relu'),  # 全连接层,120个结点
    layers.Dense(84, activation='relu'),  # 全连接层,84个结点
    layers.Dense(10, activation='relu')  # 全连接层,10个结点
])
# build 一次网络模型,给输入X的形状
network.build(input_shape=(1000, 28, 28, 1))
# 统计网络信息
print(network.summary)
# 创建损失函数的类,在实际计算时直接调用类实例
criteon = losses.CategoricalCrossentropy(from_logits=True)
optimizer = tf.keras.optimizers.RMSprop(0.01)
# 训练20个epoch
for step, (x, y) in enumerate(train_db):
    with tf.GradientTape() as tape:
        # 插入通道维度 =》[b,28,28,1]
        x = tf.expand_dims(x, axis=3)
        # 前向计算,获取10类别的概率分布 [b,784]=>[b,10]
        out = network(x)
        # 计算交叉熵损失函数,标量
        loss = criteon(y, out)
    # 自动计算梯度
    grads = tape.gradient(loss, network.trainable_variables)
    # 自动更新参数
    optimizer.apply_gradients(zip(grads, network.trainable_variables))
    if step % 100 == 0:
        with summary_writer.as_default():
            tf.summary.scalar('loss', float(loss), step=step)
    # 计算准确度
    if step % 100 == 0:
        correct, total = 0, 0
        for x, y in test_db:
            # 插入通道维度 =>[b,28,28,1]
            x = tf.expand_dims(x, axis=3)
            # 前向计算,获得10类别的预测分布 [b,784] => [b,10]
            out = network(x)
            # 真实的流程时先经过softmax,再argmax
            # 但是由于softmax不改变元素的大小相对关系,故省去
            pred = tf.argmax(out, axis=-1)
            y = tf.cast(y, tf.int64)
            y = tf.argmax(y, axis=-1)
            # 统计预测正确的数量
            correct += float(tf.reduce_sum(tf.cast(tf.equal(pred, y), tf.float32)))
            # 统计预测样本的总数量
            total += x.shape[0]
        with summary_writer.as_default():
            tf.summary.scalar('acc', float(correct / total), step=step)

tf.saved_model.save(network, 'model-savedmodel')
TF2.0深度学习实战(三):搭建LeNet-5卷积神经网络 史上最易深度学习实战教程! 阅读详情

相关推荐

tensorflow实现LeNet-5的卷积神经网络

里面包含mnist数据集,不用再去下载,程序直接能用。由于model文件夹里有训练好的模型,可以直接跑测试,由于只跑了6000轮训练,不到完整的3W轮,所以只达到了98.8%,你们可以自己训练完一整套,能达到99.*%的准确率。若不满意,那自己调超参数 (初试的指数衰减率 和 每次衰减比率),好了,下次上传迁移学习的代码,下回见,

LeNet-5实战

一、LeNet-5介绍 LeNet-5用于手写数字和机器打印字符图片识别的神经网络。 LeNet-5 的网络结构图,它接受32 × 32大小的数字、字符图片,经过第一个卷积层得到[b, 28,28,6] 形状的张量,经过一个向下采样层,张量尺寸缩小到[b,14,14,6] ,经过第二个卷积层,得到[b,10,10,16] 形状的张量,同样经过下采样层,张量尺寸缩小到[b,5,5,16]],在进入全连接层之前,先将张量打成[b,400]的张量,送入输出节点数分别为 120、 84 的 2 个全连接层,

风间琉璃的博客 1729

Tensorflow2.0:实战LeNet-5识别MINIST数据集

LeNet-5模型 1990 年代提出的LeNet-5使卷积神经网络在当时成功商用,下图是 LeNet-5 的网络结构图,它接受32 × 32大小的数字、字符图片,这次将LeNet-5模型用来识别MINIST数据集中的数字,并在测试集中计算其识别准确率。 根据上图的网络结构,可以得出下图的模型结构图: 完整代码示例 第一部分:数据集的加载与预处理 import tensorflow as tf from tensorflow import keras from tensorflow.keras import datasets # 导入经典数据集加载模块 # 加载 MNIST 数据集 (x

LeNet-5经典卷积神经网络模型搭建及应用实例

LeNet-5卷积神经网络是用于图像识别的经典神经网络,本文从零复现整个模型,同时采用相应的数据集进行训练和测试。

dooglocool的博客 1393

IEC61850 通信协议测试验证实战指南:从理论到实践

本文提供了一份全面的IEC61850通信协议测试验证实战指南,强调测试必须从理论走向工程实践。文章详细讲解了如何搭建测试环境,并深入剖析了MMS、GOOSE、SV三大核心协议的实战测试方法,旨在帮助工程师通过系统化的测试验证,确保电力自动化设备的互操作性与通信可靠性。

weixin_29204121的博客 171

Aruba无线控制器实战:如何用Client Match优化企业办公区漫游(附SNR调优技巧)

本文深入解析了如何利用Aruba无线控制器的Client Match功能优化企业办公区无线漫游体验。通过实战配置,详细阐述了基于SNR(信噪比)的精细化调优策略,包括阈值设定、负载均衡与场景化参数调整,旨在解决终端粘滞、乒乓漫游等问题,实现智能、平滑的无缝漫游。

weixin_28318011的博客 230

LeNet-5应用

数据导入有两步,先用datasets导入,然后用dataloader加载。训练结果在epoch=5时,能达到91%。可视化预测结果,可以看出,16个预测14个准确,准确率87.5%。MNIST共有70000张图片,60000张训练集,10000张测试集。图片大小28*28,灰度图。因为是灰度图,所以mean和std都只有一个参数,如果为RGB,都为(0.5,0.5,0.5)预测图100%正确。所以提高epoch还是有用的。预测结果epoch=3的时候已经成绩达到99%。其它都不需要修改,直接可以进行训练。

xfsong2012的博客 2026

Mac上IDEA的PlantUML插件报错‘找不到Graphviz’?手把手教你用Homebrew搞定(附阿里云镜像避坑)

本文详细解决了Mac上IDEA的PlantUML插件报错‘找不到Graphviz’的问题,通过Homebrew安装Graphviz并配置阿里云镜像源,特别针对Apple Silicon芯片用户提供了优化方案。文章还涵盖了IDEA中PlantUML插件的正确配置和常见问题排查,帮助开发者高效使用PlantUML进行UML图表设计。

weixin_42619742的博客 469

tensorflow2实现LeNet-5网络

利用lenet网络实现图片分类 1、导入相关包 import tensorflow as tf from tensorflow import keras import numpy as np import matplotlib.pyplot as plt 2、获取数据集并作预处理 fashion_mnist = tf.keras.datasets.fashion_mnist (train_images,train_labels),(test_images,test_labels) = fashion_mn

l2l666的博客 1955

S32K3双核实战:手把手教你用EB配置CAN与CANFD(附中断/轮询代码对比)

本文详细解析了NXP S32K3双核处理器在CAN/CANFD通信开发中的实战应用。通过Elektrobit配置工具链,从双核通信架构设计到EB tresos Studio配置全流程,再到中断与轮询模式的代码实现对比,全面指导开发者优化S32K3 FlexCAN模块性能,提升汽车电子系统的通信效率与可靠性。

weixin_30955617的博客 440

ADS版图优化中的参数化设计技巧

本文详细介绍了在ADS中进行射频电路版图参数化设计的核心技巧。通过将版图关键尺寸定义为变量,并与电磁仿真及优化器联动,实现从手动修改到自动迭代的转变,极大提升了PA、LNA等电路的设计与优化效率。文章以阶梯阻抗变换器为例,阐述了变量创建、绑定及协同仿真的完整流程,并提供了避免网格冲突、变量混乱等常见问题的实用指南。

weixin_29296241的博客 405

TensorFlow2.0之LeNet-5实战

TensorFlow2.0之LeNet-5实战

shengxing_stu的博客 520

动态规划法:n*m方格前进问题

在一个n*m的方格中,m为奇数,放置有n*m个数,方格中间的下方有一人,此人可按照正前方相临的五个方向(方格)前进但不能越出方格。人每走过一个方格必须取此方格中的数。要求找到一条从底到顶的路径,使其数相加之和为最大。输出和的最大值。 算法设计: 可以使用动态规划方法,从顶部开始,将第二排的每个数加上顶部第一排的最优解,将6排的问题缩小为5排的问题,然后重复该操作,直到底部最后一排,此时

Winifred_1997的博客 4675

tensorflow2.0卷积神经网络实战笔记

卷积神经网络 本文参考《TensorFlow2深度学习》 背景知识 1、深度学习的深度是指网络的层数较深,一般有5层以上。1~4层神经网络称为浅层神经网络。浅层神经网络不能很好的提取数据的高层特征,表达能力一般,很快被1990年代新提出的支持向量机(SVM)所超越。2006年,Hinton大佬提出了一种逐层预训练的算法,可以有效的初始化DBN网络,从而使得训练大规模、深层数(上百万的参数量)的神经网络成为可能。深度学习的概念被首次提出。深度学习和神经网络本质上指代基本一致,深度学习更侧重于深层次的神经网络的

weixin_44877390的博客 1470

泰凌微8258入门教程 基础篇①——Bluetooth® SIG Mesh 快速上手

Bluetooth® SIG Mesh Quick Start

6730

华为 MetaERP 通过元数据驱动的多组织架构 + 内部交易协同 + 自动对账引擎 + 合并规则引擎,实现多组织内部往来与合并报表的全流程自动抵消,核心是源头标准化、过程自动化、结果可追溯

摘要: 华为MetaERP通过元数据驱动的多组织架构与主数据标准化,实现内部往来与合并报表全流程自动化。其核心包括:统一组织模型与主数据(确保数据口径一致)、内部交易协同(自动生成对称凭证)、智能对账引擎(多维度自动匹配差异)、合并规则引擎(配置化抵消模板)。依托GaussDB高性能数据库与流批一体架构,华为全球88家子公司合并报表效率提升400%,关账时间缩短至2小时,支持多准则、多币种自动抵消,审计全程可追溯。相比传统ERP,MetaERP在协同性、自动化与扩展性上优势显著,为跨国集团提供高效、准确的合

金牌架构师 264

DL-tf2.0实战-流程化

DL-tf2.0实战-流程化前言一、文章是什么?二、流程介绍三、详细流程3.1数据准备3.1数据预处理3.3模型搭建3.4编译与训练总结 前言   github上开源的成熟案例,大多是基于Pytorch或tf1.x的框架实现的,tf2.0的案例不多,而且文档资料也有限,作为实战新人,看到官网都升级到2.x了,也没有必要过多的纠结老版本了,看一些相关介绍,tf2.x用到很多keras的代码,看上去通俗易懂些,所以,就直接入手2.x版本了,并借助优快云的平台记录下学习心得,也更好的为初学者提供点借鉴资料。  

weixin_42823098的博客 545

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

TensorFlow2.0之还原lenet-5模型

最近课程需要,将lenet-5模型进行还原,但是网上博客大都根据原论文进行了自己的改进,不能满足还原的这个要求,所以按照论文结合TensorFlow2.0的API,将其还原。 from tensorflow.python.client import device_lib device_lib.list_local_devices() The default version of Tensor...

锅巴 1608

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

tensorflow2.0 (1)使用LeNet5网络预测cifar10数据集中分类

参考内容 北京大学, 软微学院, 曹健老师, 《人工智能实践:TensorFlow2.0笔记》 运行环境 Python3.7 tenso2.6 训练数据集:cifar10 前言 曹老师用的是Class形式构造的网络结构,搜了一些博客,也没能做到将保存的网络模型加载,并预测自己下载的图片。自己需要学的东西还有太多太多了。 这里,换了一种思路,用Sequential形式构造网络,训练,保存模型,预测自己的图片。 1 )构建网络,训练,保存模型文件 cifar10_lenet5sequential.py impo

Powerking666的博客 813

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

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

卷积神经网络(CNN)原理与实战:从图像特性到工程落地

卷积神经网络(CNN)是一种专为处理具有空间结构的数据(如图像)而设计的深度学习模型。其核心在于利用局部感受野、权值共享和池化操作,建模像素间的空间相关性,并天然支持平移不变性。相比传统全连接网络,CNN大幅降低参数量、提升泛化能力与计算效率,成为计算机视觉任务的事实标准。在实际工程中,CNN广泛应用于图像分类、目标检测、医学影像分析等场景,其性能高度依赖于卷积核设计、填充策略、步长选择及正则化手段。本文结合LeNet-5复现与TensorFlow 2.0代码,深入解析CNN的数学本质与调试要点,覆盖从原理

weixin_33437929的博客 304

TensorFlow学习笔记——实现经典LeNet5模型

TensorFlow实现LeNet-5模型 文章目录TensorFlow实现LeNet-5模型前言一、什么是TensorFlow?计算图Session二、什么是LeNet-5?INPUT层C1层S2层C3层S4层C5层F6层OUTPUT层三、搭建过程(代码详解)四、完整源码 前言 今天学习使用TensorFlow搭建LeNet-5神经网络。也许一些刚入门的同学看到这个标题,就已经蒙了,啥是Tens...

Jmuyjl 6359

LeNet-5模型及TensorFlow2.9.0的实现

LeNet-5模型LeNet-5共5各部分组成,为两个卷积池化组+3个全连接神经网络组成,也可以称做5层神经网络。本文基于LeNet-5模型写了TensorFlow代码实现。

zz_cry的专栏 1095

Tensorflow2实现LeNet

Tesorflow2实现LeNet相关介绍实验环境具体实现导入相关库获取CIFAR10 数据集LeNet模型训练模型评估模型保存模型加载模型进行预测参考文献 相关介绍 卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一 。卷积神经网络具有表征学习(representation learning)能力,能够按其阶层

FriendshipTang的博客 2765

【TensorFlow2.0】LeNet进行手写体数字识别

LeNet简介 LeNet-5出自论文Gradient-Based Learning Applied to Document Recognition,是一种用于手写体字符识别的非常高效的卷积神经网络。 卷积神经网络 卷积神经网络能够很好的利用图像的结构信息。LeNet-5是一个较简单的卷积神经网络。下图显示了其结构:输入的二维图像,先经过两次卷积层到池化层,再经过全连接层,最后使用softmax分类作为输出层。下面我们主要介绍卷积层和池化层。 LeNet 1、INPUT层-输入层 2、C1层-卷积层 3、

桜 1348

重学深度学习系列---LeNet5实现手写数字识别(TensorFlow2-mnist数据集)

重学深度学习系列—LeNet5实现手写数字识别(TensorFlow2-mnist数据集) 文章目录重学深度学习系列---LeNet5实现手写数字识别(TensorFlow2-mnist数据集)我的环境:一、LeNet5简单介绍二、LeNet-5代码实现三、训练四、对图片进行预测五、训练过程截图:参考资料 我的环境: TensorFlow2.3.0 、Pycharm、Windows10 代码已发布在码云上:https://gitee.com/jiangyi-yan/re-learning-and-deep-

Aiden_yan的博客 7567
上一篇: Tensorflow2.0之可视化界面(tensorboard)
下一篇: Tensorflow2.0之BatchNorm层
AndSonder
博客等级 码龄7年 364粉丝 154原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值