机器学习week5 let θ=1,and 03=0.01怎么计算

Andrew Ng机器学习课程笔记--week5(下) - CSDN博客
Andrew Ng机器学习课程笔记--week5(下)
Neural Networks: Learning
内容较多,故分成上下两篇文章。
一、内容概要
Cost Function and Backpropagation
Cost Function
Backpropagation Algorithm
Backpropagation Intuition
Backpropagation in Practice
Implementation Note:Unroll Parameters
Gradient Checking
Random Initialization
Putting it Together
Application of Neural Networks
Autonomous Driving
二、重点&难点
1. Backpropagation in Practice
1) Implementation Note:Unroll Parameters
本节主要讲的是利用octave实现神经网络算法的一个小技巧:将多个参数矩阵展开为一个向量。具体可以参考课程视频,此处略。
2) Gradient Checking
神经网络算法是一个很复杂的算法,所以我们很难凭直觉观察出结果是否正确,因此有必要在实现的时候做一些检查,本节给出一个检验梯度的数值化方法。
首先我们可以将损失函数的梯度近似为
?J(θ)?θ≈J(θ+ε)-J(θ-ε)2ε
推广到一般形式是:
?J(θ)?θj≈J(θ1,θ2,θj+ε……,θn)-J(θ1,θ2,θj-ε……,θn)2ε
一般来说ε≈10-4时就比较接近了
最后我们的主要目标是检查这个梯度的近似向量与反向传播算法得到的梯度向量是否近似相等。
实现时的注意点:
首先实现反向传播算法来计算梯度向量DVec;
其次实现梯度的近似gradA
确保以上两步计算的值是近似相等的;
在实际的神经网络学习时使用反向传播算法,并且关掉梯度检查。
特别重要的是:
- 一定要确保在训练分类器时关闭梯度检查的代码。如果你在梯度下降的每轮迭代中都运行数值化的梯度计算,你的程序将会非常慢。
Random Initialization
关于如何学习一个神经网络的细节到目前为止基本说完了,不过还有一点需要注意,就是如何初始化参数向量or矩阵。通常情况下,我们会将参数全部初始化为0,这对于很多问题是足够的,但是对于神经网络算法,会存在一些问题,以下将会详细的介绍。
对于梯度下降和其他优化算法,对于参数向量的初始化是必不可少的。能不能将初始化的参数全部设置为0?
在神经网络中,如果将参数全部初始化为0 会导致一个问题,例如对于上面的神经网络的例子,如果将参数全部初始化为0,在每轮参数更新的时候,与输入单元相关的两个隐藏单元的结果将是相同的,既:
a(2)1=a(2)2
这个问题又称之为对称的权重问题,因此我们需要打破这种对称,这里提供一种随机初始化参数向量的方法: 初始θ(l)ij为一个落在 [-ε,ε]区间内的随机数,
可以很小,但是与上面梯度检验( Gradient Checking)中的ε没有任何关系。
4)Putting it together(组合到一起-如何训练一个神经网络)
这个老师说会在后面更加具体的介绍。
关于神经网络的训练,我们已经谈到了很多,现在是时候将它们组合到一起了。那么,如何训练一个神经网络?
首先需要确定一个神经网络的结构-神经元的连接模式, 包括:
输入单元的个数:特征
输出单元的格式:类的个数
隐藏层的设计:比较合适的是1个隐藏层,如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。
在确定好神经网络的结构后,我们按如下的步骤训练神经网络:
1.随机初始化权重参数;
2.实现:对于每一个
通过前向传播得到;
3.实现:计算代价函数;
4.实现:反向传播算法用于计算偏导数
5.使用梯度检查来比较反向传播算法计算的和数值估计的的梯度,如果没有问题,在实际训练时关闭这部分代码;
6.在反向传播的基础上使用梯度下降或其他优化算法来最小化;
Application of Neural Networks
主要介绍了老师的一个大佬朋友利用神经网络设计的自动驾驶汽车的视频,感兴趣的可以看看。
MARSGGBO?原创
本文已收录于以下专栏:
相关文章推荐
Neural Networks: Learning
内容较多,故分成上下两篇文章。一、内容概要
Cost Function and Backpropagation
Cost Function
Logistic Regression一、内容概要
Classification and Representation
Classification
Hypothesis Representatio...
Andrew Ng机器学习课程笔记–week21. 内容概要
Multivariate Linear Regression(多元线性回归)
多元变量的梯度下降
Computing...
随机梯度下降是很常用的算法,他不仅被用在线性回归上,实际上被应用于机器学习领域中的众多领域。
本节我们可以用这种算法来将代价函数最小化
我们想要使用梯度下降算法得到 θ0和θ1来使代价函数J(...
https://www.coursera.org/learn/machine-learning/lecture/rkTp3/cost-function
Cost Function
本节将梯度下降与代价函数结合,并拟合到线性回归的函数中
这是我们上两节课得到的函数,包括:
梯度下降的公式
用于拟合的线性假设和h(x)
平方误差代价函数 J(θ0 , θ1...
Andrew Ng机器学习week5(Neural Networks: Learning)编程习题nnCostFunction.mfunction [J grad] = nnCostFunction(...
机器学习笔记week3(Andrew NG)martin机器学习笔记week3Andrew NG
逻辑回归模型
解决过拟合问题
带正则化项的cost function...
Coursera上的Andrew Ng《机器学习》学习笔记Week2
作者:雨水/家辉,日期:,CSDN博客:http://blog.csdn.net/gobitan
机器学习笔记week2(Andrew NG)martin机器学习笔记week2Andrew NG
Linear Regression with Multiple Variable多元线性回归
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Coursera机器学习
week5 神经网络的学习 assignment - CSDN博客
Coursera机器学习
week5 神经网络的学习 assignment
sigmoidGradient.m:
function g = sigmoidGradient(z)
%SIGMOIDGRADIENT returns the gradient of the sigmoid function
%evaluated at z
g = SIGMOIDGRADIENT(z) computes the gradient of the sigmoid function
evaluated at z. This should work regardless if z is a matrix or a
vector. In particular, if z is a vector or matrix, you should return
the gradient for each element.
g = zeros(size(z));
% ====================== YOUR CODE HERE ======================
% Instructions: Compute the gradient of the sigmoid function evaluated at
each value of z (z can be a matrix, vector or scalar).
g = sigmoid(z).* (1 - sigmoid(z));
% =============================================================
randInitializeWeights.m:
function W = randInitializeWeights(L_in, L_out)
%RANDINITIALIZEWEIGHTS Randomly initialize the weights of a layer with L_in
%incoming connections and L_out outgoing connections
W = RANDINITIALIZEWEIGHTS(L_in, L_out) randomly initializes the weights
of a layer with L_in incoming connections and L_out outgoing
connections.
Note that W should be set to a matrix of size(L_out, 1 + L_in) as
the column row of W handles the &bias& terms
% You need to return the following variables correctly
W = zeros(L_out, 1 + L_in);
% ====================== YOUR CODE HERE ======================
% Instructions: Initialize W randomly so that we break the symmetry while
training the neural network.
% Note: The first row of W corresponds to the parameters for the bias units
init_epsilon = 0.12;
W = rand(L_out, 1 + L_in) * 2 *init_epsilon - init_
% =========================================================================
nnCostFunction.m:
function [J grad] = nnCostFunction(nn_params, ...
input_layer_size, ...
hidden_layer_size, ...
num_labels, ...
X, y, lambda)
%NNCOSTFUNCTION Implements the neural network cost function for a two layer
%neural network which performs classification
[J grad] = NNCOSTFUNCTON(nn_params, hidden_layer_size, num_labels, ...
X, y, lambda) computes the cost and gradient of the neural network. The
parameters for the neural network are &unrolled& into the vector
nn_params and need to be converted back into the weight matrices.
The returned parameter grad should be a &unrolled& vector of the
partial derivatives of the neural network.
% Reshape nn_params back into the parameters Theta1 and Theta2, the weight matrices
% for our 2 layer neural network
Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...
hidden_layer_size, (input_layer_size + 1));
Theta2 = reshape(nn_params((1 + (hidden_layer_size * (input_layer_size + 1))):end), ...
num_labels, (hidden_layer_size + 1));
% Setup some useful variables
m = size(X, 1);
% You need to return the following variables correctly
Theta1_grad = zeros(size(Theta1));
Theta2_grad = zeros(size(Theta2));
% ====================== YOUR CODE HERE ======================
% Instructions: You should complete the code by working through the
following parts.
% Part 1: Feedforward the neural network and return the cost in the
variable J. After implementing Part 1, you can verify that your
cost function computation is correct by verifying the cost
computed in ex4.m
% Part 2: Implement the backpropagation algorithm to compute the gradients
Theta1_grad and Theta2_grad. You should return the partial derivatives of
the cost function with respect to Theta1 and Theta2 in Theta1_grad and
Theta2_grad, respectively. After implementing Part 2, you can check
that your implementation is correct by running checkNNGradients
Note: The vector y passed into the function is a vector of labels
containing values from 1..K. You need to map this vector into a
binary vector of 1's and 0's to be used with the neural network
cost function.
Hint: We recommend implementing backpropagation using a for-loop
over the training examples if you are implementing it for the
first time.
% Part 3: Implement regularization with the cost function and gradients.
Hint: You can implement this around the code for
backpropagation. That is, you can compute the gradients for
the regularization separately and then add them to Theta1_grad
and Theta2_grad from Part 2.
X = [ones(m, 1) X];
%() 第一层
z2 = X*Theta1';
a2 = sigmoid(z2);
a2 = [ones(m, 1) a2];
%(5000*26)
z3 = a2*Theta2';
a3 = sigmoid(z3);
%(5000*10)
%J = -(1/m)*( sum((log(a3'))*y + log(1-a3')*(1-y)) );
for i = 1:m
a33 = (a3(i,:))';
%(10*1) a3中的第i行
p = zeros(num_labels, 1);
p(y(i)) = 1;
J = -(1/m)*( (log(a33'))*p + log(1-a33')*(1-p) ) + J;
fine3 = a33 -
a22 = (a2(i,:));
%(1*26) z2中第i行
z22 = (z2(i,:));
fine2 = (Theta2(:,2:end)'*fine3).*(sigmoidGradient(z22))'; %(25*1)
a11 = X(i,:);
%(1*401) X中第i行
%计算出X中每行数据对应的代价函数的函数的偏导数
Theta1_grad = Theta1_grad + fine2 * a11;
Theta2_grad = Theta2_grad + fine3 * a22;
temp1 = Theta1(:,2:size(Theta1, 2)).^2;
%去除Theta1第一列再各项平方
temp2 = Theta2(:,2:size(Theta2, 2)).^2;
%去除Theta2第一列
J = J + (lambda/(2*m))*( sum(temp1(:)) + sum(temp2(:)) );
Theta1_grad = Theta1_grad /
Theta2_grad = Theta2_grad /
Theta1(:,1) = 0;
Theta2(:,1) = 0;
Theta1_grad = Theta1_grad + lambda/m * Theta1;
Theta2_grad = Theta2_grad + lambda/m * Theta2;
% -------------------------------------------------------------
% =========================================================================
% Unroll gradients
grad = [Theta1_grad(:) ; Theta2_grad(:)];
本文已收录于以下专栏:
相关文章推荐
这是Coursera上Week6的神经网络的学习部分的编程作业代码。经过测验,全部通过。下面是 sigmoidGradient.msigmoidGradient.m 的代码:% sigmoidGrad...
为什么需要神经网络
在回答这个问题之前,先回顾下:
为什么需要logistic regression,linear regression可以完全取代logistic regression吗?
一.神经网络的cost function
    对于神经网络,可以用下图表示一个神经网络
    因此,对于神经网络来说,cost function J(θ)的定义如下:...
一.神经网络的结构选择
  
    从图上可以看出,神经网络的输入层和输出层已经由任务规定好了,我们能设计的结构只有隐藏层的神经元个数。
    一般来说,隐藏层神经元的个数要可以与输入层相同...
Programming Assignment 2: Learning Word Representations.Help
Warning: The hard deadline has...
Programming Assignment 1: The perceptron learning algorithm.Help
Warning: The hard deadline...
Programming Assignment 4: Restricted Boltzmann MachinesHelp
Warning: The hard deadline has ...
Neural Networks:Learning上周的课程学习了神经网络正向传播算法,这周的课程主要在于神经网络的反向更新过程。1.1 Cost function我们先回忆一下逻辑回归的价值函数
Neural Networks1.1 Non-linear hypotheses在课程的开头,提到了非线性假设,会因为特征量的增多导致二次项数的剧增。
举个例子,在图像识别中,一个50*50像素的图...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)NG机器学习week5 Neural Networks: Learning - CSDN博客
NG机器学习week5 Neural Networks: Learning
You are training a three layer neural network and would like to use backpropagation to compute the gradient of the cost function. In the backpropagation algorithm, one of the steps is to update
Δ(2)ij:=Δ(2)ij+δ(3)i*(a(2))j
for every&i,j.
Which of the following is a correct vectorization of this step?
Δ(2):=Δ(2)+δ(3)*(a(2))T
Δ(2):=Δ(2)+(a(2))T*δ(3)
Δ(2):=Δ(2)+δ(2)*(a(3))T
Δ(2):=Δ(2)+(a(2))T*δ(2)
Suppose&Theta1&is
a 5x3 matrix, and&Theta2&is
a 4x6 matrix. You set&thetaVec=[Theta1(:);Theta2(:)].
Which of the following correctly recovers&Theta2?
reshape(thetaVec(16:39),4,6)
reshape(thetaVec(15:38),4,6)
reshape(thetaVec(16:24),4,6)
reshape(thetaVec(15:39),4,6)
reshape(thetaVec(16:39),6,4)
Let&J(θ)=2θ4+2.
and&?=0.01.
Use the formula&J(θ+?)-J(θ-?)2?&to
numerically compute an approximation to the derivative at&θ=1.
What value do you get? (When&θ=1,
the true/exact derivative is&dJ(θ)dθ=8.)
Which of the following statements are true? Check all that apply.
Using gradient checking can help verify if one's implementation of backpropagation is bug-free.
For computational efficiency, after we have performed gradient checking to
verify that our backpropagation code is correct, we usually disable gradient checking before using backpropagation to train the network.
Computing the gradient of the cost function in a neural network has the same efficiency when we use backpropagation or when we numerically compute it using the method of gradient checking.
Gradient checking is useful if we are using one of the advanced optimization methods (such as in fminunc) as our optimization algorithm. However, it serves little purpose if we are using gradient descent.
Which of the following statements are true? Check all that apply.
If we are training a neural network using gradient descent, one reasonable &debugging& step to make sure it is working is to plot&J(Θ)&as
a function of the number of iterations, and make sure it is decreasing (or at least non-increasing) after each iteration.
Suppose you have a three layer network with parameters&Θ(1)&(controlling
the function mapping from the inputs to the hidden units) and&Θ(2)&(controlling
the mapping from the hidden units to the outputs). If we set all the elements of&Θ(1)&to
be 0, and all the elements of&Θ(2)&to
be 1, then this suffices for symmetry breaking, since the neurons are no longer all computing the same function of the input.
If we initialize all the parameters of a neural network to ones instead of zeros, this will suffice for the purpose of &symmetry breaking& because the parameters are no longer symmetrically equal to zero.
Suppose you are training a neural network using gradient descent. Depending on your random initialization, your algorithm may converge to different local optima (i.e., if you run the algorithm twice with different random initializations, gradient descent may
converge to two different solutions).
本文已收录于以下专栏:
相关文章推荐
Andrew Ng机器学习week5(Neural Networks: Learning)编程习题nnCostFunction.mfunction [J grad] = nnCostFunction(...
1.3 Feedforward and cost functionRecall that the cost function for the neural network (without regul...
Cost Function and BackpropagationCost Function在求取神经网络权重矩阵时,第一步也是要先写出cost function。它的cost function就是带...
Andrew Ng机器学习week4(Neural Networks: Representation)编程习题lrCostFunction.mfunction [J, grad] = lrCostFu...
Lecture 5 QuizHelp
Warning: The hard deadline has passed. You can attempt it, but you will ...
神经网络的机器学习(Neural Networks for Machine Learning)第五讲
lrCostFunction.m
function [J, grad] = lrCostFunction(theta, X, y, lambda)
%LRCOSTFUNCTION Compu...
斯坦福 机器学习Andrew NG 第四讲 Neural Networks representation
1·Non-linear hypotheses
为什么要引入神经网络呢?
还以前面所讲的房价问...
Neural Networks(神经网络)
Neural networks is a model inspired by how the brain works. It is widely us...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)斯坦福机器学习-week5 学习笔记(2)--神经网络小结 - CSDN博客
斯坦福机器学习-week5 学习笔记(2)--神经网络小结
一.神经网络的结构选择
& & 从图上可以看出,神经网络的输入层和输出层已经由任务规定好了,我们能设计的结构只有隐藏层的神经元个数。
& & 一般来说,隐藏层神经元的个数要可以与输入层相同,或者是输入层的3到4倍;& & 如果有两个以上的隐藏层的话,Andrew Ng认为,可以将隐藏层的神经元个数设置为相同的。& & 我个人的观点是,每一个隐藏层的数目比前一层多,这样,如果隐藏层的层数比较多的话,就可以形成一个深度神经网络了。
二.神经网络的训练过程
三.特征可视化
& &对于神经网络来说,隐藏层中的每一个神经元a学习到的特征就是前一层输出与这个神经元a的连接权重,在前一层神经元中与神经元a的连接权重越大,表示了前一层神经元对于神经元a的激活值的共享越大,也就越能将这个值一层一层传递到输出层过去。
& &因此,要想看到隐藏层学习到的特征,只需要将传递矩阵的每一行以合适的方式显示出来就可以了,在Andrew
Ng的课中,他是用将图片按照每一行的形式展开成一个列向量作为输入的,因此,只需要将输入层与输出层之间的传递矩阵的每一行逆操作就可以看到隐藏层学习到的特征了。
& &下面是Andrew Ng课后编程题中显示出来的隐藏层学习到特征。
& 在图中,每一个小块表示隐藏层一个神经元学习到的特征。
本文已收录于以下专栏:
相关文章推荐
一.神经网络的cost function
    对于神经网络,可以用下图表示一个神经网络
    因此,对于神经网络来说,cost function J(θ)的定义如下:...
为什么需要神经网络
在回答这个问题之前,先回顾下:
为什么需要logistic regression,linear regression可以完全取代logistic regression吗?
公开课地址:https://class.coursera.org/ml-003/class/index 
授课老师:Andrew Ng
1、non-linear hypotheses(非线...
公开课地址:https://class.coursera.org/ml-003/class/index 
授课老师:Andrew Ng
1、cost function(代价函数)
上一讲的最后引...
keyword:Optimization algorithm
一.最优问题的求解算法
二.最优问题求解算法的比较
三.利用Matlab求解最优问题
1.为什么要引入神经网络(Neural Network)一句话总结就是当特征值n特别大时,比如当n为100时;仅仅是其2次项特征值(x21,x1x2,x1x3…x1x100;x22,x2x3…x2x1...
最近在学习斯坦福大学的机器学习课程,自己把ex4的作业用Python实现了一下。
这是Coursera上Week6的神经网络的学习部分的编程作业代码。经过测验,全部通过。下面是 sigmoidGradient.msigmoidGradient.m 的代码:% sigmoidGrad...
sigmoidGradient.m:
function g = sigmoidGradient(z)
%SIGMOIDGRADIENT returns the gradient of the sig...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Stanford机器学习课程(Andrew Ng) Week 1 Model and Cost Function --- 第二节 Cost Function - CSDN博客
Stanford机器学习课程(Andrew Ng) Week 1 Model and Cost Function --- 第二节 Cost Function
Cost Function
在学习线性回归之前,我们有必要补充代价函数的知识,来帮助我们弄清楚如何把最有可能的直线和我们的数据相拟合。
还是上节课的数据集,而假设函数也是这样的一个最基本的线性函数形式
我们把θi称为模型参数,而且我们将讨论如何选择不同的θ0和θ1
我们想要选择合适θ0和θ1来使直线最好的拟合图中的数据点。
所以这里有一个最小化的概念就是使假设函数与训练样本之间的误差最小
图中右上角的式子,求取训练集中每一个样例的假设值与真实值的差的平方,再进行求和,平均,最终得到平均误差。我们要做的就是尽量最小化这个平均误差
将式子改写代价函数的形式就是右下角的式子,意为求出使代价函数J(θ0, θ1)最小的θ0和θ1,所以代价函数也成为平方误差代价函数。
平方误差代价函数可能是解决回归问题最常用的一种代价函数
Cost Function Intuition1:
下面我们通过一些例子来获取一些直观的感受:
为了更好的理解代价函数,
我们使用更为简化的一个例子h(x) = θ1x
两个重要函数h(x) and J(x)
假设函数h(x)是对于固定的θ1,这是一个关于x的函数,θ1控制斜率
代价函数J(x)是关于参数θ1的函数
假设我们训练样本包含三个点(1 , 1),(2 , 2),(3 , 3)
假设θ1 = 1,我们算出θ1 = 1 时候的代价函数为0+0+0=0
并且我们在J(θ)上找到θ1= 1时候对应的点(1 , 0)
所以如果θ1=0.5的时候会发生什么呢
从图中我们也可以看出h(θ)和y之间的差值其实就是特征点与直线之间的距离
如过θ为0呢?
假设函数直接和x轴重合,当然θ值也可以为负,不过相应的代价函数点可能会非常的大。计算更多的值我们可以看到J(θ1)的样子了
J(θ)中任何一个点都对应着代价函数的一条拟合直线。
所以θ1=1时可以获得最佳拟合的直线。
Cost Function Intuition2:
上面为了更好的可视化代价函数,将θ0设为了0.
而下面我们将使用两个值来计算代价函数。
先假设一个假设函数,但并不是很好的拟合数据。
根据给出的θ0和θ1的值。我们在右边画出代价函数的图像,但是我们现在有两个参数,不好画出,但是仍会呈现出弓形:
下面两个轴代表θ0和θ1,纵轴代表某个特定的点(θ0 , θ1)代价函数的大小
轮廓图表示代价函数
这里列出了不同值情况下的代价函数图像
这里每一圈代表表示J(θ0 , θ1)相同的所有点的集合,左边就是相应的假设函数,比如上图中的(800,-0.15)点离中心圆很远,就代表还远没有达到最佳的拟合效果。
从图中看出有的点和离中心比较近,相应的假设函数也看起来能更好的划分数据。
但是画出这些图相当麻烦,所以我们要寻找一种方法能自动找出是这些代价函数J取最小值的参数θ0和θ1。
本文已收录于以下专栏:
相关文章推荐
Model and cost
Model and Cost Function
Cost Function(We can measure the accuracy of our hypothesis function by usin...
logistic regression和linear regression的代价函数的思考谈到逻辑回归,必然逃不开与线性回归的比较。自然它们有很多不同,今天在这里主要讲讲自己对于它们代价函数的思考。 ...
1.线性回归CostFunction推导:
              在线性回归中,Cost Function是,关于这个公式的推导,首先由一个假设,其中满足高斯分布,...
1、代价函数简介
代价函数是用来衡量假设函数(hypothesis function)的准确性,具体衡量指标是采用平方差的方式计算。例如,假设函数是 hθ(xi) = θ0 + θ1yi,那么,代价函...
本文系转载,咯有修改
原博客地址:http://blog.csdn.net/u/article/details/在此,向原作者表达感谢,致敬!1.从方差代价函数说起代...
Model and Cost Function / Parameter Learning / Gradient Descent For Linear Regression 更多见:李飞阳
手势跟踪CVPR2014论文学习
随机梯度下降是很常用的算法,他不仅被用在线性回归上,实际上被应用于机器学习领域中的众多领域。
本节我们可以用这种算法来将代价函数最小化
我们想要使用梯度下降算法得到 θ0和θ1来使代价函数J(...
本节将梯度下降与代价函数结合,并拟合到线性回归的函数中
这是我们上两节课得到的函数,包括:
梯度下降的公式
用于拟合的线性假设和h(x)
平方误差代价函数 J(θ0 , θ1...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

 

随机推荐