使用keras的多层自动编码器,指定不同的优化器

使用keras的多层自动编码器,指定不同的优化器,keras,Keras,目前,我正在尝试使用Keras实现多层自动编码器,处理Mnist数据集(手写数字)。我的代码如下所示: from keras.layers import Input, Dense, initializers from keras.models import Model import numpy as np from Dataset import Dataset import matplotlib.pyplot as plt from keras import optimizers, losses

目前,我正在尝试使用Keras实现多层自动编码器,处理Mnist数据集(手写数字)。我的代码如下所示:

from keras.layers import Input, Dense, initializers
from keras.models import Model
import numpy as np
from Dataset import Dataset
import matplotlib.pyplot as plt
from keras import optimizers, losses
from keras import backend as K
import tensorflow as tf
from keras.callbacks import TensorBoard
from keras.layers import Dropout
from keras.models import Sequential
from keras import models
from keras import layers
import keras
from keras.optimizers import Adam


#global variables
d = Dataset()
num_features = d.X_train.shape[1]
low_dim = 32


def autoencoder(epochs):
    w = initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None)
    model = Sequential()
    #First autoencoder
    model.add(Dense(400, activation='relu', kernel_initializer=w, input_dim=num_features, name='hidden'))
    model.add(Dropout(0.2))
    model.add(Dense(num_features, activation='sigmoid', input_dim = 400, name = 'output'))
    #Second autoencoder
    model.add(Dense(100, activation='relu', kernel_initializer=w, input_dim=num_features, name='hidden2'))
    model.add(Dropout(0.2))
    model.add(Dense(num_features, activation = 'sigmoid', input_dim = 100, name='output2'))
    #Third autoencoder
    model.add(Dense(50, activation='relu', kernel_initializer=w, input_dim=num_features, name='hidden3'))
    model.add(Dropout(0.2))
    model.add(Dense(num_features, activation='sigmoid', input_dim=10, name='output3'))
    model.compile(optimizer=Adam(lr=0.01), loss='binary_crossentropy', metrics=['accuracy'])
    history = model.fit(d.X_train, d.X_train,
                        epochs=epochs,
                        batch_size=64,
                        shuffle=True,
                        validation_data=(d.X_test, d.X_test))
    model.test_on_batch(d.X_test, d.X_test)
    print(history.history.keys())
    plt.plot(history.history['acc'])
    print(history.history['acc'])
    plt.show()
    return model

def finding_index():
    elements, index = np.unique(d.Y_test, return_index = True)
    return elements, index

def plotting():
    ae = autoencoder(2)
    elements, index = finding_index()
    y_proba = ae.predict(d.X_test)
    plt.figure(figsize=(20, 4))
    #size = 20
    for i in range(len(index)):
        ax = plt.subplot(2, len(index), i + 1)
        plt.imshow(d.X_test[index[i]].reshape(28, 28))
        plt.gray()
        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)

        ax = plt.subplot(2, len(index), i + 1 + len(index))
        plt.imshow(y_proba[index[i]].reshape(28, 28))
        plt.gray()
        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)
    plt.show()

plotting()

我有两个问题,当你堆叠自动编码器时应该是这样的,还是我应该让一层降维到400,然后再降到100,依此类推,还是我这样做的?第二个问题是,你能为不同的层提供不同的优化器(在我的例子中是Adam)吗?我想在最后一层使用SGD(随机梯度下降)。提前谢谢

你不应该按照你以前的方式去做,而应该按照你在问题中描述的方式去做。此外,您还应先向下,然后再向上(例如,400、100、50、25、10、25、50、100、400)以颗粒步骤进行


因为第二个问题是它所依赖的答案。你可以先用Adam训练模型,然后冻结除最后一层以外的所有层,用SGD进一步训练。但是你不能告诉Keras对不同的层使用不同的分类器。

非常感谢你的回答,但是我不明白最后一部分,如何“冻结”一层?Keras文档中显示了这一点:只需确保在再次编译模型并加载之前保存weigts。非常感谢你的回复,非常感谢,我对Keras atm有点迷茫:)是的,一开始它可能会让人不知所措。顺便说一句,也许你也可以看看keras的这篇博文。这也可能有助于开始:。另外,他们的其他博客文章可能会很有趣,因为他们有一些简洁的教程