繁体   English   中英

自动编码器丢失不会减少(并且开始非常高)

[英]Autoencoder loss is not decreasing (and starts very high)

我有以下功能,应该自动编码我的数据。

我的数据可以被认为是长度为100,宽度为2的图像,它有2个通道(100,2,2)

def construct_ae(input_shape):
    encoder_input = tf.placeholder(tf.float32, input_shape, name='x')
    with tf.variable_scope("encoder"):
        flattened = tf.layers.flatten(encoder_input)
        e_fc_1 = tf.layers.dense(flattened, units=150, activation=tf.nn.relu)
        encoded = tf.layers.dense(e_fc_1, units=75, activation=None)

    with tf.variable_scope("decoder"):
        d_fc_1 = tf.layers.dense(encoded, 150, activation=tf.nn.relu)
        d_fc_2 = tf.layers.dense(d_fc_1, 400, activation=None)
        decoded = tf.reshape(d_fc_2, input_shape)

    with tf.variable_scope('training'):
        loss = tf.losses.mean_squared_error(labels=encoder_input, predictions=decoded)
        cost = tf.reduce_mean(loss)

        optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost)
        return optimizer

我遇到了我的成本大约为1.1e9的问题,而且它并没有随着时间的推移而减少

随着时间的推移

我想象了渐变(删除了代码因为它会让事情变得杂乱)而且我觉得那里出了什么问题? 但我不确定

在此输入图像描述

问题

1)网络结构中的任何内容看起来都不正确吗?

2)数据是否需要在0-1之间归一化?

3)当我尝试将学习率提高到1时,我有时会遇到NaNs。这是什么意思?

4)我想我应该使用CNN,但我遇到了同样的问题所以我想我会转移到FC,因为它可能更容易调试。

5)我想我正在使用错误的丢失功能,但我真的找不到任何关于正确使用损失的文件。 如果有人能指导我,我会非常感激

  1. 鉴于这是一个普通的自动编码器而不是卷积自动编码器,您不应期望良好(低)错误率。
  2. 规范化确实可以让您更快收敛。 但是,假设您的最后一层没有激活函数来强制输出范围,那么它应该不是问题。 但是,请尝试将数据规范化为[0,1],然后在最后一个解码器层中使用sigmoid激活。
  3. 非常高的学习速率可能会使您陷入优化循环和/或使您离任何局部最小值太远,从而导致极高的错误率。
  4. 大多数博客(如Keras)使用'binary_crossentropy'作为他们的损失函数,但MSE并非“错误”

就高启动误差而言; 这一切都取决于你的参数的初始化。 一个好的初始化技术可以让你启动与期望的最小值相差太远的错误。 但是,默认的随机或基于零的初始化几乎总是会导致这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM