读取和修改caffemodel文件

caffe模型训练与使用(windows平台) 本文训练模型是在 windows 系统上完成的,在训练模型之前,需要在自己的设备上编译好 caffe 。windows 下编译 caffe 的教程:https://blog.youkuaiyun.com/apple_54470279/article/details/124993901程序已打包,下载地址:百度网盘下载为了方便访问文件,建议先建一个文件夹,用来存放本次训练过程中的所有文件。比如,我在桌面上新建了一个名为 的文件夹,因此在本文中,我的所有文件都是在这个文件夹中进行编写的。我在训练的过程中参考了很多文章,也 阅读详情

使用caffe框架训练后得到的权重通过Google Protobuf来存储为.caffemodel的二进制文件,为了更好地更改网络结构和对已有的caffemodel进行finetune,通常我们需要修改一些参数,去为了更好的适应我们自己设计的网络结构并进行训练
好在caffe的Python接口提供了针对caffemodel文件的修改方法
为了更好地可视化,这里使用了Python的jupyter notebook工具
1、读取caffemodel里的权值

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

caffe_root = 'F:/caffe_BLVC_VS2013/caffe-windows/'  # 设置caffe的根目录
import sys
sys.path.insert(0, caffe_root + 'python')

import caffe  #导入caffe
caffe.set_mode_gpu()  #设置为gpu模式
# 载入网络,列出各个层的名字
net = caffe.Net('F:/python/make_prototxt/mnist/deploy.prototxt', caffe.TEST)
print("blobs {}\nparams {}".format(net.blobs.keys(), net.params.keys()))

输出如下:

blobs [‘data’, ‘conv1’, ‘pool1’, ‘conv2’, ‘pool2’, ‘fc1’, ‘ADD’, ‘ADD2’, ‘fc2’, ‘prob’]
params [‘conv1’, ‘conv2’, ‘fc1’, ‘ADD’, ‘ADD2’, ‘fc2’]

将全连接层的维度打印出来

# Load the original network and extract the fully connected layers' parameters.
net = caffe.Net('F:/python/make_prototxt/mnist/deploy.prototxt', 
                'F:/python/make_prototxt/mnist/model/mnist_iter_9380.caffemodel', 
                caffe.TEST)
params = ['fc1','ADD','ADD2','fc2']
# fc_params = {name: (weights, biases)}
fc_params = {pr: (net.params[pr][0].data, net.params[pr][1].data) for pr in params}

for fc in params:
    print '{} weights are {} dimensional and biases are {} dimensional'.format(fc, fc_params[fc][0].shape, fc_params[fc][1].shape)

输出如下:

fc1 weights are (500L, 800L) dimensional and biases are (500L,) dimensional
ADD weights are (500L, 500L) dimensional and biases are (500L,) dimensional
ADD2 weights are (500L, 500L) dimensional and biases are (500L,) dimensional
fc2 weights are (10L, 500L) dimensional and biases are (10L,) dimensional

2、将网络中的参数保存为新的model

net.save('F:/python/make_prototxt/mnist/get.caffemodel')
# Load the original network and extract the fully connected layers' parameters.
net = caffe.Net('F:/python/make_prototxt/mnist/deploy.prototxt', 
                'F:/python/make_prototxt/mnist/get.caffemodel', 
                caffe.TEST)
params = ['fc1','ADD','ADD2','fc2']
# fc_params = {name: (weights, biases)}
fc_params = {pr: (net.params[pr][0].data, net.params[pr][1].data) for pr in params}

for fc in params:
    print '{} weights are {} dimensional and biases are {} dimensional'.format(fc, fc_params[fc][0].shape, fc_params[fc][1].shape)

输出如下:

fc1 weights are (500L, 800L) dimensional and biases are (500L,) dimensional
ADD weights are (500L, 500L) dimensional and biases are (500L,) dimensional
ADD2 weights are (500L, 500L) dimensional and biases are (500L,) dimensional
fc2 weights are (10L, 500L) dimensional and biases are (10L,) dimensional

这种方法只能在原有的结构上进行权值的修改,而不能对原有结构进行修改

加载caffemodel做图像分类(windows+vs2013) 要根据已有caffemodel等文件进行图像分类,需要阅读classification.cpp文件,然后在此cpp文件基础上修改相应代码即可。打开E:\study_materials\Caffe\caffe-master\caffe-master\windows根目录下的Caffe.sln,然后找到如图所示的cpp文件解读此cpp文件,可参考网址:http://m.blog.youkuaiyun.com/wa... 阅读详情

相关推荐

googlenet_finetune_web_car_iter_10000.caffemodel对应的映射文件

是matlab文件,可用matlab打开,然后复制到txt中,下载该文件代表你遵循该文件的官方许可协议,禁止商业使用,否则,后果自负

caffe之保存和读入caffmodel文件

一、caffe如何将卷积层或网络层的权值blob给保存下来的? 首先Solver类在Step(intiters)中调用了Snapshot()函数,在voidSolver<Dtype>::Snapshot()函数中能看到保存caffemodel文件的重要函数 SnapshotToBinaryProto(),该函数详细如下:可看到该函数里初始化了NetParameternet_param...

AP1005834的博客 6626

STM32驱动WS2812B实现音乐频谱可视化系统

本文详细介绍了基于STM32驱动WS2812B灯带实现音乐频谱可视化系统的设计与实现。通过FFT算法实时分析音频信号,将频谱映射到炫彩灯光控制系统,结合PWM和DMA技术实现低延迟响应。系统支持多模式切换和动态亮度调节,适用于创意灯光秀和智能家居场景。

weixin_29171129的博客 301

将图像数据jpg,png等存储为npy/npz格式

前言 将目录./Data/RSD19的19种图像数据的图像,按种类存储为npy/npz格式。RSD19的子目录为,每一个子目录下都有相应种类的图像。 思路 首先遍历根目录下所有子目录和其中的文件,将内容与label一起保存在numpy中。 打乱顺序。 输出四个npy/npz文件。 于是可以写成下面两个函数。 首先是一个辅助的函数, 用来返回label的。例如文件夹内容为Airport, Beach, 最后可以范围对应关系, {‘Airport’: 0, ‘Beach’: 1}。 接下来就

qq_38410428的博客 1万+

【ubuntu】如何搭建AFTR+B4环境

为何要使用ipv6 目前ipv4地址已经不够用了,而IPv6采用128位地址长度,几乎可以不受限制地提供地址。而且ipv6具有更高的安全性。 主流的ipv6方案 1.双栈方案 :所有设备同时支持IPv4/IPv6协议栈,核心理念在于其传送网同时支持IPv4和IPv6 2.DS-Lite方案 :IPv4‐in‐IPv6 隧道和 NAT 这两个基本技术,同时支持IPV4与IPV6,对于ipv4用户,可以通过ipv6隧道与ipv4业务平台实现通信;针对ipv6用户,可直接通过ipv6网络通信。 3.6RD方案 :

weixin_43863426的博客 2722

MiFlash Prime免授权刷机实战:解锁小米9008 EDL救砖新方案

MiFlash Prime作为免授权刷机工具,有效解决了小米设备在9008 EDL模式下因账号验证无法救砖的难题。本文详细介绍了从驱动安装、进入EDL模式到固件刷写的完整流程,帮助用户安全快速地恢复变砖设备,是维修人员和极客的实用解决方案。

5f4d3s2a1q的博客 2859

解析caffe生成的caffemodel文件

解析caffe生成的caffemodel文件

半度微凉的博客 1135

为什么桥式传感器(Bridge Sensor)需要用到仪表放大器?

仪表放大器在桥式传感器的应用里起到关键作用,本文介绍桥式传感器的原理、特性,以及信号调理过程,并附上了一个 TINA - TI 的仿真电路。

疯狂的运放 1527

python读取caffemodel文件

caffemodel是二进制的protobuf文件,利用protobuf的python接口可以读取它,解析出需要的内容 不少算法都是用预训练模型在自己数据上微调,即加载“caffemodel”作为网络初始参数取值,然后在此基础上更新。使用方式往往是:同时给定solver的prototxt文件,以及caffemodel权值文件,然后从solver创建网络,并从caffemodel读取网络权值的初值。...

weixin_34203426的博客 618

人形机器人五大核心零部件技术解析与国产化实况

人形机器人并非简单机械集成,而是物理、能量、感知、决策与执行五层系统毫秒级协同的复杂体。其性能瓶颈往往不在于整机算法,而深植于谐波减速器的刚度稳定性、无框力矩电机的功率密度与温升控制、六维力传感器的动态响应与温漂抑制、运动控制器的实时OS生态及灵巧手的多指协同精度等底层硬件能力。这些部件共同构成整机68.3%的成本,且国产化率差异显著——谐波减速器达72%,而高精度力矩传感器仍受制于日德厂商。本文聚焦‘谐波减速器’和‘六维力传感器’两大热词,从材料工艺、参数定义、失效模式到产线验证,揭示真正卡脖子的技术关卡

weixin_29065959的博客 406

stc8g1k08硬件iic读取aht20温湿度及0.91寸oled显示

使用stc8g1k08读取aht20温湿度及0.91寸oled显示。

qq_61688416的博客 2770

读取和修改caffemodel文件里的参数

基于caffe 的卷积神经网络模型训练后得到的权值是通过Google Protobuffer来存储的后缀名为.caffemodel的二进制文件,这类文件一般很难直接打开进行权值的读取和修改。有的时候我们希望直观的看到网络中每个神经元的权值,或者希望更改网络的部分结构来得到新的结构进行finetune。在这样的情况下我们就需要对caffemodel文件进行操作。好在caffe的python接口提供了针

撸猫写博客 2万+

MATLAB/Simulink实战:三电平逆变器SVPWM调制从入门到精通(附完整仿真模型)

本文提供了一份详尽的MATLAB/Simulink实战指南,手把手教你从零搭建三电平逆变器的SVPWM调制系统。文章深入剖析了27个空间矢量的分区与分解算法,并完整实现了包含中点电位平衡控制的Simulink仿真模型,旨在帮助电力电子与电机控制领域的学习者和工程师跨越从理论到实践的鸿沟。

sugar的博客 1212

读取修改caffemodel文件里的网络模型参数

[背景] caffe模型文件caffemodel中参数的读取和修改

burning_keyboard的博客 1万+

企业和个人 AI 编程工具怎么选?2025 年 12 款主流工具(Claude/Cursor 等)核心能力 + 收费对比

2025 年最火的 12 款 AI 编程工具,像 Claude、Cursor 这些热门款,我把它们的核心能力、收费标准全扒得明明白白,看完这篇你不用再瞎琢磨,直接就能挑到对的!再说说 Cursor,美国 Cursor Labs 做的,还拿过红杉资本投资,2022 年推出后,2024 年收入直接涨了 6400%,势头很猛。总之,不管你是企业技术管理者、程序员,还是刚入门的 AI 小白,按自己的需求(语言、合规、预算)挑,保准能找到最适合的 AI 编程工具!最后给大家划重点,不同需求直接对号入座:?

hundred98的博客 2800

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

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

读取和修改caffemodel中权值

使用caffe框架训练后得到的权重通过Google Protobuf来存储为.caffemodel的二进制文件,为了更好地更改网络结构和对已有的caffemodel进行finetune,通常我们需要修改一些参数,去为了更好的适应我们自己设计的网络结构并进行训练 好在caffe的Python接口提供了针对caffemodel文件的修改方法 为了更好地可视化,这里使用了Python的jupyter...

xunan003的博客 2371

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

caffe:生成、修改prototxt及caffemodel解析完整版

1.读取prototxt from caffe.proto import caffe_pb2 from google.protobuf import text_format net = caffe_pb2.NetParameter() solver = caffe_pb2.SolverParameter() f1=open('deploy.prototxt') f2=open('solver.pr...

车牌识别 5684

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Statistics and Machine Learning Toolbox

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

caffemodel修改 layer name,修改参数层

修改layer name import caffe import numpy as np caffe.set_mode_cpu() net = caffe.Net('myprototxt.prototxt', 'mycaffemodel.caffemodel', caffe.TEST) netNew = caffe.Net('myprototxt2.prototxt', 'mycaffemodel2.caffemodel', caffe.TEST) for k, v in ne...

DRACOYU的博客 1394

增删查改_caffemodel的增删查改

本文脚本使用python先说一下如何读取caffemodel,caffemodel包含两个文件,一个是prototxt网络描述文件,存储了网络图,一个是caffemodel权重文件,存储了模型权重的相关参数和具体信息,读取caffemodel使用caffe包提供的接口import caffe import cv2 deploy = './deploy.prototxt' model = 'mo...

weixin_34122028的博客 172

caffe运行错误 target_blobs.blobs_size()与 source_layer.blobs_size() 不一致

解决方法参考:http://blog.youkuaiyun.com/zhangla1220/article/details/50697352 感谢博主!!! 最新下载的caffe代码,运行mnist,训练时可以正常执行完毕,但是一到测试就出现错误。 运行其他网络时,测试即使可以正常执行完毕,但结果是错的,出现结果概率相同的状况,推测caffemodel的数据没有load进去。 最终修改...

dedr13879的博客 213

【Caffe】caffe框架讲解,解析修改caffemodel与prototxt

背景 pytorch转onnx后,onnx转tensorRT 各种问题。主要是TX2安装的tensorRT版本较低,也没有去刷机升级的想法。 尝试了 onnx-tensorRT 以及torch2trt 项目,完全没心思搞了。 还是按照标准流程 转caffe 然后部署到tensorRT ,TX2也有官方支持的caffe的脚本。 参考 1、Pytorch模型转Caffe模型小记 https://zhuanlan.zhihu.com/p/352750171 得到了pytorch2caffe工具: github.c

AbiUni(YY熊) 6658

caffemodel的读取和修改

1.http://www.cnblogs.com/denny402/p/5686257.html 2.http://blog.youkuaiyun.com/jiongjiongxia123/article/details/60965743 3.http://blog.youkuaiyun.com/burning_keyboard/article/details/71763291 4.http://nbviewer.jup...

zhe_csdn的博客 1691

Caffemodel之C++修改参数

对Caffemodel的解析,更直接的说是对protobuf的解析。对Protobuf来说最重要的有三个文件,***.proto,***.pb.h,和***.pb.cc。基本的操作流程是首先写***.proto文件,然后编译出***.pb.h和***.pb.cc两个文件,我们就可以对Protobuf进行读写和修改了。 今天这里,我只想总结一下我在修改Caffemodel时遇到的一些坑,以及解

Sunshine_in_Moon的专栏 1669

caffemodel的读取与修改

1.http://www.cnblogs.com/denny402/p/5686257.html

yunyi4367的博客 2029

DL学习笔记【23】修改caffemodel模型参数

读取修改caffemodel文件里的网络模型参数 http://blog.youkuaiyun.com/burning_keyboard/article/details/71763291 修改caffemodel文件中的模型参数,代码 http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/net_surger

Sun7_She的专栏 2148
上一篇: caffe的finetuning是如何更新网络参数的
下一篇: Caffe学习1 :ProtoBuffer
Run_it_faraway
博客等级 码龄10年 19粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值