使用序列的Keras数据生成器

时间:2018-02-28 12:04:51

标签: python-3.x keras sequence

我试图使用带有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的文件名列表。

0 个答案:

没有答案