我正在尝试使用Keras API在Tensorflow中实现自动编码器。我的代码的灵感来自Keras网站上的示例:https://blog.keras.io/building-autoencoders-in-keras.html
目标是能够通过测量重建误差来检测数据集中的异常值。我的代码如下所示(我删除了一些图层以使其更合适):</ p>
inputD = tf.keras.Input(shape=(1602,))
encoded = tf.keras.layers.Dense(1024, activation=tf.nn.leaky_relu, kernel_initializer='glorot_normal' )(inputD)
encoded = tf.keras.layers.Dense(8, activation=tf.nn.leaky_relu, kernel_initializer='glorot_normal')(encoded)
encoded = tf.keras.layers.Dense(4, activation=tf.nn.leaky_relu, kernel_initializer='glorot_normal')(encoded)
encoded = tf.keras.layers.Dense(3, activation=tf.nn.leaky_relu, kernel_initializer='glorot_normal')(encoded)
decoded = tf.keras.layers.Dense(4, activation=tf.nn.leaky_relu, kernel_initializer='glorot_normal')(encoded)
decoded = tf.keras.layers.Dense(8, activation=tf.nn.leaky_relu, kernel_initializer='glorot_normal')(decoded)
decoded = tf.keras.layers.Dense(1024, activation=tf.nn.leaky_relu, kernel_initializer='glorot_normal')(decoded)
decoded = tf.keras.layers.Dense(1602, activation='sigmoid', kernel_initializer='glorot_normal')(decoded)
autoencoder = tf.keras.Model(inputD, decoded)
adam = tf.keras.optimizers.Adam(lr=0.0001)
autoencoder.compile(optimizer=adam, loss='binary_crossentropy', metrics=['mse'])
autoencoder.summary()
这将产生以下模型摘要:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_3 (InputLayer) (None, 1602) 0
_________________________________________________________________
dense_12 (Dense) (None, 1024) 1641472
_________________________________________________________________
dense_13 (Dense) (None, 8) 8200
_________________________________________________________________
dense_14 (Dense) (None, 4) 36
_________________________________________________________________
dense_15 (Dense) (None, 3) 15
_________________________________________________________________
dense_16 (Dense) (None, 4) 16
_________________________________________________________________
dense_17 (Dense) (None, 8) 40
_________________________________________________________________
dense_18 (Dense) (None, 1024) 9216
_________________________________________________________________
dense_19 (Dense) (None, 1602) 1642050
=================================================================
Total params: 3,301,045
Trainable params: 3,301,045
Non-trainable params: 0
我不明白为什么我的参数不对称,我希望例如最后一层的权重矩阵的形状与输入层相同,但事实并非如此。这正常吗?
在键入此内容时,我认为可能是由于隐藏层中的偏差所致。如果设置了use_bias=False
,我确实会获得镜像参数,但是我不确定最常用的参数是什么?编码器和解码器是否应该具有镜像参数,以获得更好的性能?
答案 0 :(得分:0)
您已经认为这里的问题是偏见。例如,如果您使用密集12和密集13之间的权重,则您拥有1024*8 = 8192
正常权重+ 8
偏差(总计8200
)。
如果权重在17到18之间,您将获得8*1024 = 8192
正常权重+ 1024
偏差(总计9216
)。在下一层中,您总是会有与神经元一样多的偏差。
希望能回答您的问题。