我正在尝试通过简单数据过度拟合网络。我正在使用的数据是MNIST图像数据集,60000个训练图像,大小为784像素。
我想做的是一种相位检索的形式。我采用了MNIST数据集,并对它执行了2个变量傅立叶变换。这将60000 x 784实矩阵转换为60000 x 784复数矩阵。
最后,我取每个数字的绝对值,并将其放入一个新的60000 x 784实数矩阵,称为振幅,并且我还取每个数字的角度(或相位),并将其放入60000 by 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。你能好一点吗?我该如何改善呢?