卷积神经网络实例2:反卷积

神经网络卷积反卷积及池化计算公式、特征图通道数(维度)变化实例 阅读详情

       反卷积是指,通过测量输出和已知输入重构未知输入的过程。在神经网络中,反卷积过程并不具备学习的能力,仅仅是用于可视化一个已经训练好的卷积网络模型,没有学习训练的过程。对于一个复杂的深度卷积网络,通过每层若干个卷积核的变换,我们无法知道每个卷积核关注的是什么,变换后的特征是什么样子。通过反卷积的还原,可以对这些问题有个清晰的可视化,以各层得到的特征图作为输入,进行反卷积,得到反卷积结果,用以验证显示各层提取到的特征图。

    由于反卷积网络的特性,导致它有许多特别的应用,一般可以用于信道均衡、图像恢复、语音识别等未知输入估计和过程辨识方面的问题。

     反卷积并不能复原卷积操作的输入值,仅仅是将卷积变换过程中的步骤反向变换一次而已,通过将卷积核转置,与卷积后的结果再做一遍卷积,所以它还有个名字叫“转置卷积”。虽然它不能还原出原来卷积的样子,但是在作用上具有类似的效果,可以将带有小部分缺失的 信息最大化地恢复,也可以用来恢复被卷积生成后的原始输入。

def conv2d_transpose(value, filter, output_shape, strides, padding="SAME", data_format="NHWC", name=None)

  • value:代表通过卷积操纵之后的张量,一般用NHWC类型。
  • filter:代表卷积核。
  • output_shape:代表输出的张量形状也是个四维张量。
  • strides:代表步长。
  • padding:代表原数据生成value时使用的补0的方式,是用来检查输入形状和输出形状是否合规的。
  • return:按照output_shape指定的形状。
# 反卷积
import numpy as np
import tensorflow as tf
 
img = tf.Variable(tf.constant(1.0, shape=[1, 4, 4, 1]))
filter = tf.Variable(tf.constant([1.0, 0, -1, -2], shape=[2, 2, 1, 1]))
 
conv = tf.nn.conv2d(img, filter, strides=[1, 2, 2, 1], padding="VALID")
cons = tf.nn.conv2d(img, filter, strides=[1, 2, 2, 1], padding="SAME")
print(conv.shape)
print(cons.shape)
 
contv = tf.nn.conv2d_transpose(conv, filter, [1, 4, 4, 1], strides=[1, 2, 2, 1], padding="VALID")
conts = tf.nn.conv2d_transpose(cons, filter, [1, 4, 4, 1], strides=[1, 2, 2, 1], padding="SAME")
 
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print("conv:\n", sess.run([conv, filter]))
    print("cons:\n", sess.run([cons]))
    print("contv:\n", sess.run([contv]))
    print("conts:\n", sess.run([conts]))


        反卷积的结果与原来的全1矩阵不等,说明转置卷积只能恢复部分特征,无法百分百地恢复原始数据。

反池化

        反池化是属于池化的逆操作,是无法通过池化的结果还原出全部的原始数据。因为池化的过程就是只保留主要信息,舍去部分信息。如想从池化后的这些主要信息恢复出全部信息,则存在着信息缺失,这时只能通过补位来实现最大程度的信息完整。

tf.gradient()求梯度

tf.stop_gradient()梯度停止

实例:用反卷积技术复原卷积网络各层图像,通过tensorboard观察其结果。

import cifar10_input
import tensorflow as tf
import numpy as np

batch_size = 128
print("begin")
images_train, labels_train = cifar10_input.inputs(eval_data = False, batch_size = batch_size)
images_test, labels_test = cifar10_input.inputs(eval_data = True, batch_size = batch_size)
print("begin data")

#最大池化
def max_pool_with_argmax(net, stride):
    _, mask = tf.nn.max_pool_with_argmax( net,ksize=[1, stride, stride, 1], strides=[1, stride, stride, 1],padding='SAME')
    mask = tf.stop_gradient(mask)
    net = tf.nn.max_pool(net, ksize=[1, stride, stride, 1],strides=[1, stride, stride, 1], padding='SAME') 
    return net, mask
#4*4----2*2--=2*2 【6,8,12,16】    
#反池化
def unpool(net, mask, stride):
    ksize = [1, stride, stride, 1]
    input_shape = net.get_shape().as_list()

    output_shape = (input_shape[0], input_shape[1] * ksize[1], input_shape[2] * ksize[2], input_shape[3])

    one_like_mask = tf.ones_like(mask)
    batch_range = tf.reshape(tf.range(output_shape[0], dtype=tf.int64), shape=[input_shape[0], 1, 1, 1])
    b = one_like_mask * batch_range
    y = mask // (output_shape[2] * output_shape[3])
    x = mask % (output_shape[2] * output_shape[3]) // output_shape[3]
    feature_range = tf.range(output_shape[3], dtype=tf.int64)
    f = one_like_mask * feature_range

    updates_size = tf.size(net)
    indices = tf.transpose(tf.reshape(tf.stack([b, y, x, f]), [4, updates_size]))
    values = tf.reshape(net, [updates_size])
    ret = tf.scatter_nd(indices, values, output_shape)
    return ret

def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)
def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)
def conv2d(x, W):
    return tf.nn.conv2d(x, W, strides=[1,1,1,1], padding="SAME")
def max_pool_2x2(x):
    return tf.nn.max_pool(x, ksize=[1,2,2,1],strides=[1,6,6,1], padding="SAME")
def avg_pool_6x6(x):
    return tf.nn.avg_pool(x, ksize=[1, 6, 6, 1],
                        strides=[1, 6, 6, 1], padding='SAME')

x = tf.placeholder(tf.float32, [batch_size,24,24,3])
y = tf.placeholder(tf.float32, [batch_size, 10])
# 第一层
W_conv1 = weight_variable([5, 5, 3, 64])
b_conv1 = bias_variable([64])
x_image = tf.reshape(x, [-1, 24, 24, 3])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
# h_pool1 = max_pool_2x2(h_conv1)
h_pool1, mask1 = max_pool_with_argmax(h_conv1, 2)
# 第二层
W_conv2 = weight_variable([5, 5, 64, 64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
# h_pool2 = max_pool_2x2(h_conv2)
######################################################
h_pool2, mask = max_pool_with_argmax(h_conv2, 2) 
print(h_pool2.shape) # (128, 6, 6, 64)
t_conv2 = unpool(h_pool2, mask, 2)
t_pool1 = tf.nn.conv2d_transpose(t_conv2-b_conv2, W_conv2, h_pool1.shape, [1,1,1,1])
print(t_conv2.shape,h_pool1.shape,t_pool1.shape)
t_conv1 = unpool(t_pool1, mask1, 2)
t_x_image = tf.nn.conv2d_transpose(t_conv1-b_conv1, W_conv1, x_image.shape, [1,1,1,1])
# 第一层卷积还原
t1_conv1 = unpool(h_pool1, mask1, 2)
t1_x_image = tf.nn.conv2d_transpose(t1_conv1-b_conv1, W_conv1, x_image.shape, [1,1,1,1])
# 生成最终图像
stitched_decodings = tf.concat((x_image, t1_x_image, t_x_image), axis=2)
decoding_summary_op = tf.summary.image("source/cifar", stitched_decodings)
######################################################
# 第三层
W_conv3 = weight_variable([5, 5, 64, 10])
b_conv3 = bias_variable([10])
h_conv3 = tf.nn.relu(conv2d(h_pool2, W_conv3) + b_conv3)
nt_hpool3=avg_pool_6x6(h_conv3)#10
nt_hpool3_flat = tf.reshape(nt_hpool3, [-1, 10])
# 分类
y_conv=tf.nn.softmax(nt_hpool3_flat)
# 损失计算
cross_entropy = -tf.reduce_sum(y*tf.log(y_conv)) +(tf.nn.l2_loss(W_conv1)+tf.nn.l2_loss(W_conv2)+tf.nn.l2_loss(W_conv3))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
# 训练
sess = tf.Session()
sess.run(tf.global_variables_initializer())
summary_writer = tf.summary.FileWriter("./log/", sess.graph)
tf.train.start_queue_runners(sess=sess)
for i in range(15000):#20000
    image_batch, label_batch = sess.run([images_train, labels_train])
    label_b = np.eye(10,dtype=float)[label_batch] #one hot
    train_step.run(feed_dict={x:image_batch, y: label_b},session=sess)
    if i%200 == 0:
        train_accuracy = accuracy.eval(feed_dict={
            x:image_batch, y: label_b},session=sess)
        print( "step %d, training accuracy %g"%(i, train_accuracy))
        print("cross_entropy",cross_entropy.eval(feed_dict={x:image_batch, y: label_b},session=sess))
# 测试集
# 测试集
image_batch, label_batch = sess.run([images_test, labels_test])
label_b = np.eye(10,dtype=float)[label_batch]#one hot
print ("finished! test accuracy %g"%accuracy.eval(feed_dict={
     x:image_batch, y: label_b},session=sess))
decoding_summary = sess.run(decoding_summary_op,feed_dict={x:image_batch, y: label_b})
summary_writer.add_summary(decoding_summary)
finished! test accuracy 0.6875 

# tensorboard --logdir ./log

全卷积网络FCN进行图像分割 背景CNN能够对图片进行分类,可是怎么样才能识别图片中特定部分的物体,在2015年之前还是一个世界难题。神经网络大神Jonathan Long发表了《Fully Convolutional Networks for Semantic Segmentation》在图像语义分割挖了一个坑,于是无穷无尽的人往坑里面跳。全卷积网络 Fully Convolutional NetworksCNN 与 FCN通 阅读详情

相关推荐

上采样,反卷积,上池化概念区别

通过卷积和池化等技术可以将图像进行降维,因此,一些研究人员也想办法恢复原分辨率大小的图像,特别是在语义分割领域应用很成熟。通过对一些资料的学习,简单的整理下三种恢复方法,并进行对比。 1、Upsampling(上采样) 在FCN、U-net等网络结构中,涉及到了上采样。上采样概念:上采样指的是任何可以让图像变成更高分辨率的技术。最简单的方式是重采样和插值:将输入图片进行rescale到一个想要...

庆志的小徒弟 1万+

反卷积神经网络

反卷积指的是,通过测量输出和已知输入重构未知输入的过程。在神经网络中,反卷积过程不具备学习的能力。可以理解为下图: 反卷积神经网络的应用场景 我们可以利用反卷积神经网络进行信道均衡、图像恢复、语音识别、地震学、无损探伤等未知输入heels过程辨识方面的问题。 反卷积的原理 反卷积,可以理解为卷积操作的逆操作,然而output并不能等于input,反卷积只是将卷积核转置,与卷积后的结果再做一次卷积...

qq_43454276的博客 2297

卷积与反卷积关系超详细说明及推导(反卷积又称转置卷积、分数步长卷积)

  以 CNN 为代表的卷积神经网络在图像的相关领域得到了较为长足的发展。在 CNN 中卷积实际分类两大类,一种是卷积,另一种是转置卷积(transposed convolutional ),或者称为分数步长卷积( fractionally strided convolutional layers),亦或者是反卷积(deconvolution)。   虽然在一些文章中将反卷积与转置卷积认为是等价的...

dugudaibo的博客 2万+

反卷积神经网络介绍

反卷积是指:通过测量输出和已经输入重构未知输入的过程。在神经网络中,反卷积过程并不具备学习的能力,仅仅是用于可视化一个已经训练好的卷积网络模型,没有学习训练的过程。下图所示为VGG 16反卷积神经网络的结构,展示了一个卷积网络和反卷积网络结合的过程。VGG 16是一个深度神经网络模型。它的反卷积就是将中间的数据,按照前面卷积、池化等变化的过程,完全相反地做一遍,从而得到类似原始输入的数据。反卷积神...

实践求真知 6527

反卷积操作Conv2DTranspose

上采样(Upsample) 在CNN网络中,输入图像通过卷积操作提取特征后,输出的尺寸常会变小,而有时我们需要将图像恢复到原来的尺寸以便进行进一步的计算(比如:图像的语义分割),那么我们需要实现图像由小分辨率到大分辨率的映射的操作,叫做上采样(Upsample)。 上采样多多种方法,比如最近邻插值(Nearest neighbor interpolation)、双线性插值(Bi-linear interpolation)等,反卷积也是上采样的一种方法。反卷积,也叫转置卷积,它并不是正向卷积的...

1万+

图像分割技术及经典实例分割网络Mask R-CNN(含基于Keras Python源码定义)

图像分割技术是可以浅显的理解为精细化的目标检测过程,由于之前的目标检测算法只能使用标定框框定规则区域,从而进行分类,标出目标的大题区域,但是,在譬如自动驾驶领域,仅仅只有一个规则的区域去框定目标还是不够的,比如碰到车道线,那么仅仅用一个矩形区域框定车道线并不能准确地指导车辆的下一步动向,所以我们需要一个能够追溯细节的新应用领域,来将检测到的目标精细化。图像分割即为图片的每个对象创建一个像素级的掩膜,这样可以追溯到目标轮廓的更多细节。下图为细菌的图像分割例子,为每个细菌做了图像分割。

Moresweet 猫甜 9332

pytorch中反卷积torch.nn.ConvTranspose2d()的使用

卷积: class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, groups=1, bias=True) 蓝色为输入,蓝色上的阴影为卷积核(kernel),绿色为输出,蓝色边缘的白色框为padding 反卷积: class torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, o

qq_39777550的博客 5401

【深度学习 | CNN】“深入解析卷积神经网络与反卷积:从生活案例到原理的全面指南” (从一维、二维、三维讲解)

《深入解析卷积神经网络:从原理到应用的全面指南》。在这篇指南中,我们将深入探讨卷积神经网络(Convolutional Neural Networks, CNNs)的原理和应用,为您提供全面的解析和指导。 随着人工智能和机器学习技术的快速发展,卷积神经网络已经成为图像识别、计算机视觉和自然语言处理等领域的核心技术。无论您是一位学术研究人员,还是一位工程师或开发人员,这份全面指南都将为您提供宝贵的知识和见解。

计算机魔术师的blog 3228

pytorch 反卷积 可视化_PyTorch中反卷积的用法详解

pytorch中的 2D 卷积层 和 2D 反卷积层 函数分别如下:class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, groups=1, bias=True)class torch.nn.ConvTranspose2d(in_channels, out_channels, kerne...

weixin_42150745的博客 264

反卷积_神经网络_神经_反卷积_网络_卷积神经_

压缩包中是反卷积神经网络的相关介绍文档整合。

[QT笔记]QTableView与QTableWidget表头设置实战对比

本文深入对比了QT开发中QTableView与QTableWidget在表头设置上的核心差异与实践方法。QTableWidget提供开箱即用的便捷API,适合快速开发;而QTableView遵循模型-视图架构,表头数据由模型管理,虽设置稍复杂但灵活性与扩展性更强。文章通过实战代码示例,详细解析了两种组件的适用场景、性能考量及常见避坑指南,帮助开发者根据项目需求做出高效选择。

weixin_29018335的博客 322

彻底搞懂CNN中的卷积和反卷积

前言 卷积和反卷积在CNN中经常被用到,想要彻底搞懂并不是那么容易。本文主要分三个部分来讲解卷积和反卷积,分别包括概念、工作过程、代码示例,其中代码实践部分主结合TensorFlow框架来进行实践。给大家介绍一个卷积过程的可视化工具,这个项目是github上面的一个开源项目。 卷积和反卷积 卷积(Convolutional):卷积在图像处理领域被广泛的应用,像滤波、边缘检测、图片锐化等,都是通过...

修炼之路 8万+

易灵思Trion FPGA实战:5分钟搞定MIPI硬核配置(附Interface Designer避坑指南)

本文详细介绍了易灵思Trion FPGA中MIPI硬核的快速配置方法,通过Interface Designer工具实现从时钟配置到数据收发的全流程实战。特别针对初次接触Trion系列的设计师,提供了六个关键配置陷阱及解决方案,帮助开发者高效完成嵌入式视觉和高速数据传输项目。

eee77的博客 791

反卷积(Deconvnet)可视化CNN卷积层

继上一篇总体上deconvolution networks大致可以分为以下3个方面:之后我想开始学一下CNN可视化:通过deconv将CNN中conv得到的feature map还原到像素空间,以观察特定的feature map对哪些pattern的图片敏感,这里的deconv其实不是conv的可逆运算,只是conv的transpose,所以tensorflow里一般取名叫transpose_co...

fu6543210的博客 1万+

RealSense D435i深度相机实战:从像素坐标到三维空间的精准映射(Python实现)

本文详细介绍了使用RealSense D435i深度相机实现从二维像素坐标到三维空间坐标精准映射的两种Python实战方法:深度图反投影法与点云直接查找法。文章涵盖环境搭建、相机对齐、代码实现、性能对比及与YOLO等检测模型结合的进阶应用,并提供了关键的避坑指南和参数调优建议,帮助开发者在机器人、三维重建等项目中高效应用。

weixin_29291573的博客 382

开源ISP介绍(1)——开源ISP的Vivado框架搭建

ZYNQ视频图像处理系统,ISP图像处理硬件实现

路漫漫其修远兮,吾将上下而求索 3289

CNN中反卷积层的理解以及cafffe中反卷积的定义

目录 1.写在前面 2.卷积操作 3.反卷积 4.Caffe中deconvolution定义 5.反卷积的作用 1.写在前面 本质:反卷积层和卷积层的工作过程很相似,主要区别在于,反卷积会通过padding,使得output大与input,而卷积是output小于input。 2.卷积操作 ...

一个做图像文本的深度学习人 3042

30分钟上手YOLO26 nano:INT8量化部署到智能相机,推理速度提升43%

微调代码(仅需5行,数据集遵循COCO格式)data="custom_data.yaml", # 数据集配置文件epochs=20, # 少量轮数即可收敛batch=8,imgsz=640model.save("yolov26n_custom.pt") # 保存微调后的模型本文在30分钟内完成了YOLO26 nano的INT8量化与智能相机部署,核心步骤为环境准备→模型获取→ONNX导出→INT8量化→部署推理。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 988

CNN中的卷积、反卷积与反池化

1 反卷积DeConvolution 反卷积(Deconvolution)的概念第一次出现是Zeiler在2010年发表的论文Deconvolutional networks中,但是并没有指定反卷积这个名字,反卷积这个术语正式的使用是在其之后的工作中(Adaptive deconvolutional networks for mid and high level feature learning)...

qinghuaci666的博客 1万+

建设银行核心系统建设历程全网最详细记录

中国建设银行核心系统数字化转型之路 摘要:中国建设银行自1954年成立以来,其核心系统经历了从分散到集中、再到分布式架构的演进历程。2002-2005年完成的数据大集中工程(DCC)实现了全行业务统一管理,2010年启动的"新一代核心系统"构建了企业级架构,率先实现"一次研发,全行共享"。2020年起全面推进主机下移战略,通过分布式架构改造,攻克八大关键技术难题,于2024年7月完成境内外全量核心业务下移,日均同步数据8亿条,实现金融核心系统完全自主可控。这一转型不仅

银行信息系统应用架构详解 4872

【ArcGIS微课1000例】0068:ArcGIS加载world imagery高清卫星影像教程

本文介绍了如何在ArcGIS中加载World Imagery高清卫星影像作为谷歌影像的替代方案。通过添加ArcGIS Server并输入在线图集URL(https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer),即可连接并预览包含中国影像、青海湖、东方明珠等全球高清卫星图。该教程提供了详细的操作步骤图示,帮助用户快速获取优质底图数据,适用于地理信息分析和可视化应用。

智慧空间实验室 5418

卷积神经网络--图像卷积与反卷积(后卷积,转置卷积)

1.前言 传统的CNN网络只能给出图像的LABLE,但是在很多情况下需要对识别的物体进行分割实现end to end,然后FCN出现了,给物体分割提供了一个非常重要的解决思路,其核心就是卷积与反卷积,所以这里就详细解释卷积与反卷积。 对于1维的卷积,公式(离散)与计算过程(连续)如下,要记住的是其中一个函数(原函数或者卷积函数)在卷积前要翻转180度 图一 对于离散卷积,f的大小是n1,g的大小是n2,卷积后的大小是n1+n2-1 2.图像卷积 图二 同样地,卷积的时候需要对卷积核进行180的.

无崖子的博客 5220

骑砍2霸主MOD开发(9)-游戏大地图(MapScene)

Settlement类型由town,castle,castle_village,village,hideout五种类型组成,通过对GameEntity中添加tag实现类型的加载.大地图中军团(MobileParty)的移动速度,AI寻路,食物消耗等均和当前MobileParty所处地形有关,地形统一被定义为TerrainType,类型有森林,荒漠等.MapScene.Read("Main_map", ref sceneInitializationData, "") 装载Main_map大地图。

骑砍战团&霸主MOD开发 1624

什么是反卷积(快速理解)

什么是反卷积参考博客 我们知道输入图像通过卷积神经网络(CNN)提取特征后,输出的尺寸往往会变小,而又是我们需要将图像恢复到原来的尺寸以便进行进一步的计算,整个扩大图像尺寸,实现图像由小分辨率到大分辨率的映射的操作,叫做上采样(Upsample) 反卷积是上采样的一种方式,反卷积也叫转置卷积。 图1 反卷积原理图(stride=1) 上图所示的就是一个反卷积的工作过程,与卷积过程的主要区别在于反卷积输出的图片尺寸会大于输入图片的尺寸,通过增加padding来实现这一操作,上图展示的是一个stride为1的

丶夜未央丶的博客 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

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

反卷积原理 + pytorch反卷积层参数output_padding

一般我们会认为2维卷积的计算分为了以下3类: 1.full   2.same   3. valid 参考:https://cn.mathworks.com/help/matlab/ref/conv2.html? same和valid相信各位同学都不陌生。Valid指不进行padding操作,而same则是通过padding使得卷积之后输出的feature map尺寸保持不变(相对于输入图...

T-Jhon的博客 2万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

理解CNN中的卷积和反卷积

卷积 反卷积 空洞卷积

ncepu_Chen的博客 1728

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: 卷积神经网络实例1:CIFAR10
下一篇: 卷积神经网络实例3:深度学习的模型训练技巧
CopperDong
博客等级 码龄14年 1205粉丝 466原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值