-
多分支梯度反向传播,concat后梯度如何反向传播
2020-09-30 12:15:32使用keras举例说明: 网络结构如下: loss定义如下: ...网络具有两个输出,分别都要计算loss,那么在计算梯度反向传播的时候,就会有以下问题: 整个网络进行几次梯度更新,1次还是2次? VGG网络使用keras举例说明:
网络结构如下:
loss定义如下:
model.compile(loss="categorical_crossentropy",optimizer=OPT,metrics=["accuracy"], loss_weights={'main_output': 1., 'aux_output': 0.2}
网络具有两个输出,分别都要计算loss,那么在计算梯度反向传播的时候,就会有以下问题:
- 整个网络进行几次梯度更新,1次还是2次?
- VGG网络部分会受到Aux_out的梯度更新影响吗?
- concat操作之前的三个CNN网络,梯度是如何计算的?也就是说,网络有concat操作的时候,梯度更新如何作用于cancat之前的网络部分?
问题1
首先给出结论:在反向传播的时候,梯度更新只进行1次。
因为keras是基于计算图构建的网络,并且只有1个optimizer,optimizer也是计算图的一部分,所以最终loss计算是统一进行的,像上面的具有两个输出的网络,loss计算公式如下:
loss = (main_weight * main_loss) + (aux_weight * aux_loss) #you choose the weights in model.compile
其中
- main_loss 是 function_of(main_true_output_data, main_model_output)
- aux_loss 是 function_of(aux_true_output_data, aux_model_output)
网络所有的梯度计算仍然遵循最基本的 ∂(loss)/∂(weight_i)
因此,梯度更新只进行1次,计算方式如上所示。
问题2
- 网路具有两个输出层,对应两个训练集,一个对应于Aux_out,另一个对应Main_out,因此通过fit定义 model.fit(inputs, [main_y, aux_y], ...)
- 网路同样需要两个loss 函数,一个输出分支对应一个,其中main_loss对应main_out和main_y;Aux_loss对应Aux_out和Aux_y
- 网络的loss是两个输出loss 的和,即loss = (main_weight * main_loss) + (aux_weight * aux_loss)
- 网络一次反向传播更新1次梯度,所以整个网路的参数都通过上面的公式计算,因此,结论如下:
-
- Aux_out分支只会影响concat以前的部分,main_out分支会影响整个网络。
- 同时,Aux_out分支之前的网络部分,会同时受到两个分支的梯度更新影响,因此在下次前向传播的时候,VGG网络部分实际上也受到了上一次Aux_out分支更新梯度的影响。
问题3
concat是由三个CNN网络的输出拼接而成的,在反向传播的时候,会找到彼此的对应部分,有点像pooling操作的反向传播。
假设三个CNN输出的特征图尺寸完全相同,都是(H,W,C),concat后特征图为(H,W,3C),在反向传播计算到concat层的时候
- Input1只会计算(H,W,[0 : C])部分的梯度
- nput2只会计算(H,W,[C : 2C])部分的梯度
- nput1只会计算(H,W,[2C : 3C])部分的梯度
-
Tensorflow笔记:反向传播,搭建神经网络的八股,(损失函数loss,均方误差MSE,反向传播训练方法,学习率)
2019-07-10 12:48:36一、反向传播反向传播:训练模型参数,在所有参数上用梯度下降,使 NN 模型在训练数据上的损失函数最小。 损失函数(loss):计算得到的预测值 y 与已知答案 y_的差距。 损失函数的计算有很多方法,均方误差 MSE 是...一、反向传播
反向传播:训练模型参数,在所有参数上用梯度下降,使 NN 模型在训练数据上的损失函数最小。
损失函数(loss):计算得到的预测值 y 与已知答案 y_的差距。
损失函数的计算有很多方法,均方误差 MSE 是比较常用的方法之一。
均方误差 MSE:求前向传播计算结果与已知答案之差的平方再求平均。
用 tensorflow 函数表示为:loss_mse = tf.reduce_mean(tf.square(y_ - y))
反向传播训练方法:以减小 loss 值为优化目标,有梯度下降、momentum 优化器、adam 优化器等优化方法。
这三种优化方法用 tensorflow 的函数可以表示为:train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
train_step=tf.train.MomentumOptimizer(learning_rate, momentum).minimize(loss)
train_step=tf.train.AdamOptimizer(learning_rate).minimize(loss)
三种优化方法区别如下:
①tf.train.GradientDescentOptimizer()使用随机梯度下降算法,使参数沿着梯度的反方向,即总损失减小的方向移动,实现更新参数。参数更新公式是
其中,?(?)为损失函数,?为参数,?为学习率。
②tf.train.MomentumOptimizer()在更新参数时,利用了超参数,参数更新公式
是
?? = ???−1 + ?(??−1)
?? = ??−1 − ???
其中,?为学习率,超参数为?,?为参数,?(??−1)为损失函数的梯度。
③tf.train.AdamOptimizer()是利用自适应学习率的优化算法,Adam 算法和随机梯度下降算法不同。随机梯度下降算法保持单一的学习率更新所有的参数,学习率在训练过程中并不会改变。而 Adam 算法通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率。学习率:决定每次参数更新的幅度。 优化器中都需要一个叫做学习率的参数,使用时,如果学习率选择过大会出现震荡不收敛的情况,如果学习率选择过小,会出现收敛速度慢的情况。我们可以选个比较小的值填入,比如 0.01、0.001。
二、搭建神经网络的八股
我们最后梳理出神经网络搭建的八股,神经网络的搭建课分四步完成:准备工作、前向传播、反向传播和循环迭代。
0.导入模块,生成模拟数据集;
import
常量定义
生成数据集
1.前向传播:定义输入、参数和输出
x= y_=
w1= w2=
a= y=
2. 反向传播:定义损失函数、反向传播方法
loss=
train_step=
3. 生成会话,训练 STEPS 轮
with tf.session() as sess Init_op=tf. global_variables_initializer() sess_run(init_op) STEPS=3000 for i in range(STEPS): start= end= sess.run(train_step, feed_dict:)
-
反向传播详解
2019-09-25 20:06:11这是一场以误差(Error)为主导的反向传播(Back Propagation)运动,旨在得到最优的全局参数矩阵...神经网络的过程就是正向传播得到Loss值,再把Loss值反向传播,并对神经网络的参数进行更新,其中反向传播正是神经...这是一场以误差(Error)为主导的反向传播(Back Propagation)运动,旨在得到最优的全局参数矩阵,进而将多层神经网络应用到分类或者回归任务中去
一、为什么引入反向传播
神经网络的过程就是正向传播得到Loss值,再把Loss值反向传播,并对神经网络的参数进行更新,其中反向传播正是神经网络的要点所在
即前向传递输入信号直至输出产生误差,反向传播误差信息更新权重矩阵。
至于为什么会提出反向传播算法,我直接应用梯度下降(Gradient Descent)不行吗?想必大家肯定有过这样的疑问。答案肯定是不行的,纵然梯度下降神通广大,但却不是万能的。梯度下降可以应对带有明确求导函数的情况,或者说可以应对那些可以求出误差的情况,比如逻辑回归(Logistic Regression),我们可以把它看做没有隐层的网络;但对于多隐层的神经网络,输出层可以直接求出误差来更新参数,但其中隐层的误差是不存在的,因此不能对它直接应用梯度下降,而是先将误差反向传播至隐层,然后再应用梯度下降,其中将误差从末层往前传递的过程需要链式法则(Chain Rule)的帮助,因此反向传播算法可以说是梯度下降在链式法则中的应用。
比如:
两人猜数字这一过程类比没有隐层的神经网络, 比如逻辑回归, 其中小黄帽代表输出层节点,左侧接受输入信号,右侧产生输出结果, 小蓝猫则代表了误差,指导参数往更优的方向调整。 由于小蓝猫可以直接将误差反馈给小黄帽,同时只有一个参数矩阵和小黄帽直接相连, 所以可以直接通过误差进行参数优化(实纵线),迭代几轮,误差会降低到最小。
三人猜数字这一过程类比带有一个隐层的三层神经网络, 其中小女孩代表隐藏层节点,小黄帽依然代表输出层节点, 小女孩左侧接受输入信号,经过隐层节点产生输出结果, 小蓝猫代表了误差,指导参数往更优的方向调整。 由于小蓝猫可以直接将误差反馈给小黄帽,所以与小黄帽直接相连的左侧参数矩阵可以直接通过误差进行参数优化(实纵线); 而与小女孩直接相连的左侧参数矩阵由于不能得到小蓝猫的直接反馈而不能直接被优化(虚棕线)。 但由于反向传播算法使得小蓝猫的反馈可以被传递到小女孩那进而产生间接误差, 所以与小女孩直接相连的左侧权重矩阵可以通过间接误差得到权重更新,迭代几轮,误差会降低到最小
二、反向传播的重要性
例如:
e = (a + b)*(b + 1)
使用如下图表示,其中令a = 2,b = 1
如果用前向求导模式:关于b向前求导一次:
如果用反向求导模式:向后求导:
三、前项传播的过程
以此示例来讲解
如何将输入层的信号传输至隐藏层呢,以隐藏层节点c为例,站在节点c上往后看(输入层的方向),可以看到有两个箭头指向节点c,因此a,b节点的信息将传递给c,同时每个箭头有一定的权重,因此对于c节点来说,输入信号为:
同理,节点d的输入信号为:
由于计算机善于做带有循环的任务,因此我们可以用矩阵相乘来表示:
所以,隐藏层节点经过非线性变换后的输出表示如下:
激活函数sigmoid
作用是将输入限制到 (0,1) 这个区间内
同理,输出层的输入信号表示为权重矩阵乘以上一层的输出:
同样,输出层节点经过非线性映射后的最终输出表示为:
输入信号在权重矩阵们的帮助下,得到每一层的输出,最终到达输出层。
可见,权重矩阵在前向传播信号的过程中扮演着运输兵的作用,起到承上启下的功能四、反向传播的过程
既然梯度下降需要每一层都有明确的误差才能更新参数,所以接下来的重点是如何将输出层的误差反向传播给隐藏层
其中输出层、隐藏层节点的误差如图所示,输出层误差已知,接下来对隐藏层第一个节点c作误差分析。还是站在节点c上,不同的是这次是往前看(输出层的方向),可以看到指向c节点的两个蓝色粗箭头是从节点e和节点f开始的,因此对于节点c的误差肯定是和输出层的节点e和f有关不难发现,输出层的节点e有箭头分别指向了隐藏层的节点c和d,因此对于隐藏节点e的误差不能被隐藏节点c霸为己有,而是要服从按劳分配的原则(按权重分配),同理节点f的误差也需服从这样的原则,因此对于隐藏层节点c的误差为:
为了减少工作量,我们还是乐意写成矩阵相乘的形式:
你会发现这个矩阵比较繁琐,如果能够简化到前向传播那样的形式就更好了。实际上我们可以这么来做,只要不破坏它们的比例就好,因此我们可以忽略掉分母部分,所以重新成矩阵形式为:
仔细观察,你会发现这个权重矩阵,其实是前向传播时权重矩阵w的转置,因此简写形式如下:
不难发现,输出层误差在转置权重矩阵的帮助下,传递到了隐藏层,这样我们就可以利用间接误差来更新与隐藏层相连的权重矩阵。可见,权重矩阵在反向传播的过程中同样扮演着运输兵的作用,只不过这次是搬运的输出误差,而不是输入信号(我们不生产误差,只是误差的搬运工(っ̯ -。))。接下来就根据求得的误差来更新参数
首先对隐藏层的w11进行参数更新,更新之前让我们从后往前推导,直到预见w11为止:
这里采用均方差表示误差
求导得如下公式(所有值已知):
其中 sigmoid 激励函数为:
同理,误差对于w12的偏导如下:
同样,求导得w12的求值公式:
同理,误差对于偏置求偏导如下:
带入上述公式为:
接着对输入层的w11进行参数更新,更新之前我们依然从后往前推导,直到预见第一层的w11为止(只不过这次需要往前推的更久一些):
因此误差对输入层的w11求偏导如下:
求导得如下公式(有点长(ฅ́˘ฅ̀)):
同理,输入层的其他三个参数按照同样的方法即可求出各自的偏导,在这不再赘述。在每个参数偏导数明确的情况下,带入梯度下降公式即可(不在重点介绍):
至此,利用链式法则来对每层参数进行更新的任务已经完成。五、利用数学概念理解反向传播
要更新哪个矩阵就求代价函数C对这个矩阵元素的偏导; 运用链式法则,计算偏导; 把元素乘积转换为矩阵乘积。
假设我们有一个函数
z=x∗y
,其中:x=w∗2+b,y=b+1
,即:z=(w∗2+b)∗(b+1)
关系如下图:
注意这里 x, y, z 不是变量,w, b 是才变量,因为在神经网络中,我们要最终求解的是 w和b 的值,x,y,z 只是样本值。
当w = 3, b = 4时,会得到如下结果
最终的z值,受到了前面很多因素的影响:变量w,变量b,计算式x,计算式y。常数是个定值,不考虑。目前的z=50,如果我们想让z变大一些,w和b应该如何变化呢?
我们从z开始一层一层向回看,图中各节点关于变量b的偏导计算结果如下图:
因为z = x * y
,其中x = w * 2 + b,y = b + 1
所以:
其中:
同理,我们也可以得到图中各变量对w的偏导值:
从以上两图可以看出,反向微分保留了所有变量(包括中间变量)对结果z的影响。若z为误差函数,则对图进行一次计算,可以得到所有节点对z的影响,即梯度值,下一步就可以利用这些梯度值来更新w和b的权重。
w的变化和b的变化,哪一个对z的变化贡献大?从图中还可以注意到:
所以每次 w和b 的变化值是不相同的,b 的变化会比 w 大一些,也就是每一步的跨度大一些,这个是与z = xy = (w2+b)*(b+1)
这个算式相关的,并不代表神经网络中实际情况六、反向传播与梯度下降的关系
由于深度学习网络按层深入,层层嵌套的特点,对深度网络目标函数计算梯度的时候,需要用反向传播的方式由深到浅倒着计算以及更新参数,反向传播法是其在神经网络上的具体实现方式。
梯度下降是计算loss函数局部最小值,从而求解权重的算法。而反向传播可以快速计算梯度算子,也就是反向传播是梯度下降时的一种快速求偏导的算法。
CNN可以使用梯度下降,直接对各权重求偏导,而不使用反向传播算法,但计算量会非常大。
反向传播,目的是为了根据输出的误差来更新初始权重,而梯度下降是其实现方式参考:
【1】http://www.sohu.com/a/168767295_826434
【2】https://blog.csdn.net/LucyGill/article/details/64920840
【3】https://www.cnblogs.com/ms-uap/p/9945871.html -
AI_02_关于loss-softmax反向传播过程
2019-02-25 17:54:08写在前面: 网上有很多推导的过程,限于高数计算能力有限,且对就和符号等符号的排斥,手写了一版推导过程。以后便于回看。写在前面:
网上有很多推导的过程,限于高数计算能力有限,且对就和符号等符号的排斥,手写了一版推导过程。以后便于回看。
-
在Pytorch下,由于反向传播设置错误导致 loss不下降的原因及解决方案*
2018-11-19 21:06:03在Pytorch下,由于反向传播设置错误导致 loss不下降的原因及解决方案 本人研究生渣渣一枚,第一次写博客,请各路大神多多包含。刚刚接触深度学习一段时间,一直在研究计算机视觉方面,现在也在尝试实现自己的idea,... -
反向传播
2019-10-22 20:51:301、图中损失值loss为f=-12,想要知道x、y、z分别对f有多大的影响。希望loss越小越好 2、f对z的偏导为q,q=3,则希望z越越小越好 3、要计算f对x的偏导,需要先计算f对q的偏导,为z=-4,再算q对x的偏导为1,则f对x的偏... -
手写softmax cross entropy的反向传播推导过程以及反向传播代码。
2019-08-29 16:11:57如图,共两部分,softmax一部分,cross-entropy一部分,a1...正向传播和反向传播基本规则(可以参考cs231n的教程): 正向就是正常运算,没什么说的,正向的多对一操作,求和,正向的一对多,每一条线都传播同样的... -
MLP多层感知机梯度推导与反向传播
2019-08-05 15:09:24MLP多层感知机梯度推导与反向传播 1.MLP梯度推导 2.MLP链式法则 3.MLP反向传播 1.MLP梯度推导 单输出感知器模型: 图1运算法则: 输入X乘以权重W得到y,再通过激活函数得到输出(O)。在这里,激活函数是... -
反向传播算法为什么要“反向”
2019-09-21 16:03:25反向传播算法是深度学习的最重要的基础,...在机器学习中,很多算法最后都会转化为求一个目标损失函数(loss function)的最小值。这个损失函数往往很复杂,难以求出最值的解析表达式。而梯度下降法正是为了解决这类... -
python 反传播_反向传播算法详解和Python代码实现
2020-12-22 13:42:27反向传播算法是训练神经网络的经典算法,是深度学习的最重要的基础,适合于多层神经元网络的一种学习算法,它建立在梯度下降法的基础上,通过迭代的方法求出目标损失函数(loss function)的近似最小值。本文通过理论... -
tensorflow框架--反向传播
2020-02-09 14:22:57反向传播:训练模型参数,在所有参数上用梯度下降,使NN模型在训练数据上的损失函数最小。 损失函数(loss):计算得到的预测值y与已知答案y_的差距。 损失函数的计算有很多方法,均方误差MSE是比较常用的方法之一。... -
tensorflow笔记二:反向传播
2018-11-02 00:04:00反向传播 训练模型参数,在所有参数上用梯度下降,使NN模型在训练数据上的损失函数最小。 损失函数(loss): 预测值(y)与已知答案(y_)的差距 均方误差MSE: 损失函数的计算方法有很多,比较常用的有 均方误差. ... -
BP神经网络(手撕前向和反向传播)
2020-06-07 21:50:07我们反向传播的目标是更新网络中的每个权重,以便它们使实际输出更接近目标输出,从而将每个输出神经元和整个网络的误差最小化。传播的误差,更新权重使得loss最小。 3、前向传播 前向传播传数据的输入,特征的... -
感知机 MLP 梯度反向传播详细推导
2019-04-10 16:42:435. 感知机梯度传播推导单一输出感知机多输出感知机链式法则MLP 反向传播推导2D 函数优化实例 单一输出感知机 x = torch.randn(1, 10) w = torch.randn(1, 10, requires_grad=True) o = torch.sigmoid(x@w.t()) o.... -
机器学习4 -- 反向传播(back propagation)
2020-08-29 14:29:24由于有多个样本输出值,故叠加所有loss函数对参数w的偏导,即可得到最终的梯度。 2 forward和backward 如上图所示,假设输入两个feature x1和x2,前向计算得到中间隐层z,然后再经过一系列计算得到最终输出y1和y2... -
TensorFlow笔记-05-反向传播,搭建神经网络的八股
2018-09-08 15:00:00TensorFlow笔记-05-反向传播,搭建神经网络的八股 反向传播 反向传播: 训练模型参数,在所有参数上用梯度下降,使用神经网络模型在训练数据上的损失函数最小 损失函数:(loss) 计算得到的预测值 y 与已知答案 ... -
pytorch中的自定义反向传播,求导实例
2021-01-20 04:07:01在图像处理过程中,我们有时候会使用自己定义的算法处理图像,这些算法多是基于numpy或者scipy等包。 那么如何将自定义算法的梯度加入到pytorch的计算图中,能使用Loss.backward()操作自动求导并优化呢。下面的代码... -
pytorch中自定义反向传播,求导
2019-02-01 11:34:48在图像处理过程中,我们有时候会使用自己定义的算法处理图像,这些算法多是基于numpy或者scipy等包。那么如何将自定义算法的梯度加入到pytorch的计算图中,能使用Loss.backward()操作自动求导并优化呢。下面的代码... -
深度学习2.0-16.随机梯度下降之反向传播算法推导
2020-10-09 22:34:18文章目录1.激活函数及其梯度1.sigmoid/Logistic2.Tanh-在RNN中使用较多3.relu-...多层感知机梯度(反向传播算法) 1.激活函数及其梯度 1.sigmoid/Logistic 容易出现梯度离散,权值长时间保持不变,未能更新 2.Ta -
神经网络计算过程(正向传播,反向传播,优化策略和参数更新)
2020-10-06 18:31:10原理是设计一个多参数的非线性组合模型,即多层神经网络model. 用这个model来近似(拟合)一个无法求出的复杂函数 y = f(x). (输入x和输出y皆为高维变量的) 定义这个模型的前向传播过程,即forward : 即数据input进... -
CS231n学习#2:最优化与反向传播
2019-02-01 13:28:21算法一:随机生成多个W,选择Loss最小的,这个方法简单易行,但效率过于低下。 算法二:对于某个随机生成W,每次随机生成一个微小值,当的Loss更小时更新W,虽然比算法一好,但效率还是太低。 算法三:跟随梯度。... -
深度学习知识点整理(二)——神经网络理解 / 反向传播 / 激活函数 / 神经网络优化
2020-06-30 13:39:143. Neural Network Basics& Back Propagation 16.从线性分类到两层神经网络 linear f=Wx 2-layer NN f=W2max(0,W1x) ...反向传播 权重更新 迭代直到收敛 4. Improve DNN -1 为什么需要激活函数 -
Pytorch的bakcward()多个loss函数
2019-10-14 08:34:18Pytorch的backward()函数 假若有多个loss函数,如何进行反向传播和更新呢? x = torch.tensor(2.0, requires_grad=True) y = x**2 ... -
YOLO中LOSS函数的计算
2020-06-06 12:03:20YOLO中LOSS函数的计算代码解读无目标位置confidence的delta:0 - l.output[obj_index]有目标位置confidence的delta:1 - l.output[obj_index]有目标位置坐标(x,y,w,h...LOSS函数在反向传播的时候,已经分解成l.delta按 -
Focal Loss for Dense Object Detection
2018-10-31 16:33:46因为 (1-pt)r 对Loss有缩放作用,使 解近正确好分的样本的 Loss值接近于0,从而减小反向梯度的传播。即使某一类有很多容易区分的样本也不会使 模型有太多偏移。 Focal Loss 的形式不是唯一的,只要满足上面的缩放... -
CTC loss-初步理解2
2020-07-28 11:58:04参考: 深度实践OCR ...前向传播和反向传播的时候会计算一个矩阵,宽为T,长和GT的长度有关,假如GT的长度为n,那么该矩阵的长为2*n+1 该矩阵表示了所有可能在t=8的时间内构建apple的所有路径 需要满 -
pytorch 绘制多个算法loss_使用AMP和Tensor Cores得到更快速,更节省内存的PyTorch模型...
2020-12-30 17:20:51你知道吗,在1986年Geoffrey Hinton就在Nature论文中给出了反向传播算法?此外,卷积网络最早是由Yann le cun在1998年提出的,用于数字分类,他使用了一个卷积层。但是直到2012年晚些时候,Alexnet才通过使用多个卷... -
深度学习手记(十)之TensorFlow中求loss的三种函数对比
2019-04-17 21:39:51在搭建神经网络模型时,都会计算模型的loss,再进行反向传播优化参数。而在TensorFlow中计算loss的函数有很多,其中使用比较多的是: tf.losses.sparse_softmax_cross_entropy() tf.nn.sparse_softmax_cross_... -
GradNorm:Gradient Normalization for Adaptive Loss Balancing in Deep Multitask Networks,梯度归一化
2020-03-21 22:39:12文章目录引言gradnorm ... gradnorm是一种优化方法... 不同任务loss梯度的量级(magnitude)不同,造成有的task在梯度反向传播中占主导地位,模型过分学习该任务而忽视其它任务;2. 不同任务收敛速度不一致;这两个... -
深度学习基础--loss与激活函数--Relu(Rectified Linear Units)
2018-11-19 10:03:511)采用sigmoid和tanh等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大;而采用Relu激活函数,整个过程的计算量节省很多。 2)对于深层网络,sigmoid函数...
-
C++复试宝典.pdf
-
linux基础入门和项目实战部署系列课程
-
‘tf2_ros::TransformListener::TransformListener(tf2::BufferCore&, ros::NodeHandle const&, bool)’未定义..
-
MaxScale 实现 MySQL 读写分离与负载均衡
-
MySQL 高可用工具 DRBD 实战部署详解
-
MySQL 备份与恢复详解(高低版本 迁移;不同字符集 相互转换;表
-
【硬核】一线Python程序员实战经验分享(1)
-
基于Hypervisor虚拟化技术的Hadoop云平台管理方案的研究.docx
-
Codeforces Global Round 13 D. Zookeeper and The Infinite Zoo(思维,位运算)
-
opencv.zip
-
把PHP项目部署到服务器上,让别人看见你的成果。
-
HP_M1130_M1210_MFP_Full_Solution-v20180815-10158769.rar
-
ansys electronic 19
-
js严格模式
-
mysql-8.0.11-winx64.zip
-
【爱码农】C#制作MDI文本编辑器
-
GETshell工具 一天几百条!!!
-
request+response学习笔记
-
jquery库是什么意思
-
MySQL 性能优化(思路拓展及实操)