1 回顾一下我们原始的神经网络
在这个网络里面抛开输入层和输出层,隐藏层就只有一层,虽然能挖掘部分特征,但是其远远不过,不过浅层神经网络本身的功率其实有限,我们会在以这一章节中尝试去添加新的一层W2。
1.1 我们修改一下W的结构
W = [784,1000]
我们追加了1000个神经元,与此同时,我们的偏置值也要变动
Bias = [1,1000]
现在,我们追加第二层W2
W2 = [1000,10]
我们追加第二层偏置值Bias2
Bias2 = [1,10]
重新预测
h1 = x*W+Bias
h2 = h1*W2+Bias2
新的预测值为
Prediction = SoftMax(h2)
现在,让我们来修改一下以下我们的网络
import tensorflow as tf
x = tf.placeholder(tf.float32,[None,784])
YLabel = tf.placeholder(tf.float32,[None,10])
W = tf.Variable(tf.truncated_normal([784,1000],stddev=0.1))
Bias = tf.Variable(tf.truncated_normal([1,1000],stddev=0.1))
H1 = tf.matmul(x,W)+Bias
#H1 = tf.nn.dropout(H1,0.5)
W2 = tf.Variable(tf.truncated_normal([1000,10],stddev=0.1))
Bias2 = tf.Variable(tf.truncated_normal([1,10],stddev=0.1))
H2 = tf.matmul(H1,W2)+Bias2
Prediction = tf.nn.softmax(H2)
Loss = tf.reduce_mean(tf.square(Prediction-YLabel))
Train = tf.train.GradientDescentOptimizer(0.2).minimize(Loss)
BoolCorrect = tf.equal(tf.argmax(Prediction,1),tf.argmax(YLabel,1))
Accuracy = tf.reduce_mean(tf.cast(BoolCorrect,tf.float32))
Init = tf.global_variables_initializer()
针对新的网络,我们将它丢到Context中运行,发现:
其准确率居然在下降???
卧槽!无情?
我们有几种假设:
对于单层的浅层神经网络,它的评分网络结构是
Net = [784,10]
针对这个网络,有一个输入
Input = [1,784]
它是一张图片展开成为了行向量。
Input * Net = [1,10]
获得一个结果
这个结果可以认为是这个网络对这个输入的评价。
它有10个指标,这10个指标会从你的标准样本标签中学到指导其具体特征比如0,1,2,3...的特征指标。
10对10,这通常是比较客观的。
现在,我尝试将网络扩展成
h1 = [784,1000]
h2 = [1000,10]
那么对于第一层网络就产生了1000个评价指标,指导这1000个评价指标学习的源就是h2,这是反向传播的原理,但是,现在有个问题就是,其实对于这个问题来说,h1,h2之间其实是充满不确定性的,也就是1000个指标太多了,它冗余太多就会冲淡事实,这是一件非常糟糕的事情!所以h2的具体功能就是对h1进行加权评价,得到更为客观的结果。
从理论上来说,这样做是具有优势的...
但是...还是那个问题,冗余太多,前后层神经元之间联系糟糕,从而导致....这个网络
它充满了不确定,它在学习的过程中总是犹豫的,嗯,这也是为什么浅层神经网络会在早期被放弃的原因。
所以,针对大量神经元的冗余,我们通常是有解决办法的,我们随机去掉一些神经元试试:
这种机制在Tensorflow里面具有原生API:
H1 = tf.nn.dropout(H1,0.5)
这样,我们能够干掉一些冗余的神经元,去其糟粕,留其精华,这是极具意义的。
我们的结果也能...表现得更好
准确率曲线:
损失曲线:
显然有了一定优化,至于怎么调到90%以上的准确率,这是一个艰难的调参过程。
加油咯~
下一章,我们讲解卷积神经网络