caffe学习笔记3.2--前向传播和反向传播

caffe loss以及正则项反向传播过程 概述以前一直以为反向传播的过程是这样的,由Softmax计算得出分类loss,然后在加上L2正则项得出总的total_loss,然后再利用total_loss进行反向梯度的计算,而正则项会在每层的Forward函数中计算并返回,表面上感觉很对,但是实际分析就会发现这样想法不合理的地方, 对正则项的计算,不同的solver是不一样的,而且正则项的方法也是有L2和L1, 每层layer的Forward函 阅读详情

caffe学习笔记3从3.1开始主要翻译一下caffe的官方文档,写的非常好,忍不住要作一下。本篇翻译来自caffe官网的:http://caffe.berkeleyvision.org/tutorial/forward_backward.html

前向传播和反向传播是计算神经网络非常重要的部分。

考虑一个简单的逻辑回归分类问题

前向传播:通过网络的输入计算输出结果的过程,在前向传播中,caffe整合每一层的计算得到整个模型的计算函数,这个过程是个自底向上的过程,如图:

数据x通过通过内积层得到g(x),然后通过softmax得到h(g(x))和损失函数(softmax loss)fw(x).


反向传播网络:根据损失计算梯度,在反向传播过程中,Caffe通过自动求导计算逆向组合每一层的梯度得到整个模型的梯度,在反向传播中,这个过程是自顶向下的。如图:

反向过程由loss开始,根据输出计算梯度dfw/dh (fw对h求导), 模型中其余各层的梯度根据链式法则计算。每层的参数:如INNER_PRODUCT层,在反馈过程中对参数计算梯度dfw/dWip.


你只需要定义好模型,这些计算就可以立即执行,caffe已经定义好的前向传播和反向传播的执行方法。

  • Net::Forward()和Net::Backward()实现整个网络的前向与后向的传播,Layer::Forward和Layer::Backward()计算每一层的前后向的传播
  • 每一层都有backward_{cpu,gpu}和backward{cpu,gpu}方法适应不同的计算模式。但是,一个层仅能使用其中的一种模式

Solver优化一个模型,首先通过forward计算输出和损失,然后通过backward生成模型的梯度,让后根据梯度和权值更新最小话损失函数,Solver,Net和Layer间的分离保证了caffe的模块化设计和开源。




参考资料:

http://caffe.berkeleyvision.org/tutorial/forward_backward.html

caffe 源码分析:Euclidean loss layer 最近做项目需要修改Euclidean loss函数,所以就先分析了一下Euclidean loss layer的代码 以gpu版本的为例: template void EuclideanLossLayer::Forward_gpu(const vector*>& bottom, const vector*>& top) { int count = bottom[0]->count 阅读详情

相关推荐

告别机床‘卡顿’!用C语言在STM32上实现连续小线段速度前瞻(附开源代码)

本文详细介绍了如何在STM32上使用C语言实现工业级连续小线段速度前瞻控制器,解决机床运动控制中的卡顿问题。通过轻量级算法框架设计和混合精度计算策略,显著提升加工效率和表面质量。文章包含开源代码和实战案例,帮助开发者快速掌握速度前瞻规划算法在嵌入式系统中的应用。

weixin_42571738的博客 186

Caffe学习笔记(二):Caffe前传与反传、损失函数、调优

Caffe学习(二):Caffe之前传与反传、损失函数、调优         在caffe框架中,前传/反传(forward and backward)是一个网络中最重要的计算过程;损失函数(loss)是学习的驱动,类似于视频编码中的率失真代价,是衡量学习的程度,或者说,学习的目的是找到一个网络权重的集合,使得损失函数最小;Solver是通过协调网络的前向推断计算和反向计算来对参数进行更新,从而达

成长Bar的博客专栏 1992

【阿里云大模型高级工程师ACP学习笔记】2.8 部署模型

【摘要】本文主要分享自学阿里云大模型高级工程师 ACP 认证中《2.8 部署模型》的学习笔记。详细介绍学习目标、梳理涵盖的知识点并评估其重要性和难易度,对既重要又困难的知识点进行重点分析,旨在为对阿里云大模型学习和认证感兴趣的读者提供学习思路和经验参考。

davidkorhenn的博客 2060

Caffe tutorial 之 前向与反向传播

本文参考Forward and Backward。前向与反向传播前向与后向传播是网络中重要的计算部分。 接下来以简单的逻辑回归分类器为例介绍。前向传播用于计算推理过程中给定输入的输出。在前向传播中,Caffe将每层的计算进行组合从而得到模型所代表的“函数”。此过程由底向上进行。 数据x经过全连接层(内积层)生成g(x)g(x),之后通过softmax层产生h(g(x))h(g(x)),从

kangdk 视其所以,观其所由,察其所安。 813

工业视觉中HDR算法的动态范围优化与Debevec/Mertens方法实践

本文深入探讨了工业视觉中HDR(高动态范围)成像技术,重点解析了Debevec和Mertens两种核心算法。针对工业场景中因动态范围不足导致的过曝与欠曝问题,文章详细对比了两种方法的原理、实现步骤、参数调优及适用场景,为工程师在静态检测与高速产线等不同需求下,选择并实践HDR算法提供了清晰的指导。

weixin_29099217的博客 193

结构设计3D拆件与骨架模型构建实战:基于Creo 8.0的5个高效建模技巧

本文详细解析了基于Creo 8.0的结构设计3D拆件与骨架模型构建实战技巧,涵盖5个高效建模方法,包括参数化驱动、曲面分割、多实体协同设计等。通过骨架模型的智能应用,设计效率可提升30%以上,特别适合复杂产品的结构设计。文章还提供了TWS耳机充电仓等实战案例,帮助工程师快速掌握工业设计中的核心建模技术。

weixin_30000735的博客 571

caffe的反向传播的实现

1、反向传播的实现 反向传播算法理论 摘自“http://ufldl.stanford.edu/wiki/index.php/Backpropagation_Algorithm” 假定我们有一个固定的训练集,有m个训练样本。我们可以使用“batch gradient descent”来训练我们的神经网络。详细的,对一个单一的训练样本(x,y),我们定义了它对应的损失函数如下: ...

sunlin972913894的博客 542

卫星遥感影像处理:地物分类与变化检测

卫星遥感影像处理:地物分类与变化检测​ ,人工智能,计算机视觉,大模型,AI,卫星遥感技术通过搭载在卫星上的传感器获取地球表面的电磁波信息,为地物分类与变化检测提供了宏观、动态的观测数据。随着高分辨率遥感卫星(如高分系列、哨兵系列)的发展,遥感影像的空间分辨率、光谱分辨率和时间分辨率不断提升,为精准地物识别和动态变化监测奠定了基础。地物分类旨在将遥感影像中的像元按地表覆盖类型(如植被、水体、建筑、农田等)进行分类,而变化检测则通过对比不同时期的影像,识别地表覆盖的变化区域(如城市扩张、森林砍伐、土地退化等)

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 17万+

caffe模型的python前向测试

python版本的caffe模型的前向测试

weixin_45354497的博客 727

华为OD机试 - 小火车最多人时所在园区站点(Java 2024 E卷 100分)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 996

[VT虚拟化驱动]安装DPC回调检测CPU对VT的支持

文章目录前言一、驱动基本框架二、安装DPC回调三、检测CPU对VT的支持本章代码def.h:DriverEntry.cpputil.cpp 前言 对于VT的介绍网上有很多详细的介绍,这里不再赘述,只需要知道它有比操作系统还高的权限,可以利用这一点进行某些操作,如内存隐藏, 无痕HOOK ,MSR HOOK, 调试或者反调试, 这里直奔主题 一、驱动基本框架 虚拟机设置里虚拟化引擎设置: 新建一个空的WDM工程,平台设置为x64平台,右键属性——>Inf2Cat——>Run Inf2Cat设置

吾无法无天的博客 3908

caffe前向传播

import os import sys import numpy as np sys.path.insert(0,"/home/jiashuaihe/Downloads/caffe/python") deploy = "deploy.prototxt" caffe_model = "./model/pred_iter_3260.caffemodel" img1 = "./test_resi...

aboy2018的博客 459

SolidWorks2020详细步骤安装教程

1、在安装软件前请断开网络连接,需要安装.NETFramework3.5和4.0,最后还要确保把之前安装的旧版本完全卸载,以管理员身份运行SolidWorks_Flexnet_Server\server_remove.bat,然后等到服务“SolidWorksFlexnet服务器”将被删除。12、先不要运行软件,找到_SolidSQUAD_文件夹,将文件夹“ProgramFiles\SOLIDWORKSCorp”中的所有破解文件复制替到“ProgramFiles\SOLIDWORKSCorp”目录下;

qq_53545309的博客 1万+

Caffe源码解读: SoftmaxLayer的前向与反向传播

1.前向传播部分 这部分直接参照softmax公式:                               template void SoftmaxLayer::Forward_cpu(const vector*>& bottom, const vector*>& top) { const Dtype* bottom_data = bottom[0]->cpu_data

zyf19930610的专栏 1379

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

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

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

CNN网络中卷积层的正向传播与反向传播理解

1. 基础理论 2. CNN正向运算 3. CNN反向运算 4. 参考资料

m_buddy的博客 1万+

深度学习工具包 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&#39;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(&#39;DeepLearnToolbox&#39;));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(&#39;state&#39;,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&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,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 = &#39;sigm&#39;;%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, &#39;Too big error&#39;);```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(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;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)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;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, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% 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&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 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, &#39;Too big error&#39;);```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(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % 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, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);%% 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(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

caffe 前向传播和反向传播

caffe学习笔记3从3.1开始主要翻译一下caffe的官方文档,写的非常好,忍不住要作一下。本篇翻译来自caffe官网的:http://caffe.berkeleyvision.org/tutorial/forward_backward.html 前向传播和反向传播是计算神经网络非常重要的部分。 考虑一个简单的逻辑回归分类问题 前向传播:通过网络的输入计算输出结果的过程,在前向传播中,...

LBJ_python的博客 679

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

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

Caffe源码解读: Softmax_loss_Layer的前向与反向传播

1,前向传播 分为两步:1,计算softmax概率prob_data,直接使用softmaxlayer的forward函数;                   2,计算loss,采用交叉熵,即每个第i类数据的loss为-log(prob(i))。 template void SoftmaxWithLossLayer::Forward_cpu( const vector*>& bo

zyf19930610的专栏 969

Caffe源码解读:conv_layer的前向传播与反向传播

实现原理请见:https://zhuanlan.zhihu.com/p/22860936 下面直接上conv_layer.cpp代码: //前向传播 template void ConvolutionLayer::Forward_cpu(const vector*>& bottom, const vector*>& top) { //blobs_[0]保存权值, blobs_

zyf19930610的专栏 850

Caffe学习3——Forward and Backward

Forward和Backward是Net中的计算本质。 让我们考虑最简单的逻辑回归分类器。 前向传播的部分是根据input来计算output,从而进行inference。在前向中,Caffe通过模型中每个layer的计算组合来计算“function”的值。这个传播从bottom到top进行。 数据x通过inner product layer来得到g(x)g(x)g(x),在通过一个s...

wusy的博客 1805

(Caffe,LeNet)反向传播(六)

本文地址: 本部分剖析Caffe中Net::Backward()函数,即反向传播计算过程。从LeNet网络角度出发,且调试网络为训练网络,共9层网络。具体网络层信息见 (Caffe,LeNet)初始化训练网络(三) 第2部分本部分不介绍反向传播算法的理论原理,以下介绍基于对反向传播算法有一定的了解。1 入口信息Net::Backward()函数中调用BackwardFromTo函数,从网络最后一层到

沤江一流的专栏 1万+

Caffe源码解读:dropout_layer的正向传播和反向传播

原理: 参数:1,神经元被drop out的概率p,被激活的概率为1-p           2,scale_train_标志位(train过程中被激活的神经元是否乘 1/1-p) train过程:           前向传播过程中每个神经元以1-p的概率被激活           被激活的神经元根据scale_train_标志来确定是否变大1/1-p倍 test过程

zyf19930610的专栏 1096

caffe使用gdb单步调试及源码阅读

本文主要是介绍我在阅读caffe过程中参考的顺序以及网站。 首先阅读caffe看了知乎上面的这篇文章 深度学习caffe的代码怎么读?参考的是Gein Chen大神的回答: 1.先让程序跑起来,看看结果,这样就会有直观的感受。 2.单步调试,跟着Caffe在网络里流动。 3.个性化定制Caffe。 4.理解并实现Backpropagation。 本文主要是进行了

dengbingfeng的专栏 5898

Caffe源码解读:pooling_layer的前向传播与反向传播

池化层分为最大池化和平均池化 正向传播的原理就不说了。 误差反向传播原理如下:   假设第l(小写的l,不要看成数字’1’了)层为卷积层,第l+1层为pooling层,且pooling层的误差敏感项为:   ,卷积层的误差敏感项为:  , 则两者的关系表达式为:       这里符号●表示的是矩阵的点积操作,即对应元素的乘积。卷积层和unsample()后的poo

zyf19930610的专栏 710

CNN网络中池化层的正向传播与反向传播理解

1. 池化定义 通常来说卷积之后的图像虽然在尺寸上有所减小,但是其尺寸还是较大,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)。这些概要统计特征不仅具有低得多的维度 (相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合)。这种聚合的操作就叫做池化 (pooling),有时也称为平均池化或者最大池化...

m_buddy的博客 6429

深度学习21天实战Caffe学习笔记--笔记5--caffe中前向传播、反向传播及最优化求解过程

深度学习21天实战Caffe学习笔记--笔记5--caffe中前向传播与反向传播的计算

乐兮山南水北的博客 2558
上一篇: 七月算法机器学习笔记1--机器学习中的数学之数理统计和参数估计
下一篇: caffe学习笔记3.3--Loss
thystar
博客等级 码龄17年 407粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值