Многослойный автоэнкодер с использованием керас с указанием различных оптимизаторов - PullRequest
0 голосов
/ 24 февраля 2019

В настоящее время я пытаюсь реализовать многослойный автоэнкодер с использованием 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 и так далее, или как я это сделал?Второй - можете ли вы использовать разные оптимизаторы (в моем случае Адама) для разных слоев?Я хотел бы использовать SGD (стохастический градиентный спуск) для последнего слоя.Заранее спасибо!

1 Ответ

0 голосов
/ 24 февраля 2019

Вы должны делать это не так, как вы, а так, как вы описали это в вопросе.Также вы должны спуститься сначала, а затем снова вверх (например, 400, 100, 50, 25, 10, 25, 50, 100, 400) в гранулярных шагах.

Для второго вопроса ответ зависит от него.Вы могли бы сначала обучить модель с Адамом, а затем заморозить все, кроме последнего слоя, чтобы обучить этому дальше с SGD.Но вы не можете сказать Keras использовать разные классификаторы для разных слоев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...