TensorFlow2.0简要教程(四)-用keras构建自己的网络层

Keras/TensorFlow 中,call(self, inputs, training=None, **kwargs)的使用说明 在 Keras/TensorFlow 中,是自定义层(Layer子类)的核心方法,它定义了层的前向传播逻辑。 阅读详情

用keras构建自己的网络层

1 使用Keras自定义网络层
from __future__ import absolute_import, division, print_function
import tensorflow as tf
tf.keras.backend.clear_session()
import tensorflow.keras as keras
import tensorflow.keras.layers as layers
# 定义网络层就是:设置网络权重和输出到输入的计算过程
class MyLayer(layers.Layer):
    def __init__(self, input_dim=32, unit=32):
        super(MyLayer, self).__init__()
        
        w_init = tf.random_normal_initializer()
        self.weight = tf.Variable(initial_value=w_init(
            shape=(input_dim, unit), dtype=tf.float32), trainable=True)
        
        b_init = tf.zeros_initializer()
        self.bias = tf.Variable(initial_value=b_init(
            shape=(unit,), dtype=tf.float32), trainable=True)
    
    def call(self, inputs):
        return tf.matmul(inputs, self.weight) + self.bias
        
x = tf.ones((3,5))
my_layer = MyLayer(5, 4)
out = my_layer(x)
print(out)

按上面构建网络层,图层会自动跟踪权重w和b,当然我们也可以直接用add_weight的方法构建权重

class MyLayer(layers.Layer):
    def __init__(self, input_dim=32, unit=32):
        super(MyLayer, self).__init__()
        self.weight = self.add_weight(shape=(input_dim, unit),
                                     initializer=keras.initializers.RandomNormal(),
                                     trainable=True)
        self.bias = self.add_weight(shape=(unit,),
                                   initializer=keras.initializers.Zeros(),
                                   trainable=True)
    
    def call(self, inputs):
        return tf.matmul(inputs, self.weight) + self.bias
        
x = tf.ones((3,5))
my_layer = MyLayer(5, 4)
out = my_layer(x)
print(out)


也可以设置不可训练的权重

class AddLayer(layers.Layer):
    def __init__(self, input_dim=32):
        super(AddLayer, self).__init__()
        self.sum = self.add_weight(shape=(input_dim,),
                                     initializer=keras.initializers.Zeros(),
                                     trainable=False)
       
    
    def call(self, inputs):
        self.sum.assign_add(tf.reduce_sum(inputs, axis=0))
        return self.sum
        
x = tf.ones((3,3))
my_layer = AddLayer(3)
out = my_layer(x)
print(out.numpy())
out = my_layer(x)
print(out.numpy())
print('weight:', my_layer.weights)
print('non-trainable weight:', my_layer.non_trainable_weights)
print('trainable weight:', my_layer.trainable_weights)

当定义网络时不知道网络的维度是可以重写build()函数,用获得的shape构建网络


class MyLayer(layers.Layer):
    def __init__(self, unit=32):
        super(MyLayer, self).__init__()
        self.unit = unit
        
    def build(self, input_shape):
        self.weight = self.add_weight(shape=(input_shape[-1], self.unit),
                                     initializer=keras.initializers.RandomNormal(),
                                     trainable=True)
        self.bias = self.add_weight(shape=(self.unit,),
                                   initializer=keras.initializers.Zeros(),
                                   trainable=True)
    
    def call(self, inputs):
        return tf.matmul(inputs, self.weight) + self.bias
        
​
my_layer = MyLayer(3)
x = tf.ones((3,5))
out = my_layer(x)
print(out)
my_layer = MyLayer(3)
​
x = tf.ones((2,2))
out = my_layer(x)
print(out)
2.使用子层递归构建网络层


class MyBlock(layers.Layer):
    def __init__(self):
        super(MyBlock, self).__init__()
        self.layer1 = MyLayer(32)
        self.layer2 = MyLayer(16)
        self.layer3 = MyLayer(2)
    def call(self, inputs):
        h1 = self.layer1(inputs)
        h1 = tf.nn.relu(h1)
        h2 = self.layer2(h1)
        h2 = tf.nn.relu(h2)
        return self.layer3(h2)
    
my_block = MyBlock()
print('trainable weights:', len(my_block.trainable_weights))
y = my_block(tf.ones(shape=(3, 64)))
# 构建网络在build()里面,所以执行了才有网络
print('trainable weights:', len(my_block.trainable_weights)) 
trainable weights: 0
trainable weights: 6
可以通过构建网络层的方法来收集loss

class LossLayer(layers.Layer):
  
  def __init__(self, rate=1e-2):
    super(LossLayer, self).__init__()
    self.rate = rate
  
  def call(self, inputs):
    self.add_loss(self.rate * tf.reduce_sum(inputs))
    return inputs
​
class OutLayer(layers.Layer):
    def __init__(self):
        super(OutLayer, self).__init__()
        self.loss_fun=LossLayer(1e-2)
    def call(self, inputs):
        return self.loss_fun(inputs)
    
my_layer = OutLayer()
print(len(my_layer.losses)) # 还未call
y = my_layer(tf.zeros(1,1))
print(len(my_layer.losses)) # 执行call之后
y = my_layer(tf.zeros(1,1))
print(len(my_layer.losses)) # call之前会重新置0

如果中间调用了keras网络层,里面的正则化loss也会被加入进来


class OuterLayer(layers.Layer):
​
    def __init__(self):
        super(OuterLayer, self).__init__()
        self.dense = layers.Dense(32, kernel_regularizer=tf.keras.regularizers.l2(1e-3))
    
    def call(self, inputs):
        return self.dense(inputs)
​
​
my_layer = OuterLayer()
y = my_layer(tf.zeros((1,1)))
print(my_layer.losses) 
print(my_layer.weights) 
3.其他网络层配置
使自己的网络层可以序列化

class Linear(layers.Layer):
​
    def __init__(self, units=32, **kwargs):
        super(Linear, self).__init__(**kwargs)
        self.units = units
​
    def build(self, input_shape):
        self.w = self.add_weight(shape=(input_shape[-1], self.units),
                                 initializer='random_normal',
                                 trainable=True)
        self.b = self.add_weight(shape=(self.units,),
                                 initializer='random_normal',
                                 trainable=True)
    def call(self, inputs):
        return tf.matmul(inputs, self.w) + self.b
    
    def get_config(self):
        config = super(Linear, self).get_config()
        config.update({'units':self.units})
        return config
    
    
layer = Linear(125)
config = layer.get_config()
print(config)
new_layer = Linear.from_config(config)

配置只有训练时可以执行的网络层


class MyDropout(layers.Layer):
    def __init__(self, rate, **kwargs):
        super(MyDropout, self).__init__(**kwargs)
        self.rate = rate
    def call(self, inputs, training=None):
        return tf.cond(training, 
                       lambda: tf.nn.dropout(inputs, rate=self.rate),
                      lambda: inputs)
4.构建自己的模型

通常,我们使用Layer类来定义内部计算块,并使用Model类来定义外部模型 - 即要训练的对象。

Model类与Layer的区别:

  • 它公开了内置的训练,评估和预测循环(model.fit(),model.evaluate(),model.predict())。
  • 它通过model.layers属性公开其内层列表。
  • 它公开了保存和序列化API。

下面通过构建一个变分自编码器(VAE),来介绍如何构建自己的网络。

# 采样网络
class Sampling(layers.Layer):
    def call(self, inputs):
        z_mean, z_log_var = inputs
        batch = tf.shape(z_mean)[0]
        dim = tf.shape(z_mean)[1]
        epsilon = tf.keras.backend.random_normal(shape=(batch, dim))
        return z_mean + tf.exp(0.5*z_log_var) * epsilon
# 编码器
class Encoder(layers.Layer):
    def __init__(self, latent_dim=32, 
                intermediate_dim=64, name='encoder', **kwargs):
        super(Encoder, self).__init__(name=name, **kwargs)
        self.dense_proj = layers.Dense(intermediate_dim, activation='relu')
        self.dense_mean = layers.Dense(latent_dim)
        self.dense_log_var = layers.Dense(latent_dim)
        self.sampling = Sampling()
        
    def call(self, inputs):
        h1 = self.dense_proj(inputs)
        z_mean = self.dense_mean(h1)
        z_log_var = self.dense_log_var(h1)
        z = self.sampling((z_mean, z_log_var))
        return z_mean, z_log_var, z
        
# 解码器
class Decoder(layers.Layer):
    def __init__(self, original_dim, 
                 intermediate_dim=64, name='decoder', **kwargs):
        super(Decoder, self).__init__(name=name, **kwargs)
        self.dense_proj = layers.Dense(intermediate_dim, activation='relu')
        self.dense_output = layers.Dense(original_dim, activation='sigmoid')
    def call(self, inputs):
        h1 = self.dense_proj(inputs)
        return self.dense_output(h1)
    
# 变分自编码器
class VAE(tf.keras.Model):
    def __init__(self, original_dim, latent_dim=32, 
                intermediate_dim=64, name='encoder', **kwargs):
        super(VAE, self).__init__(name=name, **kwargs)
    
        self.original_dim = original_dim
        self.encoder = Encoder(latent_dim=latent_dim,
                              intermediate_dim=intermediate_dim)
        self.decoder = Decoder(original_dim=original_dim,
                              intermediate_dim=intermediate_dim)
    def call(self, inputs):
        z_mean, z_log_var, z = self.encoder(inputs)
        reconstructed = self.decoder(z)
        
        kl_loss = -0.5*tf.reduce_sum(
            z_log_var-tf.square(z_mean)-tf.exp(z_log_var)+1)
        self.add_loss(kl_loss)
        return reconstructed
​
(x_train, _), _ = tf.keras.datasets.mnist.load_data()
x_train = x_train.reshape(60000, 784).astype('float32') / 255
vae = VAE(784,32,64)
optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)
​
vae.compile(optimizer, loss=tf.keras.losses.MeanSquaredError())
vae.fit(x_train, x_train, epochs=3, batch_size=64)

自己编写训练方法

train_dataset = tf.data.Dataset.from_tensor_slices(x_train)
train_dataset = train_dataset.shuffle(buffer_size=1024).batch(64)
​
original_dim = 784
vae = VAE(original_dim, 64, 32)
​
optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)
mse_loss_fn = tf.keras.losses.MeanSquaredError()
​
loss_metric = tf.keras.metrics.Mean()
​
# 每个epoch迭代.
for epoch in range(3):
  print('Start of epoch %d' % (epoch,))
​
  # 取出每个batch的数据并训练.
  for step, x_batch_train in enumerate(train_dataset):
    with tf.GradientTape() as tape:
      reconstructed = vae(x_batch_train)
      # 计算 reconstruction loss
      loss = mse_loss_fn(x_batch_train, reconstructed)
      loss += sum(vae.losses)  # 添加 KLD regularization loss
      
    grads = tape.gradient(loss, vae.trainable_variables)
    optimizer.apply_gradients(zip(grads, vae.trainable_variables))
    
    loss_metric(loss)
    
    if step % 100 == 0:
      print('step %s: mean loss = %s' % (step, loss_metric.result()))


参考链接
https://zhuanlan.zhihu.com/p/59481536

tensorflow2.0教程- Keras 快速入门 tensorflow.keras 快速入门 完整tensorflow2.0教程代码请看tensorflow2,0:中文教程tensorflow2_tutorials_chinese(欢迎star) Keras 是一个用于构建和训练深度学习模型的高阶 API。它可用于快速设计原型、高级研究和生产。 keras的3个优点: 方便用户使用、模块化和可组合、易于扩展 1.导入tf.keras tens... 阅读详情

相关推荐

tensorflow2.0教程—快速入门

文章目录模型的序列化API基本示例模型细节查看查看序列化模型中间层的输出序列化API型缺陷模型的函数式API基本步骤应用模型的训练和评估(1)加载数据集(2)模型的compile(3)模型的训练(4)模型的评估、预测多输入多输出模型模型的保存与读取 本文主要讲解tensorflow 2.0 搭建网络结构的技术细节。 在使用tensorflow 之前首先导入tensorflow import tensorflow as tf from tensorflow import keras from tensorfl

zhong_ddbb的博客 6307

神经网络原理加实现代码

1、卷积结构 卷积神经网络结构包括:卷积层,降采样层,全链接层。每一层有多个特征图,每个特征图通过一种卷积滤波器提取输入的一种特征,每个特征图有多个神经元。 卷积层:通过卷积运算,可以使原信号特征增强,并且降低噪音。他的核心是一个对于原图片进行一个卷积运算,每一个卷积运算对应一个卷积核,一个卷积核得出一个特征图,如上图第一次卷积得出四个特征图,第二次卷积有三个卷积核,每一次的卷积会将图片的像素降低。 卷积层的map个数是在网络初始化指定的,而卷积层的map...

thethornsky的博客 2575

tensorflow2.0系列-6 基于keras构建CNN图像识别模型【tensorflow2.0实战教程 图像识别模型代码】

【AI算法推荐】:tensorflow2.0建模教程系列 【导读】 在tensorflow2.0建模系列教程中,前四节我们用代码演绎了: 系列1:如何用tf2.0进行自定义层网络的设计(add.weight) 系列2:如何用tf2.0进行自定义模型的设计(Model) 系列3:如何用tf2.0实现loss函数和参数调优(loss gradient optimizer) 系列4:.如何用tf2.0...

AI工匠Book 4709

Keras深度学习框架第三讲:通过子类化来创建新的层和模型

通过子类化,我们可以灵活地创建新的神经网络层和模型,以满足特定任务的需求。子类化Layer或Model基类允许我们定义自定义的前向传播逻辑、状态变量以及训练方法。这种方式不仅提供了高度的可定制性,还使得我们能够轻松地整合自定义的损失函数、正则化项以及优化策略。通过组合多个自定义层,我们可以构建出复杂的神经网络模型,从而更有效地处理复杂的机器学习任务。子类化方法使得神经网络的设计和训练过程更加直观和模块化,为深度学习应用提供了强大的工具集。

MUKAMO的博客 1245

AURIX™ TC49x芯片手册中文分享(二)

主要内容为第一章、功能模块的特征

xibaofenqi的博客 1563

MIPI video mode 和 command mode 的区别

1、何为LCD RAM? LCD 是指字面意思是液晶显示屏(Liquid Crystal Display), 而RAM: 随机存取存储器(Random-Access Memory),两者完全是风马牛不相及的东西。 下图是一个标准的LCD的爆炸图(不含TP),请注意图中红色mark的地方:控制IC-- LCD的大脑。所谓的LCD RAM自然是指此大脑是否包含RAM. 题外话<不感兴趣的...

精诚所至 4691

深度学习代码

研究生期间代码

HandsomeWey的博客 279

STM32CUBEMX+STM32H750VB+LWIP+LAN8720A+FREERTOS TCP服务器、UDP数据接收发送、网线热插拔、IAR-8.32开发

STM32CUBEMX+STM32H750VB+LWIP+LAN8720A+FREERTOS TCP服务器、UDP数据接收发送、网线热插拔、IAR-8.32开发STM32H750VB使用STM32CUBEMX生成工程IAR+J-LINK调试准备工作CUBEMX生成的代码问题所在如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章U

qq_37433166的博客 5345

2021 山东大学软件学院 软件工程应用与实践--YOLOV5项目代码分析——(9)

2021SC@SDUSC

qq_57299978的博客 438

OpenHarmony v4.1 Release设置应用随系统自动启动

OpenHarmony 4.1 版本中的 Ability Manager Service (AMS) 提供了应用自启动管理功能,允许系统控制哪些应用可以在系统启动时自动运行。这需要以下两个主要步骤:启用系统的自启动管理支持开发一个系统应用来管理自启动配置。

afufufufu的博客 1902

YOLO26涨点改进 | 独家创新,注意力改进篇 | AAAI 2025 | YOLO26引入 DRM 防御优化模块,进行特征优化/特征增强,助力目标检测、图像分类、图像分割有效涨点

本文提出了一种基于DRM防御优化模块改进的YOLO26网络模型,显著提升了目标检测的鲁棒性和特征提取能力。DRM模块通过优化特征提取过程、增强抗噪声能力和补充细节信息,有效提高了模型在复杂场景下的检测精度和定位准确度。该模块可集成于UNet等主干网络,采用Transformer结构实现特征精炼,在对抗攻击环境下仍能保持稳定的融合效果。实验表明,改进后的模型在红外与可见光图像融合任务中表现出色,同时提升了下游任务性能。文章详细介绍了DRM模块的结构、作用机制及实现代码,并提供了两种YOLO26改进方案.

Ai缝合怪、助力小伙伴高效发论文 145

TensorFlow2.0教程-用keras构建自己的网络层

Tensorflow教程-用keras构建自己的网络层 1.构建一个简单的网络层 from __future__ import absolute_import, division, print_function import tensorflow as tf tf.keras.backend.clear_session() import tensorflow.keras as keras imp...

知行_那片天 1万+

uniapp [全端兼容] - 实现全景图Vr 720°全景效果查看预览功能,3D全景图流畅不卡顿渲染+手势拖拽+悬浮工具按钮,uniAPP实现vr看720度全景效果示例代码(H5小程序APP全兼容)

uniapp显示720度全景图,720°全景图显示,在h5中展示720°全景图,浏览全景图,基于uniApp实现vr全景预览,加载全景图,uni-app全景预览插件,UNI-APP实现3D全景图,实现720°全景图展示,uniapp全景视频播放,uniapp项目实现vr720度全景图片预览,在网页上展示760全景图片和视频,全景图场景切换,UNIAPP全景VR图,uniapp加载720全景图_uniapp怎么加载vr图片,uniapp实现vr全景看房,uni-app实现全景效果,加载很慢卡怎么办,实现全景预

🏆 前端领域优质创作者 1万+

TensorFlow2.0教程-keras 函数api

TensorFlow2.0教程-keras 函数api 完整tensorflow2.0教程代码请看tensorflow2,0:中文教程tensorflow2_tutorials_chinese(欢迎star) # !pip install pydot #!sudo apt-get install graphvizf from __future__ import absolute_import, ...

知行_那片天 1万+

012、乘累加单元(MAC):NPU中最基本的计算单元

本文深入剖析了神经网络处理器(NPU)中的核心计算单元——乘累加单元(MAC)。作者通过实际调试案例揭示了MAC单元设计中的关键问题:定点数格式对齐、累加器位宽陷阱、流水线优化和多MAC同步方案。重点讨论了INT8量化中的边界条件处理、偏置项截断风险以及零值检测等实战经验,并提供了三点实用建议:建立精确的C模型、参考RISC-V P扩展指令集、仔细审查芯片规格书。文章强调硬件加速的实际瓶颈往往在于数据搬运而非计算单元本身,为NPU开发者提供了宝贵的工程实践参考。

m0_50546716的博客 298

基于BenchmarkSQL的达梦数据库TPCC性能测试

中的用户和密码在达梦数据库中创建测试用户,并保证其表空间足够容纳生成的测试数据。如果开启了归档,还要考虑归档日志占用的空间。BenchmarkSQL默认不支持达梦数据库。这里我们让BenchmarkSQL把达梦数据库当作Oracle即可。Oracle数据库对应的测试配置文件为。是使用BenchmarkSQL进行性能测试的主要配置文件。是生成的测试报告,png文件是报告中包含的图片。拷贝达梦数据库驱动到BenchmarkSQL的。测试结束后,会在当前路径下生成一个以。规则命名的结果目录。

Sebastien23的博客 2635

TensorFlow2.0教程-keras模型保存和序列化

TensorFlow2教程-keras模型保存和序列化 1.保持序列模型和函数模型 # 构建一个简单的模型并训练 from __future__ import absolute_import, division, print_function import tensorflow as tf tf.keras.backend.clear_session() from tensorflow impor...

知行_那片天 1万+

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

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

TensorFlow 2.0 教程

最全TensorFlow2.0教程-持续更新 Tensorflow 2.0 教程持续更新: TensorFlow 2.0 教程- Keras 快速入门 TensorFlow 2.0 教程-keras 函数api TensorFlow 2.0 教程-使用keras训练模型 TensorFlow 2.0 教程-用keras构建自己的网络层 TensorFlow 2.0 教程-keras模型保存和序列化...

知行_那片天 11万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【Tensorflow2.0】4、Tensorflow2.0+Keras_快速入门教程

本文是学习keras作者关于tensorflow2.0的教程 全部代码参见我的github #安装tensorflow !pip install tensorflow==2.0.0 import tensorflow as tf print(tf.__version__) 2.0.0 Tensorflow2.0+Keras综述 作者:fchollet,2019年10月 本文是关于Tenso...

dddeee的专栏 3971

温度PID控制PLC程序

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

TensorFlow2.0教程-使用keras训练模型

TensorFlow2.0教程-使用keras训练模型 完整tensorflow2.0教程代码请看tensorflow2,0:中文教程tensorflow2_tutorials_chinese(欢迎star) # !pip install -q pydot # !apt-get install graphviz from __future__ import absolute_import, di...

知行_那片天 1万+

TensorFlow 2.0 教程-安装TensorFlow 2.0

完整tensorflow2.0教程代码请看github:中文教程tensorflow2_tutorials_chinese(欢迎star) 更多TensorFlow2.0 入门教程请持续关注本博客:https://blog.csdn.net/qq_31456593/article/details/88606284 TensorFlow 2.0 教程-安装TensorFlow 2.0 Tensorf...

知行_那片天 1万+

TensorFlow2.0教程-自定义训练实战(非tf.keras)

TensorFlow2教程-自定义训练实战 愿文地址:https://doit-space.blog.csdn.net/article/details/95040756 最全Tensorflow 2.0 入门教程持续更新:https://blog.csdn.net/qq_31456593/article/details/88606284 完整tensorflow2.0教程代码请看 https:/...

知行_那片天 7080

【TensorFlow2.0】以后我们再也离不开Keras了?

TensorFlow2.0 Alpha版已经发布,在2.0中最重要的API或者说到处都出现的API是谁,那无疑是Keras。因此用过2.0的人都会吐槽全世界都是Keras...

hacker_long的专栏 1362

Tensorflow2.0+Keras 快速入门教程

文章目录1. Tensorflow2.0+Keras综述2. Tensorflow基础2.1 Tensors张量2.2 Variables变量2.3 Tensorflow数学运算2.4 GradientTape计算梯度2.5 一个完整的例子2.6 tf.function3. Keras API3.1 基础类Layer3.2 Trainable and non-trainable weights...

我是天才很好 3038

Tensorflow2.0 Keras之自定义网络

Tensorflow2.0 Keras之自定义网络 文章目录Tensorflow2.0 Keras之自定义网络自定义网络层自定义网络 尽管 Keras 提供了很多的常用网络层类,但深度学习可以使用的网络层远远不止这些。科研工作者一般是自行实现了较为新颖的网络层,经过大量实验验证有效后,深度学习框架才会跟进,内置对这些网络层的支持。因此掌握自定义网络层、网络的实现非常重要。 对于需要创建自定义逻辑的...

python_LC_nohtyp的博客 1317

TensorFlow2.0教程-Variables

TensorFlow教程-Variables 创建一个变量 import tensorflow as tf my_var = tf.Variable(tf.ones([2,3])) print(my_var) try: with tf.device(&amp;quot;/device:GPU:0&amp;quot;): v = tf.Variable(tf.zeros([10, 10])) p...

知行_那片天 9337
上一篇: TensorFlow2.0教程(三)-使用keras训练模型
下一篇: TensorFlow2简要教程(五)-keras模型保存和序列化
weekdayh
博客等级 码龄8年 9粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值