反向传播神经网络–自编码-解码器的数据形状(shape info)分析
目标
分析自编码-解码器这种神经网络,训练时,数据形状的变化。
Shape info A[3,2]表示A矩阵有3行2列。
网络结构
五层神经网络:784 -> 250 -> 10 -> 250 -> 784
使用MNIST数据,输入层有 28 * 28 = 784个节点。
第二层250个节点。
第三层10个节点。
第四层250个节点。
第五层 28 * 28 = 784个节点。
除了最后一层,其他层都使用RELU作为激活函数。最后一层使用softmax作为激活函数。
使用MSE作为损失函数
小批量梯度下降,batch size是80
前三层被称为自编码器(autoencoder),后三层称为自解码器(autodecoder)。
可以看出数据先被压缩编码,然后在被解码还原。这种结构可以用来压缩数据,提取特征和异常检测。
//Set up network. 784 in/out (as MNIST images are 28x28).
//784 -> 250 -> 10 -> 250 -> 784
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
.seed(12345)
.weightInit(WeightInit.XAVIER)
.updater(new AdaGrad(0.05))
.activation(Activation.RELU)
.l2(0.0001)
.list()
.layer(new DenseLayer.Builder().nIn(784).nOut(250)
.build())
.layer(new DenseLayer.Builder().nIn(250).nOut(10)
.build())
.layer(new DenseLayer.Builder().nIn(10).nOut(250)
.build())
.layer(new OutputLayer.Builder().nIn(250).nOut(784)
.lossFunction(LossFunctions.LossFunction.MSE)
.build())
.build();
详细分析
正向传播
-
第一层
-
- 数据进入第一层
输入数据 input[ 80, 784 ]
- 数据进入第一层
-
- 第一层到第二层求 z 2 z^2 z2
z 2 [ 80 , 250 ] = i n p u t [ 80 , 784 ] ∗ w 2 [ 784 , 250 ] + b 2 z^2[ 80, 250] = input[ 80, 784 ] * w^2[ 784, 250 ] + b^2 z2[80,250]=input[80,784]∗w2[784,250]+b2
- 第一层到第二层求 z 2 z^2 z2
-
- 第一层到第二层求 a 2 a^2 a2
a 2 [ 80 , 250 ] = σ ( z 2 [ 80 , 250 ] ) a^2[ 80, 250] = σ( z^2[ 80, 250] ) a2[80,250]=σ(z2[80,250])
- 第一层到第二层求 a 2 a^2 a2
-
-
第二层
-
- 第二层到第三层求 z 3 z^3 z3
z 3 [ 80 , 10 ] = a 2 [ 80 , 250 ] ∗ w 3 [ 250 , 10 ] + b 3 z^3[ 80, 10 ] = a^2[ 80, 250 ] * w^3[ 250, 10 ] + b^3 z3[80,10]=a2[80,250]∗w3[250,10]+b3
- 第二层到第三层求 z 3 z^3 z3
-
- 第二层到第三层求 a 3 a^3 a3
a 3 [ 80 , 10 ] = σ ( z 3 [ 80 , 10 ] ) a^3[ 80, 10 ] = σ( z^3[ 80, 10 ] ) a3[80,10]=σ(z3[80,10])
- 第二层到第三层求 a 3 a^3 a3
-
-
第三层
-
- 第三层到第四层求 z 4 z^4 z4
z 4 [ 80 , 250 ] = a 3 [ 80 , 10 ] ∗ w 4 [ 10 , 250 ] + b
- 第三层到第四层求 z 4 z^4 z4
-