【MatConvnet速成】MatConvnet图像分类从模型自定义到测试

基于deep learning的图像分类问题 对于小规模的数字图像处理问题已有的大量机器学习算法可以较好地实现,但如果直接应用于大规模海量图像的处理,则会由于复杂度过高而难以在实际系统中实现,因此需要出现更为高效的图像分类算法来解决:采用一些新的特征降低训练时间;多种技术降低overfitting;基于深度卷积神经网络。通过深度卷积神经网络实现图像分类取得了很好的效果,参考文献ImageNet Classification with De 阅读详情

欢迎来到专栏《2小时玩转开源框架系列》,这是我们第10篇,前面已经说过了caffe,tensorflow,pytorch,mxnet,keras,paddlepaddle,cntk,chainer,deeplearning4j。

今天说MatConvnet,本文所用到的数据,代码请参考我们官方git

https://github.com/longpeng2008/LongPeng_ML_Course

作者&编辑 | 言有三

 

1 MatConvnet是什么

不同于各类深度学习框架广泛使用的语言Python,MatConvnet是用matlab作为接口语言的开源深度学习库,底层语言是cuda。

官网地址为:http://www.vlfeat.org/matconvnet/

github地址为:https://github.com/vlfeat/matconvnet

因为是在matlab下面,所以debug的过程非常的方便,而且本身就有很多的研究者一直都使用matlab语言,所以其实该语言的群体非常大。

在用python之前,我也是用matlab的,那个经典的deep-learning-toolbox的代码其实也非常值得研读,说起来,matlab还是非常做图像处理的。

 

2 MatConvnet训练准备

2.1 安装

以linux系统为例,首先要安装好matlab,这个大家自己搞定吧。然后,在matlab环境下进行安装,几行代码就可以。

mex -setup ##设置好编译器

untar('http://www.vlfeat.org/matconvnet/download/matconvnet-1.0-beta25.tar.gz') ;

cd matconvnet-1.0-beta25

run matlab/vl_compilenn ;

没有报错的话就完成了,完成后为了确保没有问题,先用官方的例子确认一下。

%下载预训练模型

urlwrite(...  'http://www.vlfeat.org/matconvnet/models/imagenet-vgg-f.mat', ...  'imagenet-vgg-f.mat')

%设置环境

run matlab/vl_setupnn

%载入模型

net = load('imagenet-vgg-f.mat') ;

net = vl_simplenn_tidy(net)

%读取图像并预处理

im = imread('peppers.png') ;

im_ = single(im) ; % note: 255 range

im_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ;

im_ = im_ - net.meta.normalization.averageImage ;

%得到结果

res = vl_simplenn(net, im_) ;

result.scores = squeeze(gather(res(end).x)) ;

[bestScore, best] = max(scores) ;

figure(1) ; clf ; imagesc(im) ;

title(sprintf('%s (%d), score %.3f',...

  net.meta.classes.description{best}, best, bestScore)) ;

成功的话结果如下:

更复杂的还可以用DagNN wrapper的API,不过这不是本文的主要目标,因此不再讲述。

当然,我们是要用GPU的,所以还要完成GPU编译,按照这里来:

http://www.vlfeat.org/matconvnet/install/

因为版本不一定完全匹配,所以用nvcc编译。

vl_compilenn('enableGpu', true, 'cudaRoot', '/usr/local/cuda','cudaMethod', 'nvcc')

2.2 数据准备

前面讲了官方的例子,接下来就是要用我们自己的例子了,第一步还是老规矩,准备数据,完整的代码如下。

function imdb = mydataset(datadir)

inputSize =[48,48,1];

subdir=dir(datadir);

imdb.images.data=[];

imdb.images.labels=[];

imdb.images.set = [] ;

imdb.meta.sets = {'train', 'val', 'test'} ;

image_counter=0;

trainratio=0.8;

subdir

for i=3:length(subdir)

        imgfiles=dir(fullfile(datadir,subdir(i).name));

        imgpercategory_count=length(imgfiles)-2;

        disp([i-2 imgpercategory_count]);

        image_counter=image_counter+imgpercategory_count;

        for j=3:length(imgfiles)

            img=imread(fullfile(datadir,subdir(i).name,imgfiles(j).name));

            img=imresize(img, inputSize(1:2));

            img=single(img);

%            [~,~,d]=size(img);

%            if d==3

%                img=rgb2gray(img);

%                continue;

%            end

            imdb.images.data(:,:,:,end+1)=single(img);

            imdb.images.labels(end+1)= i-2;

            if j-2<imgpercategory_count*trainratio

                imdb.images.set(end+1)=1;

            else

                imdb.images.set(end+1)=3;

            end

        end

end

dataMean=mean(imdb.images.data,4);

imdb.images.data = single(bsxfun(@minus,imdb.images.data, dataMean)) ;

imdb.images.data_mean = dataMean;

end

如果使用过Matlab的同学,应该一下就看懂了,实际上就是3个步骤:

1)使用fullfile函数遍历图像。

2)预处理,包括缩放,类型转换等。

3)生成IMDB格式数据集。

2.3 网络定义

还是跟以前一样,定义一个3层的卷积神经网络,非常简单,不做过多注释了噢。

function net =simpleconv3()

rng('default');

rng(0) ;

f=1/100 ;

usebatchNormalization = true ;

net.layers = {};

net.layers{end+1} = struct('type', 'conv', ...

                          'weights', {{f*randn(3,3,3,12, 'single'), zeros(1, 12, 'single')}}, ...

                          'stride', 1, ...

                          'pad', 1) ;

net.layers{end+1} = struct('type', 'pool', ...

                          'method', 'max', ...

                          'pool', [2 2], ...

                          'stride', 2, ...

                          'pad', 0) ;

net.layers{end+1} = struct('type', 'relu') ;

net.layers{end+1} = struct('type', 'conv', ...

                          'weights', {{f*randn(3,3,12,24, 'single'),zeros(1,24,'single')}}, ...

                          'stride', 1, ...

                          'pad', 1) ;

net.layers{end+1} = struct('type', 'pool', ...

                          'method', 'max', ...

                          'pool', [2 2], ...

                          'stride', 2, ...

                          'pad', 0) ;

net.layers{end+1} = struct('type', 'relu') ;

net.layers{end+1} = struct('type', 'conv', ...

                          'weights', {{f*randn(3,3,24,48, 'single'),zeros(1,48,'single')}}, ...

                          'stride', 1, ...

                          'pad', 1) ;

net.layers{end+1} = struct('type', 'pool', ...

                          'method', 'max', ...

                          'pool', [2 2], ...

                          'stride', 2, ...

                          'pad', 0) ;

net.layers{end+1} = struct('type', 'relu') ;

net.layers{end+1} = struct('type', 'conv', ...

  'weights', {{f*randn(6,6,48,2, 'single'),zeros(1,2,'single')}}, ...

  'stride', 1, ...

  'pad', 0) ;

net.layers{end+1} = struct('type', 'softmaxloss') ;

net = insertBnorm(net, 1) ;

net = insertBnorm(net, 5) ;

net = insertBnorm(net, 9) ;

% Meta parameters

net.meta.inputSize = [48 48 3] ;

net.meta.trainOpts.learningRate = logspace(-2, -5, 100);

net.meta.trainOpts.numEpochs = 50 ;

net.meta.trainOpts.batchSize = 16 ;

% Fill in defaul values

net = vl_simplenn_tidy(net) ;

end

% --------------------------------------------------------------------

 

3 模型训练

完整代码如下。

function [net, info] = trainconv3()

global datadir;

run matlab/vl_setupnn ; %初始化

datadir='/home/longpeng/project/LongPeng_ML_Course/projects/classification/matconvnet/conv3/mouth';

opts.expDir = fullfile('/home/longpeng/project/LongPeng_ML_Course/projects/classification/matconvnet/conv3/','imdb') ;

opts.imdbPath = fullfile(opts.expDir, 'imdb.mat');

if exist(opts.imdbPath,'file')

  imdb=load(opts.imdbPath);

else

  imdb=mydataset(datadir);

  mkdir(opts.expDir) ;

  save(opts.imdbPath, '-struct', 'imdb') ;

end

net=simpleconv3();

net.meta.normalization.averageImage =imdb.images.data_mean ;

opts.train.gpus=1;

[net, info] = cnn_train(net, imdb, getBatch(opts), ...

'expDir', opts.expDir, ...

net.meta.trainOpts, ...

opts.train, ...

'val', find(imdb.images.set == 3)) ;

function fn = getBatch(opts)

% --------------------------------------------------------------------

  fn = @(x,y) getSimpleNNBatch(x,y) ;

end

function [images, labels]  = getSimpleNNBatch(imdb, batch)

  images = imdb.images.data(:,:,:,batch) ;

  labels = imdb.images.labels(1,batch) ;

  if opts.train.gpus > 0

      images = gpuArray(images) ;

  end

end

end

总共就这么几个步骤:

1)初始化环境,run matlab/vl_setupnn 。

2)定义网络:net=simpleconv3()。

3)调用训练接口:[net, info] = cnn_train(net, imdb, getBatch(opts)。

 

4 可视化

工具已经给封装好了可视化,直接运行代码就会跳出来,可以看出收敛正常,略有过拟合,展示的分别是softmax损失和错误率。

 

5 测试

%netpath=[opts.expDir '/net-epoch-50.mat'];   

netpath='/home/longpeng/project/LongPeng_ML_Course/projects/classification/matconvnet/conv3/imdb/net-epoch-50.mat';   

class=1;index=1;   

datadir='/home/longpeng/project/LongPeng_ML_Course/projects/classification/matconvnet/conv3/mouth';   

subdir=dir(datadir);   

imgfiles=dir(fullfile(datadir,subdir(class+2).name));   

img=imread(fullfile(datadir,subdir(class+2).name,imgfiles(index+2).name));   

imshow(img);   

net=load(netpath);   

net=net.net;   

im_=single(img);   

im_=imresize(im_,net.meta.inputSize(1:2));   

im_=im_ - net.meta.normalization.averageImage;   

opts.batchNormalization = false ;   

net.layers{end}.type = 'softmax';   

res=vl_simplenn(net,im_);   

scores=squeeze(gather(res(end).x));   

[bestScore,best]=max(scores);   

str=[subdir(best+2).name ':' num2str(bestScore)];   

title(str);   

disp(str);   

从上面可以看出,就是载入模型,完成正确的预处理,然后进行分类。

一个样本的结果如下,0:0.99968,表示分类为类别0的概率是0.99968,可知结果正确,0代表的类别就是中性表情。

 

总结

有很多的优秀代码仍然使用matconvnet,而且它的社区所包含的预训练模型也非常多,非常适合训练过程中进行调试,建议大家有Matlab环境和多余精力的可以学习一下,学习成本很低,技多不压身嘛。

本系列完整文章:

第一篇:【caffe速成】caffe图像分类从模型自定义到测试

第二篇:【tensorflow速成】Tensorflow图像分类从模型自定义到测试

第三篇:【pytorch速成】Pytorch图像分类从模型自定义到测试

第四篇:【paddlepaddle速成】paddlepaddle图像分类从模型自定义到测试

第五篇:【Keras速成】Keras图像分类从模型自定义到测试

第六篇:【mxnet速成】mxnet图像分类从模型自定义到测试

第七篇:【cntk速成】cntk图像分类从模型自定义到测试

第八篇:【chainer速成】chainer图像分类从模型自定义到测试

第九篇:【DL4J速成】Deeplearning4j图像分类从模型自定义到测试

第十篇:【MatConvnet速成】MatConvnet图像分类从模型自定义到测试

第十一篇:【Lasagne速成】Lasagne/Theano图像分类从模型自定义到测试

第十二篇:【darknet速成】Darknet图像分类从模型自定义到测试

感谢各位看官的耐心阅读,不足之处希望多多指教。后续内容将会不定期奉上,欢迎大家关注有三公众号 有三AI!

机器学习笔记 - 使用Deeplearning4j和浅层神经网络进行分类 我们使用deeplearning4j (dl4j) 库创建一个简单的神经网络,该库是一种现代且强大的机器学习工具。 我们使用链式的方式配置我们的网络。 (1)activation(),我们选择双曲正切 (tanh) 函数做为激活函数。 (2)weightInit ()方法指定了为网络设置初始权重的多种方法之一,这里我们使用高斯分布 ( WeightInit.XAVIER )。 (3)学习率是一个重要的参数,它深刻地影响着网络的学习能力,我们这里使用Nesterovs(0.1, 0.9)...... 阅读详情

相关推荐

Java Deeplearning4j:实现图像分类

本文介绍了如何使用 DeepLearning4J 进行图像分类任务。我们首先介绍了相关的 Maven 依赖,然后详细介绍了数据集准备、模型构建、模型训练和评估等关键步骤。通过实际的例子,我们展示了如何使用 DL4J 构建、训练和评估图像分类模型。最后,我们介绍了一些调整模型和参数的方法,以提高模型的性能。希望本文能够帮助读者更好地理解和使用 DeepLearning4J 进行图像分类任务。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 4379

关于卷积神经网络中(函数或变量 ‘vl_simplenn_tidy‘ 无法识别)与(尝试将 SCRIPT vl_nnconv 作为函数执行)等问题的远程在线调试解决方案

关于卷积神经网络中(函数或变量 'vl_simplenn_tidy' 无法识别)与(尝试将 SCRIPT vl_nnconv 作为函数执行)等问题的远程在线调试解决方案

m0_70745318的博客 2733

SAP FIORI静态磁贴从零到一:配置实战与权限打通

本文详细介绍了SAP FIORI静态磁贴的配置流程与权限管理,从准备工作到后台配置、目标映射、前台组织及权限分配,提供了实战技巧与常见问题解决方案。重点解析了静态磁贴的创建、目标映射配置及权限打通等关键步骤,帮助用户快速掌握FIORI静态磁贴的配置方法。

weixin_29266647的博客 250

DeepLearning4j 的图像分类与识别技巧

1.背景介绍 图像分类和识别是计算机视觉领域的基础和核心技术,它涉及到将图像作为输入,并通过深度学习算法来识别和分类图像中的对象、场景和特征。随着深度学习技术的发展,DeepLearning4j 成为了一个非常受欢迎的开源深度学习库,它为Java和Scala语言提供了强大的机器学习功能。 在本文中,我们将深入探讨如何使用DeepLearning4j进行图像分类和识别,涵盖了背景、核心概念、算法...

AI天才研究院 1625

新手必看!Cisco Packet Tracer 8.2从安装到完成第一个局域网实验(附常见问题解决)

本文为网络新手提供了Cisco Packet Tracer 8.2的完整入门指南。从官方下载安装、界面熟悉,到核心的拖拽设备、连线、配置IP地址三步操作,手把手教你完成第一个局域网组网实验。文章重点讲解了如何通过Ping命令验证连通性,并附带了连线错误、IP配置不当等常见问题的解决思路,帮助初学者快速上手这款强大的思科模拟器。

android的专栏 870

Arduino应用——PWM控制直流电机风扇

Arduino应用——PWM控制直流电机风扇PWM原理实验器件功能描述如何改变文本的样式插入链接与图片实现代码生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 最近在使用arduino UNO开发板完成课程小作业。其中一个要求设计一个电风扇控制系统,要求能够通过PWM调节风扇的转速。期间搜索了许多例程和方法,但受限于器件,效果不

hypecycle的博客 2万+

如何利用deeplearning4j中datavec对图像进行处理

一、导读 众所周知图像是有红绿蓝三种颜色堆叠而成,利用deeplearning对图像处理,必须把图像转化为张量,每一张图片由有三维张量组成,三维分别是[depth、height、width],直观来讲,就是用三个矩阵堆叠起来,每一个矩阵代表一个通道,如下图。有时候需要对图片进行旋转、...

dong_lxkm的博客 1005

ConvLSTM时空预测实战代码详解

ConvLSTM代码复现

JaysonWong的博客 1万+

线性分类器java_Deeplearning4j多层感知线性分类器训练Tianic数据

编辑推荐:本文来自于jianshu,文章介绍了神经网络的搭建并训练,构造评估对象,用测试集做评估的相关内容。Deeplearning4j是一个java编写的深度学习商业框架,可以通过他们提供的API快速搭建出神经网络。根据官网的下载的demo中的MLPClassiferLinear(多层感知线性分类器),训练Titanic数据,求生存分析。MLPClassiferLinearidea中该类所在的位...

weixin_42479284的博客 313

《C/C++等级考试(1~8级)历届真题解析》专栏总目录

中国电子学会《全国青少年软件编程等级考试》C/C++编程(1~8级)历届真题解析。订阅后可阅读专栏内所有真题解析,真题持续更新中!

人生就是一个不断学习的过程 2万+

【Power Compiler手册】4.saif文件

功耗计算的准确性取决于切换活动数据的准确性。这些数据是通过使用RTL仿真或门级仿真生成的,并存储在SAIF文件中。在执行功耗优化和分析之前,应该使用SAIF文件来反标设计对象上的切换活动信息。SAIF是由Synopsys支持的ASCII格式,用于促进不同Synopsys工具之间的信息交换(参见IEEE 1801标准,附录J)。使用`read_saif`命令读取SAIF文件,使用`write_saif`命令写出SAIF文件。有关更多信息,请参见`read_saif`和`write_saif`命令的手册页。

QRBQ 2189

【好专栏】深度学习框架不会用?12大主流深度学习框架快速入门,你值得拥有!...

欢迎来到【好专栏】,本次我们给大家推荐一个专栏,名为《12 大深度学习开源框架快速入门》,这个专栏为介绍了深度学习的 12 大主流框架,附带实践案例,能够让读者快速掌握深度学习框架的使用...

Leong Blog 516

大厂面经:大疆嵌入式面试题及参考答案(4万字长文:持续更新)

目录 Linux 系统调用的过程,中间发生了什么? 表格总结 Linux 中断流程,谈谈你对中断上下文的理解 中断流程 中断上下文理解 Linuxschedule()函数的原理和调用的时机 schedule()函数原理 调用时机 页表实现机制,分页的缺点? 页表机制 分页的缺点 介绍操作系统的多级反馈调度策略,时间片轮转,在项目中如何指定优先级来调度进程完成快速响应(nice命令) 多级反馈队列调度 时间片轮转 使用nice命令 聊内存分配,进程内存分配,段页式存

大模型大数据攻城狮的专栏 4172

【通知】有三AI发布150页深度学习开源框架指导手册与GitHub项目,欢迎加入我们的开源团队...

之前我们公众号输出了很多深度学习开源框架相关的内容,今天整理成技术手册给大家分享以方便阅读,下面是详细信息。开源框架背景现如今开源生态非常完善,深度学习相关的开源框架众多,光是为人熟知的...

hacker_long的专栏 697

OV9734 DATASHEET,完整规格书

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

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

卷积文本分类(gpu)实现--deeplearning4j

前面介绍用卷积训练文本分类模型,但是算法是cpu上跑的,涉及到大数据,cpu上是跑不动的,代码在之前的博客里面可以看到,本博客主要记录在gpu上跑碰到的坑。 报错如下: Exception in thread "main" java.lang.UnsupportedClassVersionError: org/deeplearning4j/parallelism/Par

luoyexuge的专栏 2950

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

基于Java的AI应用开发实战:从模型训练到服务部署

近年来,AI技术(如深度学习、自然语言处理)的爆发式增长,催生了Python在算法开发中的主导地位。然而,在企业级应用场景中,Java凭借其成熟的生态、高并发处理能力和稳定性,逐渐成为AI服务落地的核心语言。据统计,2025年全球60%的AI推理服务通过Java实现容器化部署。DL4J是Java领域最成熟的深度学习框架,支持与TensorFlow、Keras模型互操作,并提供分布式训练能力。对高并发的优化,Java在实时AI推理、边缘计算等场景的优势将进一步凸显。,包含102类花卉的8,189张图像。

TuFuir的博客 1800

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

如何在Java中实现高效的迁移学习:从图像分类到目标检测

在计算机视觉任务中,迁移学习常用于将预训练的图像分类模型迁移到目标检测任务。本文将介绍如何在Java中实现高效的迁移学习,包括从图像分类模型迁移到目标检测模型的步骤。为了将预训练的图像分类模型用于目标检测,我们需要调整模型结构,通常是添加额外的检测层。我们首先选择一个预训练的图像分类模型,例如ResNet-50,这是一个常用的卷积神经网络(CNN)。迁移学习的核心思想是利用已有的知识(通常是从大规模数据集上预训练的模型)来改进新任务的性能。在调整模型结构之后,我们需要在目标检测任务的数据上训练并微调模型。

微赚淘客系统开发者博客 555

【DL4J速成】Deeplearning4j图像分类从模型自定义到测试

文章首发于微信公众号《有三AI》 【DL4J速成】Deeplearning4j图像分类从模型自定义到测试 欢迎来到专栏《2小时玩转开源框架系列》,这是我们第九篇,前面已经说过了caffe,tensorflow,pytorch,mxnet,keras,paddlepaddle,cntk,chainer。 今天说Deeplearning4j(DL4J),本文所用到的数据,代码请参考我们官方git...

hacker_long的专栏 2507

dncnn_训练好的网络对应test程序分析,以及后续操作记录

这是训练的dncnn降噪网络进行测试以及测试代码的一些解析的记录

skyearth09的博客 743

第1章 MatConvNet简介

正文 MatConvNet是一个实现用于计算机视觉应用的卷积神经网络(CNN)的MATLAB工具箱。自从[8]的突破性工作以来,CNN在计算机视觉和特别是图像理解方面产生了重大影响,从本质上取代了传统的图像表示,例如我们自己的VLFeat [13]开源库中实现的图像表示。虽然大多数CNN是通过构造简单的线性和非线性滤波操作(如卷积和整形)来获得的,但它们的实现并不是微不足道的。原因是CNN需要从大...

shengjie1980的专栏 2738

MatConvNet配置详解,吐血整理Win10+MATLAB2019a+VS2015+cuda11.0

2、vs,推荐用VS2015及以上版本,我这里用的是VS2015,matconvnet在配置时需要用到这个软件里面的c++编译器,这里注意安装的时候要自定义安装勾选C++,不然不会生成cl.exe文件,如果忘记了也没事,安装好软件以后新建一个C++工程他就会自动生成cl.exe文件。cuda+cudnn安装,默认路径安装(我这里使用的是cuda11.0,因为我的电脑显卡是RTX3060ti,网上说法是3060显卡只支持11.0以上的cuda算力),cuda版本和cudnn版本要一致,cuda下载连接。

sswwyyy的博客 5594

win10+GPU+MATLAB+MatConvNet配置

本文参考http://www.vlfeat.org/matconvnet/install/,https://github.com/peiyunh/tiny,http://blog.youkuaiyun.com/wd1603926823/article/details/52370278 @article{hu2016finding, title={Finding Tiny Faces}, auth

marleylee的博客 1万+

MATLAB工具MatConvNet的安装(超详细的踩坑经历)

MATLAB深度学习工具MatConvNet的安装

weixin_66175071的博客 4576

MatConvNet的简单介绍和手写识别运用

1.MatConvNet的简介MatConvNet是一个实现卷积神经网络(CNN)的MATLAB工具箱,用于计算机视觉应用。 它简单,高效,并且可以运行和学习最先进的CNN。 许多用于图像分类,分割,人脸识别和文本检测的预训练CNN都有提供。2.配置过程首先从官网下载matconvnet(点击官网首页的Download) 接着运行根目录中matlab文件夹下的vl_compilenn.m。这其实

_者行孙的博客 3171
上一篇: 【Lasagne速成】Lasagne/Theano图像分类从模型自定义到测试
下一篇: 【杂谈】提升写代码效率不得不做的三件事
言有三
言有三 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄15年 3635粉丝 976原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言有三

三人行必有AI

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值