Tensorflow加载Vgg预训练模型

Tensorflow如何直接使用预训练模型(vgg16为例) Tensorflow如何直接使用预训练模型(vgg16为例) 本文链接: 主流的CNN模型基本都会使用VGG16或者ResNet等网络作为预训练模型,正好有个朋友和我说发给他一个VGG16的预训练模型和代码,我就整理了一下。在这里也分享一下,方便大家直接使用。 系统环境 Tensorflow-gpu 1.12.0 Python 3.5.2 资料来源 官方slim说明 https://gith... 阅读详情

    很多深度神经网络模型需要加载预训练过的Vgg参数,比如说:风格迁移、目标检测、图像标注等计算机视觉中常见的任务。那么到底如何加载Vgg模型呢?Vgg文件的参数到底有何意义呢?加载后的模型该如何使用呢?本文将以Vgg19为例子,详细说明Tensorflow如何加载Vgg预训练模型。

实验环境

  • GTX1050-ti,  cuda9.0
  • Window10,  Tensorflow 1.12

 

展示Vgg19构造

import tensorflow as tf

import numpy as np
import scipy.io

data_path = 'model/vgg19.mat'  # data_path指下载下来的Vgg19预训练模型的文件地址

# 读取Vgg19文件
data = scipy.io.loadmat(data_path)
# 打印Vgg19的数据类型及其组成
print("type: ", type(data))
print("data.keys: ", data.keys())

# 得到对应卷积核的矩阵
weights = data['layers'][0]
# 定义Vgg19的组成
layers = (
    'conv1_1', 'relu1_1', 'conv1_2', 'relu1_2', 'pool1',

    'conv2_1', 'relu2_1', 'conv2_2', 'relu2_2', 'pool2',

    'conv3_1', 'relu3_1', 'conv3_2', 'relu3_2', 'conv3_3',
    'relu3_3', 'conv3_4', 'relu3_4', 'pool3',

    'conv4_1', 'relu4_1', 'conv4_2', 'relu4_2', 'conv4_3',
    'relu4_3', 'conv4_4', 'relu4_4', 'pool4',

    'conv5_1', 'relu5_1', 'conv5_2', 'relu5_2', 'conv5_3',
    'relu5_3', 'conv5_4', 'relu5_4'
)

# 打印Vgg19不同卷积层所对应的维度
for i, name in enumerate(layers):
    kind = name[:4]
    if kind == 'conv':
        print("%s: %s" % (name, weights[i][0][0][2][0][0].shape))
    elif kind == 'relu':
        print(name)
    elif kind == 'pool':
        print(name)


代码输出结果如下:
type:  <class 'dict'>
data.keys:  dict_keys(['__header__', '__version__', '__globals__', 'layers', 'meta'])

conv1_1: (3, 3, 3, 64)
relu1_1
conv1_2: (3, 3, 64, 64)
relu1_2
pool1
conv2_1: (3, 3, 64, 128)
relu2_1
conv2_2: (3, 3, 128, 128)
relu2_2
pool2
conv3_1: (3, 3, 128, 256)
relu3_1
conv3_2: (3, 3, 256, 256)
relu3_2
conv3_3: (3, 3, 256, 256)
relu3_3
conv3_4: (3, 3, 256, 256)
relu3_4
pool3
conv4_1: (3, 3, 256, 512)
relu4_1
conv4_2: (3, 3, 512, 512)
relu4_2
conv4_3: (3, 3, 512, 512)
relu4_3
conv4_4: (3, 3, 512, 512)
relu4_4
pool4
conv5_1: (3, 3, 512, 512)
relu5_1
conv5_2: (3, 3, 512, 512)
relu5_2
conv5_3: (3, 3, 512, 512)
relu5_3
conv5_4: (3, 3, 512, 512)
relu5_4

    那么Vgg19真实的网络结构是怎么样子的呢,如下图所示:

Vgg19结构图
Vgg19 结构图

    在本文,主要讨论卷积模块,大家通过对比可以发现,我们打印出来的Vgg19结构及其卷积核的构造的确如论文中给出的Vgg19结构一致。

 

构建Vgg19模型

def _conv_layer(input, weights, bias):
    conv = tf.nn.conv2d(input, tf.constant(weights), strides=(1, 1, 1, 1),
            padding='SAME')
    return tf.nn.bias_add(conv, bias)

def _pool_layer(input):
    return tf.nn.max_pool(input, ksize=(1, 2, 2, 1), strides=(1, 2, 2, 1),
            padding='SAME')

class VGG19:
    layers = (
        'conv1_1', 'relu1_1', 'conv1_2', 'relu1_2', 'pool1',

        'conv2_1', 'relu2_1', 'conv2_2', 'relu2_2', 'pool2',

        'conv3_1', 'relu3_1', 'conv3_2', 'relu3_2', 'conv3_3',
        'relu3_3', 'conv3_4', 'relu3_4', 'pool3',

        'conv4_1', 'relu4_1', 'conv4_2', 'relu4_2', 'conv4_3',
        'relu4_3', 'conv4_4', 'relu4_4', 'pool4',

        'conv5_1', 'relu5_1', 'conv5_2', 'relu5_2', 'conv5_3',
        'relu5_3', 'conv5_4', 'relu5_4'
    )

    def __init__(self, data_path):
        data = scipy.io.loadmat(data_path)

        self.weights = data['layers'][0]

    def feed_forward(self, input_image, scope=None):
        # 定义net用来保存模型每一步输出的特征图
        net = {}
        current = input_image

        with tf.variable_scope(scope):
            for i, name in enumerate(self.layers):
                kind = name[:4]
                if kind == 'conv':
                    kernels = self.weights[i][0][0][2][0][0]
                    bias = self.weights[i][0][0][2][0][1]

                    kernels = np.transpose(kernels, (1, 0, 2, 3))
                    bias = bias.reshape(-1)

                    current = _conv_layer(current, kernels, bias)
                elif kind == 'relu':
                    current = tf.nn.relu(current)
                elif kind == 'pool':
                    current = _pool_layer(current)
                # 在每一步都保存当前输出的特征图
                net[name] = current

        return net

    在上面的代码中,我们定义了一个Vgg19的类别专门用来加载Vgg19模型,并且将每一层卷积得到的特征图保存到net中,最后返回这个net,用于代码后续的处理。

 

测试Vgg19模型

    在给出Vgg19的构造模型后,我们下一步就是如何用它,我们的思路如下:

  • 加载本地图片
  • 定义Vgg19模型,传入本地图片
  • 得到返回每一层的特征图
image_path = "data/test.jpg" # 本地的测试图片

image_raw = tf.gfile.GFile(image_path, 'rb').read()
# 一定要tf.float(),否则会报错
image_decoded = tf.to_float(tf.image.decode_jpeg(image_raw))

# 扩展图片的维度,从三维变成四维,符合Vgg19的输入接口
image_expand_dim = tf.expand_dims(image_decoded, 0)

# 定义Vgg19模型
vgg19 = VGG19(data_path)
net = vgg19.feed_forward(image_expand_dim, 'vgg19')
print(net)

代码结果如下所示:
{'conv1_1': <tf.Tensor 'vgg19_1/BiasAdd:0' shape=(1, ?, ?, 64) dtype=float32>,
 'relu1_1': <tf.Tensor 'vgg19_1/Relu:0' shape=(1, ?, ?, 64) dtype=float32>,
 'conv1_2': <tf.Tensor 'vgg19_1/BiasAdd_1:0' shape=(1, ?, ?, 64) dtype=float32>,
 'relu1_2': <tf.Tensor 'vgg19_1/Relu_1:0' shape=(1, ?, ?, 64) dtype=float32>,
 'pool1': <tf.Tensor 'vgg19_1/MaxPool:0' shape=(1, ?, ?, 64) dtype=float32>,
 'conv2_1': <tf.Tensor 'vgg19_1/BiasAdd_2:0' shape=(1, ?, ?, 128) dtype=float32>,
 'relu2_1': <tf.Tensor 'vgg19_1/Relu_2:0' shape=(1, ?, ?, 128) dtype=float32>,
 'conv2_2': <tf.Tensor 'vgg19_1/BiasAdd_3:0' shape=(1, ?, ?, 128) dtype=float32>,
 'relu2_2': <tf.Tensor 'vgg19_1/Relu_3:0' shape=(1, ?, ?, 128) dtype=float32>,
 'pool2': <tf.Tensor 'vgg19_1/MaxPool_1:0' shape=(1, ?, ?, 128) dtype=float32>,
 'conv3_1': <tf.Tensor 'vgg19_1/BiasAdd_4:0' shape=(1, ?, ?, 256) dtype=float32>,
 'relu3_1': <tf.Tensor 'vgg19_1/Relu_4:0' shape=(1, ?, ?, 256) dtype=float32>,
 'conv3_2': <tf.Tensor 'vgg19_1/BiasAdd_5:0' shape=(1, ?, ?, 256) dtype=float32>,
 'relu3_2': <tf.Tensor 'vgg19_1/Relu_5:0' shape=(1, ?, ?, 256) dtype=float32>,
 'conv3_3': <tf.Tensor 'vgg19_1/BiasAdd_6:0' shape=(1, ?, ?, 256) dtype=float32>,
 'relu3_3': <tf.Tensor 'vgg19_1/Relu_6:0' shape=(1, ?, ?, 256) dtype=float32>,
 'conv3_4': <tf.Tensor 'vgg19_1/BiasAdd_7:0' shape=(1, ?, ?, 256) dtype=float32>,
 'relu3_4': <tf.Tensor 'vgg19_1/Relu_7:0' shape=(1, ?, ?, 256) dtype=float32>,
 'pool3': <tf.Tensor 'vgg19_1/MaxPool_2:0' shape=(1, ?, ?, 256) dtype=float32>,
 'conv4_1': <tf.Tensor 'vgg19_1/BiasAdd_8:0' shape=(1, ?, ?, 512) dtype=float32>,
 'relu4_1': <tf.Tensor 'vgg19_1/Relu_8:0' shape=(1, ?, ?, 512) dtype=float32>,
 'conv4_2': <tf.Tensor 'vgg19_1/BiasAdd_9:0' shape=(1, ?, ?, 512) dtype=float32>,
 'relu4_2': <tf.Tensor 'vgg19_1/Relu_9:0' shape=(1, ?, ?, 512) dtype=float32>,
 'conv4_3': <tf.Tensor 'vgg19_1/BiasAdd_10:0' shape=(1, ?, ?, 512) dtype=float32>,
 'relu4_3': <tf.Tensor 'vgg19_1/Relu_10:0' shape=(1, ?, ?, 512) dtype=float32>,
 'conv4_4': <tf.Tensor 'vgg19_1/BiasAdd_11:0' shape=(1, ?, ?, 512) dtype=float32>,
 'relu4_4': <tf.Tensor 'vgg19_1/Relu_11:0' shape=(1, ?, ?, 512) dtype=float32>,
 'pool4': <tf.Tensor 'vgg19_1/MaxPool_3:0' shape=(1, ?, ?, 512) dtype=float32>,
 'conv5_1': <tf.Tensor 'vgg19_1/BiasAdd_12:0' shape=(1, ?, ?, 512) dtype=float32>,
 'relu5_1': <tf.Tensor 'vgg19_1/Relu_12:0' shape=(1, ?, ?, 512) dtype=float32>,
 'conv5_2': <tf.Tensor 'vgg19_1/BiasAdd_13:0' shape=(1, ?, ?, 512) dtype=float32>,
 'relu5_2': <tf.Tensor 'vgg19_1/Relu_13:0' shape=(1, ?, ?, 512) dtype=float32>,
 'conv5_3': <tf.Tensor 'vgg19_1/BiasAdd_14:0' shape=(1, ?, ?, 512) dtype=float32>,
 'relu5_3': <tf.Tensor 'vgg19_1/Relu_14:0' shape=(1, ?, ?, 512) dtype=float32>,
 'conv5_4': <tf.Tensor 'vgg19_1/BiasAdd_15:0' shape=(1, ?, ?, 512) dtype=float32>,
 'relu5_4': <tf.Tensor 'vgg19_1/Relu_15:0' shape=(1, ?, ?, 512) dtype=float32>}

    本文提供的测试代码是完成正确的,已经避免了很多使用Vgg19预训练模型的坑操作,比如:给图片添加维度,转换读取图片的的格式等,为什么这么做的详细原因可参考我的另一篇博客:Tensorflow加载Vgg预训练模型的几个注意事项。

    到这里,如何使用tensorflow读取Vgg19模型结束了,若是大家有其他疑惑,可在评论区留言,会定时回答。

 

备注:本文为作者原创,转载需注明出处!

使用VGG16.npy文件载入权重 VGG16.npy文件的用法VGG16网络权重直接载入VGG16.npy加载方式预先把网络结构设置好载入VGG16.npy权重文件了解VGG16.npy内部存储模型权重层的名称按层数逐层给模型权重层载入权重系数存储VGG16模型和权重 VGG权重(npy格式)百度网盘链接: link 提取码:8487 VGG16网络权重直接载入 因为tensorflow包在安装时就已经自带了VGG16、AlexN... 阅读详情

相关推荐

【深度学习】tensorflow加载VGG16的网络结构和模型参数

文件介绍synset.txt:标签列表 vgg16-20160129.tfmodel:pre-trained vgg16的网络结构和结点参数定义输入placeholderimages = tf.placeholder("float", [None, 224, 224, 3])加载模型with open("model/vgg16-20160129.tfmodel", mode='rb') as f:

zzmmjj的博客 5283

预训练模型-VGG16模型的构建,批量图片预测、类激活图以及ROC曲线结果

正如之前的文章《卷积神经网络构建,新图片的预测与类激活图——提高CNN模型的可解释性》所说,当图片数据量十分有限时,分类模型CNN的分类性能受到了严重的限制。因此本文中引入了常用的一种方法——使用预训练模型。预训练模型简单来说就是已经在大型数据集上训练好的模型。可能会有人提出疑问,已经训练好的模型可以应用到新的图片分类问题中吗?这就得说说使用预训练模型的基本原理,人们默认当原始图片数据集足够大且通用时,预训练模型从中学到的特征的空间层次结构可以有效地作为视觉世界的通用模版。

zxm214csdn的博客 3786

TensorFlow VGG-16 预训练模型-vgg_16.ckpt

TensorFlow VGG-16 预训练模型,用于SSD-TensorFlow的Demo训练.

Tensorflow---使用Tensorflow进行VGG模型的迁移学习和自定义训练

一、代码中所需的数据集可以通过以下链接进行下载 百度网盘提取码:lala 二、代码运行环境 Tensorflow-gpu==2.4.0 Python==3.7 三、数据的读取处理代码如下: import tensorflow as tf import os import glob import random import matplotlib.pyplot as plt # 环境变量的配置 os.environ['TF_XLA_FLAGS'] = '--tf_xla_enable_xla_devices'

qq_44961869的博客 1881

VGG16预训练模型part1

VGG16预训练模型 "vgg_url": "ftp://mi.eng.cam.ac.uk/pub/mttt2/models/vgg16.npy"

Tensorflow加载Vgg预训练模型操作

主要介绍了Tensorflow加载Vgg预训练模型操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

深度学习与TensorFlow实战(十)卷积神经网络—VGG(16)神经网络

架构: 训练输入:固定尺寸224x224的RGB图像。 预处理:每个像素减去训练集上的RGB均值。 卷积核:一系列3X3卷积核堆叠,步长为1,采用padding保持卷积后图像空间分辨率不变。 空间池化:紧随卷积堆的最大池化,为2x2滑动窗口,步长2. 全连接层:特征提取后,接三个全连接层,前两个为4096,第三个为1000通道,最后是一个softmax层,输出概率。 所有隐藏层都用非线...

法兰西流浪者博客 1万+

手把手教你解决uniapp中esbuild版本冲突问题(Mac版专属指南)

本文是针对Mac平台uniapp开发者的专属指南,详细解析了运行项目时常见的`Cannot start service`错误,即esbuild的Host版本与binary版本不匹配问题。文章从错误根源入手,提供了从快速应急处理到彻底根治的完整解决方案,包括手动替换二进制文件、锁定依赖版本、清理缓存及优化工具链配置,旨在帮助开发者高效解决版本冲突,恢复并稳定开发环境。

i0j1k2l3m的博客 458

tensorflow(八)tensorflow加载VGG19模型数据并可视化每一层的输出

一、简介 VGG网络在2014年的 ILSVRC localization and classification 两个问题上分别取得了第一名和第二名。VGG网络非常深,通常有16-19层,如果自己训练网络模型的话很浪费时间和计算资源。因此这里采用一种方法获取VGG19模型的模型数据,从而能够更快速的应用到自己的任务中来, 本文在加载模型数据的同时,还可视化图片在网络传播过程中,每一层的输出特征...

Missaya的博客 1万+

ADS实战指南:负载牵引(Loadpull)在射频功放设计中的关键应用

本文深入解析了负载牵引(Loadpull)技术在射频功率放大器设计中的核心作用与实战方法。通过生动的比喻和详细的ADS软件操作指南,阐述了如何通过系统扫描负载阻抗,在史密斯圆图上绘制等功率线与等效率线,从而精准找到最优阻抗点,以平衡输出功率与效率,是应对5G等现代通信系统严苛要求的必备技能。

weixin_29198045的博客 601

【超详细】磁力计数据读取--以IST8310为例

第一章讲了IST8310的特性,I2C通信,最高支持400kHz通信速率,14位或者16位自适应数据输出等特性第二章讲了内部结构第三章讲了电气特性第四章讲了如何联系他们然后数据手册就没了。。。在大疆的开发手册中找到了寄存器的手册,如下:点开I2C配置选项, 下图是配好的:观察IST8310的数据手册,发现其支持最大400kHz的I2C通信速率,也就是快速I2C模式,所以第一行I2C Speed Mode我们选Fast Mode同时不要忘记了在C板中I2C3的两个IO口分别是PA8和PC9(一般来说都是这两个

lmh_12138的博客 1万+

利用tensorflow加载VGG19

利用tensorflow加载VGG19前言一、源码总结 前言 目前在生成网络领域,对于图片内容的损失约束基本已经不再使用常规的l1,l2正则化,而是转用VGG提出高维特征,对图片内容进行约束,这里我是使用别人在github提供论文中的源码。 一、源码 ''' CVPR 2020 submission, Paper ID 6791 Source code for 'Learning to Cartoonize Using White-Box Cartoon Representations' ''' i.

qq_40395084的博客 1106

别再手动测接口了!用Pytest+Requests+Allure搭建你的第一个自动化框架(附完整源码)

本文详细介绍了如何使用Pytest+Requests+Allure搭建Python接口自动化测试框架,涵盖环境准备、核心组件封装、测试用例设计、报告生成及CI/CD集成等关键步骤。通过实战案例和完整源码,帮助开发者快速构建高效的接口自动化测试解决方案,提升测试效率和质量。

weixin_42546508的博客 320

python怎么使用预训练的模型_Tensorflow加载Vgg预训练模型操作

很多深度神经网络模型需要加载预训练过的Vgg参数,比如说:风格迁移、目标检测、图像标注等计算机视觉中常见的任务。那么到底如何加载Vgg模型呢?Vgg文件的参数到底有何意义呢?加载后的模型该如何使用呢?本文将以Vgg19为例子,详细说明Tensorflow如何加载Vgg预训练模型。实验环境GTX1050-ti, cuda9.0Window10, Tensorflow 1.12展示Vgg19构造imp...

weixin_39883670的博客 472

STM32硬件SPI驱动ADS1255/1256避坑指南:从Cube MX配置到稳定采样实战

本文详细解析了使用STM32硬件SPI驱动高精度ADC芯片ADS1255/1256的完整流程与关键陷阱。重点阐述了Cube MX中SPI模式(必须为CPOL=1, CPHA=1)、数据帧格式(MSB First)及波特率(建议从256kHz起)的正确配置,并提供了分步读写时序的代码实现与逻辑分析仪调试方法,帮助开发者避开常见坑点,实现稳定可靠的高精度数据采样。

weixin_29193259的博客 359

一文搞定 GitHub SSH Key:生成、配置、好处全攻略

本文详细介绍了如何配置GitHub SSH Key,实现免密安全认证。主要内容包括:SSH协议的四大优势(免密登录、安全性高、稳定省心、支持自动化);Git身份配置步骤;检查本地SSH Key;生成RSA密钥对;添加密钥到SSH代理;复制公钥到GitHub;测试连接。配置完成后,开发者可通过SSH地址克隆仓库,实现push/pull全程免密操作。该方案显著提升Git使用效率,同时保障安全性,是开发者必备技能。

qq_62904883的博客 958

Tensorflow加载Vgg预训练模型的几个注意事项

写这个博客的关键Bug:Value passed to parameter 'input' has DataType uint8 not in list of allowed values: float16, bfloat16, float32, float64。本博客将围绕 加载图片 和 保存图片到本地 来详细解释和解决上述的Bug及其引出来的一系列Bug。 加载图片 ...

GodWriter的博客 3545

告别Windows!Oculus Quest 2在Mac M1上的串流实战(scrcpy+SideQuest避坑指南)

本文为Mac M1用户提供了Oculus Quest 2在macOS上实现高清低延迟串流的实战指南。通过使用开源工具scrcpy和SideQuest,绕开官方限制,详细讲解了从环境准备、无线调试到画质与延迟优化的完整步骤,重点解决了Apple Silicon芯片Mac的连接与性能问题,助你告别Windows依赖。

weixin_29224309的博客 308

TensorFLow 加载VGG19 模型并进行预测

import tensorflow as tf import scipy.io import numpy as np import cv2 #download from here http://www.vlfeat.org/matconvnet/models/beta16/imagenet-vgg-verydeep-19.mat DEFAULT_PATH="./imagenet-vgg-very...

清闲老窝的专栏 4409

[AI] 企业内网部署大模型的三种常见方案:从“能用”到“好用”的技术选型指南

企业内网部署大模型的三种方案解析:本地模型安全但门槛高,平台方案(如Dify)最平衡推荐,混合架构适合进阶需求。关键路径是渐进式演进,从快速验证到平台化建设,核心在于流程优化而非单纯选模型。数据安全、成本可控和工程落地能力是决策重点。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 770

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

利用vgg预训练模型提取图像特征

VGG卷积神经网络是牛津大学在2014年提出来的模型。当这个模型被提出时,由于它的简洁性和实用性,马上成为了当时最流行的卷积神经网络模型。它在图像分类和目标检测任务中都表现出非常好的结果。在2014年的ILSVRC比赛中,VGG 在Top-5中取得了92.3%的正确率。有VGG16和VGG19,模型的权重由ImageNet训练而来 1、VGG结构 下面以VGG16为例来说明: 看出VGG16由...

开开_王子的博客 4万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

tensorflow预训练权重导入

tensorflow预训练权重导入 1. 代码 def load(data_path, session): """ load the VGG16_pretrain parameters file :param data_path: :param session: :return: """ data_dict = np.load(data_pa...

言论的花 1666

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

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

IDEA的使用指南

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

TensorFlow VGG-16 预训练模型

在我们的实际项目中,一般不会直接从第一层直接开始训练,而是通过在大的数据集上(如ImageNet)训练好的模型,把前面那些层的参数固定,在运用到我们新的问题上,修改最后一到两层,用自己的数据去微调(finetuning),一般效果也很好。 所谓finetuning,就是说我们针对某相似任务已经训练好的模型,比如CaffeNet, VGG-16, ResNet等, 再通过自己的数据集进行权重更新,

daydayup_668819的博客 5万+

如何快速加载VGG-19预训练模型:神经风格转换的终极指南

想要打造惊艳的艺术风格转换效果吗?神经风格转换项目让你能够将梵高的《星夜》风格应用到任何照片上!🎨 这个基于TensorFlow的开源工具使用VGG-19预训练模型作为核心引擎,今天我将为你揭秘这个强大模型的加载机制。 ## VGG-19模型的重要性与获取方法 VGG-19是神经风格转换的核心组件,这个深度卷积神经网络在ImageNet数据集上进行了预训练,能够提取图像的高级特征。项目默认使

gitblog_00629的博客 417
上一篇: Tensorflow 疑惑解答
下一篇: Tensorflow加载Vgg预训练模型的几个注意事项
GodWriter
博客等级 码龄11年 94粉丝 41原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值