我一直在与CNN玩耍,以尝试从相对较大的图像中消除相干噪声。由于图像很大,因此无法一次将太多图像加载到内存中。 图片尺寸:1500x250 。由于这个问题,我试图实现一个生成器,将图像馈送到网络。我一直在努力获得不好的结果,但是假设问题出在网络的什么地方。我尝试将fit()与我的部分数据结合使用,并且在不对网络进行任何操作的情况下获得了非常好的结果。在同一子集上测试生成器会导致不良结果。我看不到的收获是什么?为什么我的发电机发生故障?
我的数据集大约有11.4万张图像,大约是475 GB,因此可以解释为什么我无法一次将所有图像都加载到内存中。我得到结果,它们是重新创建图像的实际结果,但是它们非常糟糕。我的生成器类在这里:
class genOne(k.utils.Sequence):
def __init__(self, img_rows, img_cols, channels, batch_size, clean_dir,
noisy_dir, clean_files, noisy_files, shuffle=True):
"""Initialize variables:
img_rows, img_cols, channels: the shape of the image
batch_size : Self explanatory
clean_dir, noisy_dir : directories with files
clean_files : Randomized list with clean images
noisy_file : Randomized list with noise"""
self.img_rows = img_rows
self.img_cols = img_cols
self.channels = channels
self.batch_size = batch_size
self.clean_dir = clean_dir
self.noisy_dir = noisy_dir
self.clean_files = clean_files.tolist()
self.noisy_files = noisy_files.tolist()
self.shuffled_noisy = []
self.tmp_noisy = []
self.tmp_clean = []
self.shuffle = shuffle
self.on_epoch_end()
def __len__(self):
"""Sets the number of batches per epoch"""
return floor((len(self.noisy_files)*len(self.clean_files))/self.batch_size)
def __getitem__(self, index):
"""Generates data for each batch
combine every type of noise with each image."""
X = np.empty((self.batch_size, self.img_rows, self.img_cols,
self.channels))
Y = np.zeros((self.batch_size, self.img_rows, self.img_cols,
self.channels))
for i in range(self.batch_size):
if not self.tmp_noisy:
self.tmp_noisy = self.shuffled_noisy
self.tmp_clean.pop(0)
x_test = self.tmp_noisy.pop(0)
X[i,] = np.expand_dims(np.load(self.noisy_dir + x_test).T[
:self.img_rows,:self.img_cols],-1)
Y[i,] = np.expand_dims(np.load(self.clean_dir + self.tmp_clean[0
]).T[:self.img_rows, :self.img_cols],-1)
y_test = self.tmp_clean[0]
# Input equals ground truth + noise
X[i,] += Y[i,]
# Normalize data between 0 and 1
X[i,] = ((X[i,]/np.amax(np.absolute(X[i,])))+1)/2
Y[i,] = ((Y[i,]/np.amax(np.absolute(Y[i,])))+1)/2
return X, Y
def on_epoch_end(self):
"""Refresh all data on epoch end"""
self.tmp_noisy = self.noisy_files
self.tmp_clean = self.clean_files
if self.shuffle == True:
np.random.shuffle(self.tmp_noisy)
np.random.shuffle(self.tmp_clean)
self.shuffled_noisy = self.tmp_noisy
我有475张清晰的图像和300张包含纯噪点的图像。我将它们组合在一起,以便将每种图像与每种类型的噪声一起馈入网络。使用fit()的小情况就是300张图像,其中每个图像都是具有不同噪声的不同干净图像。
我知道我的驱动程序版本很旧,这需要一个旧版本的tensorflow。我无法更新它,所以我陷入了tensorflow 1.4.1。
规格: