训练时如何解决损失不减少的问题

时间:2019-08-25 02:13:05

标签: python tensorflow keras autoencoder

训练自动编码器时,无论训练多少,损失都不会改变。

#Importing training data
inp = open('train.csv',"rb")
X = pickle.load(inp)
X = X/255.0
X = np.array(X)
X = np.reshape(X,(-1,25425))


input_img =tf.keras.layers.Input(25425,)
encoded1 = tf.keras.layers.Dense(75,activation=tf.nn.relu)(input_img)
encoded2 = tf.keras.layers.Dense(50,activation=tf.nn.relu)(encoded1)
decoded = tf.keras.layers.Dense(25425, activation='sigmoid')(encoded2)
# The input of the autoencoder is the image (input_img), and the output is the decoder layer (decoded)
autoencoder = tf.keras.Model(input_img, decoded)

encoder = tf.keras.Model(input_img, encoded2)

encoded_input = tf.keras.layers.Input(shape=(50,))
# The decoded only consists of the last layer
decoder_layer = autoencoder.layers[-1](encoded_input)
# The input to the decoder is the vector of the encoder which will be fed (using encoded_input), the output is the last layer of the network (decoder_layer)
decoder = tf.keras.Model(encoded_input, decoder_layer)

autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
autoencoder.fit(X, X, epochs=50, shuffle=True)

# Save the weights
autoencoder.save_weights('model_weights.h5')

# Save the model architecture
with open('model_architecture.json', 'w') as f:
    f.write(autoencoder.to_json())

我希望我能得到更好的培训,但是我的损失被固定在0.6932

1 个答案:

答案 0 :(得分:0)

自动编码器的任务是压缩输入大小,同时使信息丢失最小化。您的解码器试图做的是仅从25425个点中重建50个点,即经过 500倍压缩,这是非常不现实的。我还假设您的输入在(0,1)之间已归一化,因为sigmid无法到达。

解决方案:更改解码器编码器的单位数,以使比率input_dim/min_units是“合理的”(例如5:1)。 min_units =具有最少单位(编码器或解码器)的层的单位数-在您的情况下为50。(注意25425很大-考虑通过下采样(例如MaxPooling)或使用卷积自动编码器

对于具有S型乙状结肠的ReLU,可以同时使用两者,但请谨慎使用ReLU中的梯度/激活,例如通过重量衰减-参见this discussion