精华内容
下载资源
问答
  • 全连接神经网络的权值更新原理推导(前向计算+反向传播) 本问我们首先介绍了全连接神经网络权值更新的基本数学原理——梯度下降算法。之后本问将介绍单层感知机(单输出全连接神经网络)的权值更新原理,从而进一步...

    全连接神经网络的权值更新原理推导(前向计算+反向传播)

    本问我们首先介绍了全连接神经网络权值更新的基本数学原理——梯度下降算法。之后本问将介绍单层感知机(单输出全连接神经网络)的权值更新原理,从而进一步讲解全连接神经网络权值更新的原理。

    1 梯度下降算法

    梯度下降算法是一种寻找函数极小值的算法,梯度下降算法将在后文的权值更新中用于求解目标函数的极小值(后文会解释什么是目标函数)。

    1.1 梯度

    首先需要了解的是:梯度是什么?
    梯度是一个向量,函数沿着这个向量的方向,函数值增加的速度最快。梯度中包含函数对各自变量的偏导数。比如对于函数:

    • f ( x , y ) = x 2 + y 2 f (x, y) = x^2 + y^2 f(x,y)=x2+y2

    梯度的计算公式为:
    g r a d i e n t = ( σ x σ f ( x , y ) , σ y σ f ( x , y ) ) = ( 2 x , 2 y ) gradient = ( \frac{\sigma x}{\sigma f(x, y)},\frac{\sigma y}{\sigma f(x, y)}) = (2x, 2y) gradient=(σf(x,y)σxσf(x,y)σy)=(2x,2y)

    1.2 梯度下降算法

    由于梯度的方向就是函数增加速度最快的方向,那么梯度的反方向就必然是函数值减少最快的方向。于是,我们可以使得自变量往梯度的反方向变化,这样函数就会逐步靠近最小值(其实不是梯度反方向也可以,只要这个方向是函数值减小的方向就可以)。

    于是,比如,对于待优化的函数 f ( w , b ) = w 2 ∗ x + b f (w, b) = w^2*x + b f(w,b)=w2x+b
    我们可以得到梯度下降的算法的基本实现步骤:

    1. 初始化一个 w 0 w_0 w0 b 0 b_0 b0的值
    2. 根据 w 1 = w 0 − α 1 ∗ 2 w x w_1 = w_0 - α_1*2wx w1=w0α12wx b 1 = b 0 − α 2 ∗ 1 b_1 = b_0 - α_2*1 b1=b0α21 (α是学习率,可以取0.001)更新 w w w b b b的值
    3. 不断更新直到收敛

    2 单输出感知机的权值更新原理

    首先定义变量的命名规则,如图所示:
    在这里插入图片描述
    w w w表示权值,下标表示连接的两个节点在各自层的编号,上标表示连接的上一层的层数。
    x x x表示输入值,下标表示该输入在各自层的编号,上标表示所在层的层数。
    O O O表示输入值经过激活函数后的值,与 x x x类似下标表示该输入在各自层的编号,上标表示所在层的层数。

    单输出感知机的结构如下图所示:
    在这里插入图片描述
    单层感知机的数学模型为:

    x 1 = x 0 ∗ w 0 + x 1 ∗ w 1 + x 2 ∗ w 2 + . . . + x n ∗ w n = ∑ x j ∗ w j x_1 = x_0*w_0 + x_1*w_1 + x_2*w_2 + ... + x_n*w_n = ∑x_j*w_j x1=x0w0+x1w1+x2w2+...+xnwn=xjwj
    O 1 = s i g m o i d ( x 1 ) O_1 = sigmoid(x_1) O1=sigmoid(x1)
    E = 1 2 ∗ ( O 1 − t 1 ) 2 E = \frac{1}{2}*(O_1 - t_1)^2 E=21(O1t1)2

    其中,sigmoid是激活函数(必须选可导的激活函数,不然后面没法求梯度);E是误差函数,是优化的对象;t1是真实值(label)。
    对于单层感知机,我们的目标是:输入一个样本(包含x0到xn的特征),模型可以输出准确(或与真实值相近)的O1值。所以在单层感知机中,我们需要对权值 w 0 , w 1 , w 2 , . . . , w n w_0, w_1, w_2, ..., w_n w0,w1,w2,...,wn进行更新。直到误差函数收敛至最小值,则更新完成,将 w 0 , w 1 , w 2 , . . . , w n w_0, w_1, w_2, ..., w_n w0,w1,w2,...,wn的值确定下来,用于预测新的数据。
    所以接下来让我们进行数学上的推导,理解 w 0 , w 1 , w 2 , . . . , w n w_0, w_1, w_2, ..., w_n w0,w1,w2,...,wn更新的过程(数学推导部分可选择直接跳过看结果):
    ————————————————————————数学推导部分————————————————————————
    根据梯度下降算法, w j w_j wj E E E的偏导数为:
    待更新…
    ——————————————————————————————————————————————————————
    所以, w j w_j wj E E E的偏导数公式为:
    σ w j σ E = ( O 0 − t ) O 0 ( 1 − O 0 ) x j \frac{\sigma w_j}{\sigma E}=(O_0-t)O_0(1-O_0)x_j σEσwj=(O0t)O0(1O0)xj
    于是,根据梯度下降公式, w j w_j wj的更新过程为:
    w j = w 0 − α ∗ σ w j σ E = w 0 − α ∗ ( O 0 − t ) O 0 ( 1 − O 0 ) x j w_j = w_0 - α*\frac{\sigma w_j}{\sigma E}=w_0 - α*(O_0-t)O_0(1-O_0)x_j wj=w0ασEσwj=w0α(O0t)O0(1O0)xj
    其中 w 0 w_0 w0表示 w j k w_{jk} wjk的初始化值。
    也就是说,每输入一个样本 X X X(一个样本包括特征 w 0 , w 1 , w 2 , . . . , w n w_0, w_1, w_2, ..., w_n w0,w1,w2,...,wn), w 0 , w 1 , w 2 , . . . , w n w_0, w_1, w_2, ..., w_n w0,w1,w2,...,wn就更新一次。于是,如果需要不断的更新 w 0 , w 1 , w 2 , . . . , w n w_0, w_1, w_2, ..., w_n w0,w1,w2,...,wn,就需要足够多的样本进行训练。

    3 多输出感知机的权值更新原理

    多输出感知机示意图如下:
    在这里插入图片描述
    与单输出感知机类似,多输出感知器的数学模型为:

    x 0 1 = x 0 0 ∗ w 00 1 + x 1 0 ∗ w 01 1 + x 2 0 ∗ w 02 1 + . . . + x n 0 ∗ w 0 n 1 = ∑ x j 0 ∗ w j k 1 x_0^1 = x_0^0*w_{00}^1 + x_1^0*w_{01}^1 + x_2^0*w_{02}^1 + ... + x_n^0*w_{0n}^1 = ∑x_j^0*w_{jk}^1 x01=x00w001+x10w011+x20w021+...+xn0w0n1=xj0wjk1
    O 0 1 = s i g m o i d ( x 0 1 ) O_0^1 = sigmoid(x_0^1) O01=sigmoid(x01)
    E = ∑ k = 1 m 1 2 ∗ ( O k 1 − t k ) 2 E = \displaystyle\sum_{k=1}^{m}\frac{1}{2}*(O_k^1 - t_k)^2 E=k=1m21(Ok1tk)2

    对与多输出感知机,目标函数仍然是 E E E,目标函数 E E E的自变量为 w 00 1 , w 01 1 , . . . , w 0 n 1 w_{00}^1,w_{01}^1,...,w_{0n}^1 w001,w011,...,w0n1,所以对于任意一个权值 w j k 0 w_{jk}^0 wjk0,梯度的推导过程大同小异:
    ————————————————————————数学推导部分————————————————————————
    根据梯度下降算法, w j k 0 w_{jk}^0 wjk0 E E E的偏导数为:
    待更新…
    ——————————————————————————————————————————————————————
    对于任意一个 w j k 0 w_{jk}^0 wjk0,在输入一个样本进行了一次前向计算后, w j k 0 w_{jk}^0 wjk0会进行一次权值的更新:
    w j k 0 = w 0 − α ∗ σ E σ w j k = w 0 − α ∗ ( O k 1 − t ) O k 1 ( 1 − O k 1 ) x j 0 w_{jk}^0 = w_0 - α*\frac{\sigma E}{\sigma w_{jk}}=w_0 - α*(O_k^1-t)O_k^1(1-O_k^1)x_j^0 wjk0=w0ασwjkσE=w0α(Ok1t)Ok1(1Ok1)xj0
    其中 w 0 w_0 w0表示 w j k 0 w_{jk}^0 wjk0的初始化值。
    于是,同理于单输出感知机:多输出感知机每输入一个样本,经过一次前向计算和反向传播,我们便可以对所有的 w j k 0 w_{jk}^0 wjk0进行一次权值更新。当输入足够多的样本,权值更新足够多次,多输出感知机模型的预测性能便会足够强大(输入一个样本,多输出感知机便能够输出与真实值误差足够小的预测值)。
    接着,我们可以通过加入隐含层,引入全连接神经网络模型及其权值更新原理。

    4 全连接神经网络的权值更新原理

    全连接神经网络的结构如下图所示:
    在这里插入图片描述
    在输入层与输出层之间,有若干隐含层(此处为分析方便,仅画出一层隐含层)。所以层输入到输出层分别为I层,J层,K层。
    前向计算的过程不再赘述,具体可参考多输出感知机的前向计算过程,本节主要推导梯度的更新过程
    ————————————————————————数学推导部分————————————————————————
    考虑输出层节点k∈K时,只考虑下图没被阴影遮盖的部分,因此与多输出感知器的推导结果相同。
    在这里插入图片描述
    考虑隐含层节点j∈J时:
    待更新…

    ——————————————————————————————————————————————————————
    因此,根据上述的推导:
    对于输出层节点k∈K:
    σ E σ w j k K = ( O k K − t k ) O k K ( 1 − O k K ) O j J = δ k K ∗ O j J \frac{\sigma E}{\sigma w_{jk}^K}= (O_k^K-t_k)O_k^K(1-O_k^K)O_j^J = \delta_{k}^K*O_j^J σwjkKσE=(OkKtk)OkK(1OkK)OjJ=δkKOjJ
    其中: δ k K = ( O k K − t k ) O k K ( 1 − O k K ) \delta_{k}^K=(O_k^K-t_k)O_k^K(1-O_k^K) δkK=(OkKtk)OkK(1OkK)

    对于隐含层节点j∈J:
    σ E σ w i j J = O j J ( 1 − O j J ) O i I ∑ k ∈ K ( O k K − t k ) O k K ( 1 − O k K ) = δ j J ∗ O i I \frac{\sigma E}{\sigma w_{ij}^J}= O_j^J(1-O_j^J)O_i^I\sum_{k∈K}(O_k^K-t_k)O_k^K(1-O_k^K)\quad= \delta_{j}^J*O_i^I σwijJσE=OjJ(1OjJ)OiIkK(OkKtk)OkK(1OkK)=δjJOiI
    其中: δ j J = O j J ( 1 − O j J ) ∑ k ∈ K ( O k K − t k ) O k K ( 1 − O k K ) \delta_{j}^J=O_j^J(1-O_j^J)\sum_{k∈K}(O_k^K-t_k)O_k^K(1-O_k^K)\quad δjJ=OjJ(1OjJ)kK(OkKtk)OkK(1OkK)

    对于输出层节点k∈K, ( O k K − t k ) O k K ( 1 − O k K ) (O_k^K-t_k)O_k^K(1-O_k^K) (OkKtk)OkK(1OkK)是一个只与K层及K层之后的节点有关的变量,因此将其定义为 δ k K \delta_{k}^K δkK。同理,对于隐含层节点j∈J, O j J ( 1 − O j J ) ∑ k ∈ K ( O k K − t k ) O k K ( 1 − O k K ) O_j^J(1-O_j^J)\sum_{k∈K}(O_k^K-t_k)O_k^K(1-O_k^K)\quad OjJ(1OjJ)kK(OkKtk)OkK(1OkK)是一个只与J层及J层之后的节点有关的变量,因此将其定义为 δ j J \delta_{j}^J δjJ

    同时我们可以发现,求解时,只有先求解 δ k K \delta_{k}^K δkK,才能求解 δ j J \delta_{j}^J δjJ。同理,当层数增多时,我们同样只能从后往前求解梯度更新的算子。因此,这个更新权值的过程称为反向传播

    实际进行编程时,可以进行如下定义以方便梯度的求解(以第k层为例):
    δ K = [ δ 0 K δ 1 K δ 2 K . . . δ m K ] \delta^K=\begin{bmatrix} \delta^K_0 \\ \delta^K_1 \\ \delta^K_2 \\ ... \\ \delta^K_m\end{bmatrix} δK=δ0Kδ1Kδ2K...δmK
    O J = [ O j 0 O j 1 O j 2 . . . O j n ] O^J=\begin{bmatrix} O_j^0 & O_j^1 & O_j^2 & ... &O_j^n \end{bmatrix} OJ=[Oj0Oj1Oj2...Ojn]
    于是, σ E σ w j k K \frac{\sigma E}{\sigma w_{jk}^K} σwjkKσE可根据下式求解:
    σ E σ w K = δ K O J \frac{\sigma E}{\sigma w^K}=\delta^KO^J σwKσE=δKOJ

    展开全文
  • 向前欧拉公式计算matlab程序函数function[H,X,Y,k,h,P]=QEuler(funfcn,x0,b,y0,tol)%初始化.pow=1/3;ifnargintol=1.e-6;end;x=x0;h=0.0078125*(b-x);y=y0(:);p=128;H=zeros(p,1);X=zeros(p,1);Y=zeros(p,length(y));...

    向前欧拉公式计算

    matlab

    程序函数

    function [H,X,Y

    ,k,h,P]=QEuler(funfcn,x0,b,y0,tol)

    %

    初始化

    .

    pow=1/3;

    if nargin 

    tol = 1.e-6;

    end;

    x=x0;

    h=0.0078125*(b-x);

    y=y0(:);

    p=128;

    H=zeros(p,1);

    X=zeros(p,1);

    Y=zeros(p,length(y));

    k=1;

    X(k)=x;

    Y(k,:)=y';

    %

    绘图

    .

    clc,x,h,y

    % end

    %

    主循环

    .

    while (xx)

    if x+h>b

    h=b-x;

    end

    %

    计算斜率

    .

    fxy=feval(funfcn,x,y);

    fxy=fxy(:);

    %

    计算误差,设定可接受误差

    .

    delta=norm(h*fxy,'inf');

    wucha=tol*max(norm(y,'inf'),1.0);

    %

    当误差可接受时重写解

    .

    if delta<=wucha

    x=x+h; y=y+h*fxy; k=k+1;

    if k>length(X)

    X=[X;zeros(p,1)];

    Y=[Y;zeros(p,length(y))];

    H=[H;zeros(p,1)];

    end

    H(k)=h;

    展开全文
  • Java 中 List 向前向后遍历import java.util.*;public class TestCollectionIterator {public static void main(String args[]){ArrayList al=new ArrayList();al.add("Amit");al.add("Vijay");al.add("Kumar");al...

    Java 中 List 向前和向后遍历

    import java.util.*;

    public class TestCollectionIterator {

    public static void main(String args[]){

    ArrayList al=new ArrayList();

    al.add("Amit");

    al.add("Vijay");

    al.add("Kumar");

    al.add(1,"Sachin");

    System.out.println("element at 2nd position: "+al.get(2));

    ListIterator itr=al.listIterator();

    System.out.println("traversing elements in forward direction...");

    while(itr.hasNext()){

    System.out.println(itr.next());

    }

    System.out.println("\ntraversing elements in backward direction...");

    while(itr.hasPrevious()){

    System.out.println(itr.previous());

    }

    }

    }

    参考答案

    ```

    element at 2nd position: Vijay

    traversing elements in forward direction...

    Amit

    Sachin

    Vijay

    Kumar

    traversing elements in backward direction...

    Kumar

    Vijay

    Sachin

    Amit

    展开全文
  • 向前向后推算日期

    2021-03-16 04:03:07
    import java.util.Calendar;import java.util.Date;/*** Created by Nicole on 6/2/2014.*/public class NicoleDateUtils {public static final String BEFORE = "B";public static final String AFTER = .../*** ...

    import java.util.Calendar;

    import java.util.Date;

    /**

    * Created by Nicole on 6/2/2014.

    */

    public class NicoleDateUtils {

    public static final String BEFORE = "B";

    public static final String AFTER = "A";

    /**

    * 向前或向后推算时间

    * @param date 日期计数

    * @param num 向前或向后推算几天

    * @param status 向前或向后推算

    * @return Date

    */

    public static Date calculateDate(Date date, Integer num, String status) {

    Calendar cal = Calendar.getInstance();

    cal.setTime(date);

    int mod = num % 5;

    int other = num / 5 *7;

    for (int i = 0; i < mod;) {

    if (BEFORE.equals(status)) {

    cal.add(Calendar.DATE, -1);

    switch (cal.get(Calendar.DAY_OF_WEEK)) {

    case Calendar.SUNDAY:

    case Calendar.SATURDAY:

    break;

    default:

    i++;

    break;

    }

    }else if (AFTER.equals(status)) {

    cal.add(Calendar.DATE, 1);

    switch (cal.get(Calendar.DAY_OF_WEEK)) {

    case Calendar.SUNDAY:

    case Calendar.SATURDAY:

    break;

    default:

    i++;

    break;

    }

    }

    }

    if (other > 0) {

    if (BEFORE.equals(status)) {

    cal.add(Calendar.DATE, other*(-1));

    }else if (AFTER.equals(status)) {

    cal.add(Calendar.DATE, other);

    }

    }

    return cal.getTime();

    }

    public static void main(String[] args) {

    System.out.println("now : " + new Date());

    System.out.println("before : " + calculateDate(new Date(), 4, "B"));

    System.out.println("after : " + calculateDate(new Date(), 4, "A"));

    }

    }

    展开全文
  • 分别使用向前欧拉法、向后欧拉法与改进dy欧拉法求解微分方程(编写程序) 在matlab中:Π用pi表示 编写程序 function [y1,y2,y3,y4]=exam4_6(a,b,k) h=(b-a)/k;x=a:h:b;[m,n]=size(x); y1=zeros(m,n);y2=zeros(m...
  • 1. 向前计算 对于pytorch中的一个tensor,如果设置它的属性 .requires_grad为True,那么它将会追踪对于该张量的所有操作。或者可以理解为,这个tensor是一个参数,后续会被计算梯度,更新该参数。 1.1 计算过程 ...
  • 前差资与股权权融融资较债试比。在凭证录入中,函数”按录入过“的(获取或F哪些钮(参照以下以通进行是可。未过可以账凭证的查询有(,命令账簿中查询。变Z型B型A可A与以互。不转通常录,体D特点细胞列真核之一染色复...
  • 逐步挑选法分为向前挑选、向后挑选、双向挑选。其中最常用的是双向挑选,能够兼顾模型复杂度与模型精度的要求。逐步回归法计算量大,python中也没有现成的包调用,使用的不多。常用到的指标有AIC,BIC,R2R^2R2,在...
  • (2)分别使用向前 Euler 法、向后 Euler 法、梯形方法、改进的 Euler 方法以及 四阶 Runge_Kutta 方法,结果如下图所示: 由结果可以发现,向前 Euler 法、向后 Euler 法和准确值的误差比较大, 梯形方法、改进的 ...
  • 一些关于差分的知识可以看看一阶差分:gradient命令二阶差分:del2命令用法help一下.如:[f(x+h) – 2f(x) + f(x – h)]/h^2 (1)这里h是步长.这个公式是一元函数二阶导用差分公式近似的表达,在matlab里可以用del2...
  • import java.util.*;public class xl{public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.println(“请输入日期时间格式为:xxxx年xx月xx日 xx时xx分xx秒”);...
  • 输出计算完成,只需要带入到损失函数MSE中计算出损失(loss),前向计算就完成了。 二、神经网络反向推导 1 损失函数展开 从损失函数开始推导,将损失函数展开至输入层 输出层 误差展开至隐藏层 误差...
  • 1.情景展示java 根据系统当前日期获取前一天日期、一天日期,或者根据初始日期推算出期望(向前/向后)日期。2.解决方案导包import java.text.ParseException;import java.text.SimpleDateFormat;import java.util....
  • 今儿组内随便聊天,说到代码的“向前兼容”和“向后兼容”。开始聊得都很嗨皮,可是越到后来我聊得和他们说的越是大相径庭。真应了那句话了:“你以为你以为的就是你以为的吗?!”。我以为说的“向前兼容”就是...
  • 直接上代码了,具体需求看项目要求 body里面的代码是这样的,用的是elementUI <el-row class="mt24"> <el-col :span="12"> <el-form-item label="周期单位" prop="periodUnit" ...el-select
  • 特征选择,SFS(顺序向前)与SBS(顺序向后)matlab源码&解析 这边文章将会讲解最基础的SFS algorithm & SBS algorithm. SFS-matlab %% SFS function [X,MaxF] = SFS(gN) MaxTimes = 4800; times = 0;%迭代...
  • 为查询结果建立向后/向前按钮更新时间:2006年10月09日 00:00:00 作者:最近在Support Forums上有很多问题都是关于如何为一个搜索结果制作象"向后 1 2 3 4 5 向前"样子 的链接。我希望下面的脚本可以帮助你,在你的...
  • 向前差分的matlab代码

    2021-04-18 11:36:14
    2 解得 所以向前差分格式的稳定性条件是 r ? r? 1 2 1 2 三.MATLAB 程序 a?2 a? 1 1 1 ,? ? ,则 r ? 2 ? ,满足稳定性条件 h 2 10 400 ......数值微积分以及数值分析 MATLAB @SDU 1 数值微分 数值微分的实现 两种方式...
  • 向后差分格式MATLAB编程:clear;clc;format short ea=input('请输入系数a的值');l=input('请输入长度l的值');M=input('请输入将区间[0,1]等分的个数M ');ot=input('请输入时间增量ot的值');n=input('请输入运行次数n...
  • 并转伪造的增买了后来又购0张值税给他人发票手卖,判断为构的行张某成(,先后卖给他人余张中的将其,务机张某值税专用关领购增从税发票老板私营。计算的账需要特定户是开立用途存款人因。的名写上用表在启字上应,...
  • 第36卷第4期2001年8月西南交通大学学报JOURNAL OF SOUTHWEST JIAOTONG UNlVERSl7ITYV胡36 No.4AuE 2001文章编号:0258_2724(2001)04.0383_04解纯对流方程几种向后特征差分格式的比较童兵,祝兵, 周本宽(西南交通...
  • 图像的前向和后向映射

    千次阅读 2021-02-16 22:23:06
    文章可在我的个人博客中查看:图像的前向和后向映射 效果可能会好一些 图像变换中总是伴随着映射,原图中的点到新图中的点之间的映射。从原图映射到新图上,由于坐标的不连续,就有新图上某点的像素确定的问题。也...
  • 假设我们要更新w1的值。 根据梯度下降法,我们需要计算一个偏导数. 其中C为你定义的Loss函数。 再使用公式 更新w。此处w2不同于上图w2. ...可以使用这个公式向后传导。 而输出层的C我们是知道的。...
  • 《热传导方程向前差分格式的matlab程序》由会员分享,可在线阅读,更多相关《热传导方程向前差分格式的matlab程序(2页珍藏版)》请在金锄头文库上搜索。1、向前差分格式 MATLAB 编程: clear;clc; format short e a=...
  • 向前欧拉公式在Matlab解微分方程初值解的问题0fuqilin1202013.07.04浏览527次分享举报用向前欧拉公式(10.8)求解初值问题,dy/dx=-3x+8x-7,y(0)=1,分别取n=10,n=100,并将计算结果与精确解作比较,写出在每个子区间...
  • 众所周知在计算机中,所有的数据都是通过电信号表示的,自然加法计算也是通过电信号来进行表达过程和结果的,高电平表示1低电平表示0,也就是二进制数,如果我们要计算11+21=?,换算为二进制数即1011+10101=?为什么...
  • python 根据当前时间计算前后推30天

    千次阅读 2021-01-20 14:25:11
    上代码 import datetime now = datetime.datetime.now() # 当前时间 ago = now-datetime.timedelta(days=30) # 当前时间往前推30天 later = now+datetime.timedelta(days=30) # 当前时间往后推30天
  • 计算方法 练习题.doc

    2021-01-13 17:40:37
    计算方法 练习题.doc练 习 题 一一、是非题1.??????? –12.0326作为x的近似值一定具有6位有效数字,且其误差限(。 ( )2.??????? 对两个不同数的近似数,误差越小,有效数位越多。 ( )3.??????? 一个近似数的有效数位...
  • 后端向前端传递数据: List<user> articleList=userservice.finduserList();//从数据库取用户列表 总之就是取出一个list 也可以是其他渠道获得的list session.setAttribute("articleList",articleList);//...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 162,999
精华内容 65,199
关键字:

向前向后计算