我试图使用带有keras的python-generators来动态生成训练数据集,这样我就可以在线实现数据增强,而且我的功能也更加灵活,因为我不喜欢#39;我需要为我的整个数据集重新计算它们,但似乎我无法使它工作,事实上如果我使用我的预计算功能(保存在.hdf5上)或使用我的生成器训练模型我得到不同的结果:第一个正常训练并提高准确度,另一个不能增加超过8-10%,因为我有12个等级,这似乎是随机选择。
我已经验证了生成器生成与.hdf5文件完全相同的数据,有什么建议吗?
class mfscGenerator(keras.utils.Sequence):
def __init__( self, lst, labels, batch_size = 64, freq=16000, nmels=13, fmin= 20.0, fmax=8000, frame_size=512, hop_size=256):
assert len(lst) == labels.shape[0]
self.lst = []
for i in range (len(lst)):
self.lst.append((lst[i], labels[i,:]))
self.batch_size = batch_size
self.freq=freq
self.frame_size=frame_size
self.hop_size = hop_size
self.nmels=nmels
self.fmin=fmin
self.fmax=fmax
self.mel_fb=librosa.filters.mel(sr=freq, n_fft=frame_size, n_mels=nmels, fmin=fmin, fmax=fmax, norm=None)
def __len__(self):
return math.ceil( 1. * len( self.lst )/self.batch_size)
def __getitem__(self, idx):
sample_lst = self.lst[ idx * self.batch_size : (idx + 1) * self.batch_size]
mfsc = []
label = []
for i, keyword in enumerate(sample_lst):
###########LOAD FILES#######################################
y, fs = librosa.load(keyword[0], sr=self.freq)
y = np.pad(y, (0, 1*fs - y.shape[0]), 'constant', constant_values=0)
###########DATA AUGMENTATIONs on WAVE HERE############################
if(random.random()<=0.4 and keyword.find("clip")==-1):
index=random.randrange(0, len(db.sounds),1)
bg_slice, fs = librosa.load(db.DB+db.sounds[index], sr=self.freq, duration=1.0, offset=np.random.uniform(0.0, 59.0))
y= y*np.random.uniform(0.8, 1.2) + bg_slice*np.random.uniform(0.05, 0.1)
###########GENERATE FEATUERS HERE###############################
spctr= np.abs(librosa.core.stft(y, n_fft=self.frame_size, hop_length=self.hop_size))**2 #power spectrogram
mfsc.append(librosa.core.amplitude_to_db(np.dot(self.mel_fb, spctr)))
label.append(keyword[1])
mfsc =np.transpose(np.asarray(mfsc),(0,2,1))
return np.reshape(mfsc, (mfsc.shape[0], mfsc.shape[1], mfsc.shape[2], 1)), np.asarray(label)
def on_epoch_end(self):
pass
我正在使用此调用使其正常工作:
myGen = mfscGenerator(lst=train_lst, labels=train_label, batch_size = batch_size, freq=16000, nmels=13, fmin= 20.0, fmax=8000, frame_size=512, hop_size=256)
history= model.fit_generator( myGen, len(train_lst)//batch_size, epochs=3, verbose=1, validation_data=(fv_val, label_val), max_queue_size=32, workers=1, use_multiprocessing=True, initial_epoch=0)
label是一个带有shape(n,12)的np数组,lst是一个长度为n的文件名列表。