Попытка превзойти простую нейронную сеть - PullRequest
1 голос
/ 12 мая 2019

Я пытаюсь перегрузить сеть поверх простых данных. Данные, с которыми я работаю, - это набор данных изображений MNIST, 60000 обучающих изображений размером 784 пикселя.

То, что я хочу сделать, это форма поиска фазы. Я взял набор данных MNIST и выполнил 2 переменных преобразования Фурье. Это преобразовало реальную матрицу 60000 на 784 в комплексную матрицу 60000 на 784.

Наконец, я взял абсолютное значение каждого числа и поместил его в новую действительную матрицу 60000 на 784, называемую амплитудами, а также взял угол (или фазу) каждого числа и поместил его в 60000: 784 матрица действительных чисел, называемая фазами.

Цель состоит в том, чтобы предсказать фазы с учетом амплитуд.

это чрезвычайно простой код

from keras.models import Sequential
from keras.layers import Dense
import numpy as np

def normalize_angles(phases):
    phases = phases + np.pi
    phases /= (2 * np.pi)
    return phases

def build_fourier_mnist():
    mnist = np.load("train_features.npy") #MNIST as is.
    fourier_mnist = np.zeros(mnist.shape, dtype=np.complex)
    for i in range(mnist.shape[0]):
        current_image = np.reshape(mnist[i, :], (28, 28)) #Turn to matrix so we can perform 2d fft
        fourier_current_image = np.fft.fft2(current_image) #perform 2d fft
        fourier_mnist[i, :] = np.reshape(fourier_current_image,(1, 784)) #flatten and save to new matrix
    return fourier_mnist

fourier_mnist = build_fourier_mnist()
amplitudes = np.abs(fourier_mnist)
phases = normalize_angles(np.angle(fourier_mnist))

model = Sequential()
model.add(Dense(784, input_dim=amplitudes.shape[1], activation='sigmoid'))
model.add(Dense(784, activation='sigmoid'))
model.add(Dense(784, activation='sigmoid'))
model.add(Dense(784, activation='sigmoid'))
model.add(Dense(phases.shape[1], activation='sigmoid'))
#Compile model
model.compile(loss='mean_squared_error', optimizer='adam')
#Fit the model
model.fit(amplitudes, phases, epochs=400, batch_size=100)
model.save("phase_retriever2.h5")

Он «работает» в том смысле, что дает довольно неплохой результат, но я стараюсь его превзойти. Лучшая ошибка тренировки была около 0,083. Вы можете стать лучше? Как я могу улучшить это?

...