训练自动编码器时,无论训练多少,损失都不会改变。
#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
答案 0 :(得分:0)
自动编码器的任务是压缩输入大小,同时使信息丢失最小化。您的解码器试图做的是仅从25425
个点中重建50
个点,即经过 500倍压缩,这是非常不现实的。我还假设您的输入在(0,1)
之间已归一化,因为sigmid无法到达。
解决方案:更改解码器和编码器的单位数,以使比率input_dim/min_units
是“合理的”(例如5:1)。 min_units
=具有最少单位(编码器或解码器)的层的单位数-在您的情况下为50。(注意:25425
很大-考虑通过下采样(例如MaxPooling
)或使用卷积自动编码器
对于具有S型乙状结肠的ReLU,可以同时使用两者,但请谨慎使用ReLU中的梯度/激活,例如通过重量衰减-参见this discussion。