学习神经网络小总结
学了许久的吴恩达的深度学习课程最近终于学完了,在这里就做个简单的总结吧。
1、什么是神经网络?
我觉得知道这一点是很重要的,在学一样东西之前得知道这个是什么。比如需要估计房子的价格,那么决定房子价格的因素是哪些呢?如果只考虑面积这一个因素的话,那么面积是输入,价格是输出,根据这两个数据可以拟合出一条曲线,如下图:
size_to_price.png
因为价格不可能是负的,所以有部分就为0。但是实际上,影响房价的因素不只有这些,比如家人的数量、地段等等都能影响房屋的价格,所以现在的输入就不只是有面积了,通过改变形成了下面的图:
x_to_y.png
这就是一个简单的神经网络,需要做的事情就是输入x得到y,这些节点和输入连接了起来,通过足够多的数据就可以计算出这些节点的值,这样就可以完成x到y的映射。
2、符号表示
比如现在有一张猫的图片,有RGB三通道,在作为输入之前应该将其进行变换,如下图所示:
cat.png
输入集:X的维度为[n_x, m],其中n_x为每个样本的个数,m为样本数
中间层l的权重:W[l]的维度为[n[l], n[l-1]],b[l]的维度为[n[l], 1]
激活值a[l]为:A[l] = g(W[l]A[l-1] + b[l]),维度为[n[l], 1]
3、W和b的初始化:
(1)零初始化:表现很差,误差基本上没有减少
(2)随机初始化:Wl=np.random.randn(layer_dims[l],layer_dims[l-1])*10,bl=np.zeros((layer_dims[l],1));
(3)He Initialization:W的随机数不是乘以10,而是乘以根号2除以前一层的维数;效果更好
4、优化
训练集的误差小于测试集(或验证集),则是过拟合(overfitting);
训练集的误差和测试集的误差都挺大,则是欠拟合(underfitting);
正则化(overfitting)
(1)L2 regularization:前向传播时在cost function后面加上lamda/2mWl.TWl;后向传播时,修正为dW要加上lamda/mW;
(2)Dropout正则化:keep_prob表示没有关闭的神经元的概率,前向传播Al表示每一层的维数,将它乘以Dl,Dl为只有0和1的矩阵,Dl=(Dl<keep_prob);Al=AlDl/keep_prob;反射传播需要将Dl算上
梯度检验:
估计梯度为gradapprox=(J(theta+epsilon)-J(theta-epsilon)/(2*epsilon),difference=||grad-gradapprox||2/(||grad||+||gradapprox||),如果误差在10的-7次则是准确的
momentum梯度下降法:将之前的梯度考虑进去,设置参数v,vdw(l)=betavdw(l)+(1-beta)dwl,更新为wl=wl-learning_rate*vdw(l)
Adam梯度下降法:vdw(l)=beta1vdw(l)+(1-beta1)dw(l),vdw(l)_correct=vdw(l)/(1-beta1t);sdw(l)=beta2*sdw(l)+(1-beta2)*dw(l)2,sdw(l)_correct=sdw(l)/(1-beta^t);dwl=dwl-learning_rate*vdw(l)_correct/sqrt(sdw(l)_correct+epislon)。t是t counts the number of steps taken of Adam,epislon是一个很小的数为了防止除以0;beta1选取为0.9,beta2取值为0.99
5、序列模型
(1)RNN:当Tx=Ty时
单元为:a<t>=tanh(Waaa<t-1>+Waxx<t>+ba);
y_hat<t>=softmax(Wyaa<t>+by);
公用参数Wax,Waa,Wya,ba,by
(2)LSTM网络(长短期记忆):
forget gate:Tf=sigmoid(Wf(a<t-1>,x<t>)+bf)
update gate: Tu=sigmoid(Wu(a<t-1>,x<t>)+bu)
output gate:To=sigmoid(Wo(a<t-1>,x<t>)+bo)
c_hat<t>=tanh(Wc(a<t-1>,x<t>)+bc)
c<t>=Tu×c_hat<t>+Tf×c<t-1>
a<t>=To×tanh(c<t>)
y_hat<t>=softmax(Wyaa<t>+by)
(3)GRU
c_hat<t>=tanh(Wc(a<t-1>,x<t>)+bc)
update gate: Tu=sigmoid(Wu(a<t-1>,x<t>)+bu)
c<t>=Tu×c_hat<t>+(1-Tu)×c<t-1>
a<t>=c<t>
6、TensorFlow一些用法
(1)
X=tf.constant(value,name="X")#name可以忽略不计
Loss=tf.Variable(X**2,name="Loss")#定义变量
init = tf.global_variables_initializer() #初始化
with tf.Session() as session: #等价于sess = tf.Session ,sess.run(Loss)
session.run(init)
print(session.run(Loss)) #需要run it
sess.close()#关闭Session
(2)
x=tf.placeholder(tf.float32,shape=(3,1),name="x") #定义变量类型
y=tf.sigmoid(x)
with tf.Session() as sess:
result = sess.run(y,feed_dict={x:z}) #z是输入的数据
sess.close()
7、Keras
步骤:
(1)首先为模型添加隐藏层和激活函数等等,搭建神经网络
https://keras.io/layers/convolutional/见官网
(2)对模型进行编译:model.compile(optimizer = "...", loss = "...", metrics = ["accuracy"]),optimizer有好几个种类:比如Adam,SGD,RMSprop等等,见官网https://keras.io/optimizers/,loss也有许多种
(3)之后对模型进行训练:model.fit(x = X_train, y =Y_train, epochs = ..., batch_size = ...),epochs是迭代次数,batch_size是mini_batch的大小
(4)之后进行测试:model.evaluate(x = x_test, y = y_test)
Create->Compile->Fit/Train->Evaluate/Test.
(5)model.summary()输出神经网络的架构
就先总结这么多吧,如果有忘记的再添加。