Python 需要fit_generator()的具体示例

Python 需要fit_generator()的具体示例,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,我正在制作一个语音识别模型,输入形状为5608822050,1,作为一个整体,它可以从一个5GB大小的.npy文件加载到内存中,但我想找到一个更好的方法。我遇到了keras fit_生成器方法,但大多数示例都基于mnist并使用ImageDataGenerator函数。我意识到我必须做一个定制的发电机功能,但我不确定如何做。根据线程,我引用了他的生成器函数来制作类似的东西,但是我仍然需要将整个数据加载到内存中,这需要很多时间。另外,我不确定这个程序是否会运行,因为在我运行它的前20分钟,它根本没

我正在制作一个语音识别模型,输入形状为5608822050,1,作为一个整体,它可以从一个5GB大小的.npy文件加载到内存中,但我想找到一个更好的方法。我遇到了keras fit_生成器方法,但大多数示例都基于mnist并使用ImageDataGenerator函数。我意识到我必须做一个定制的发电机功能,但我不确定如何做。根据线程,我引用了他的生成器函数来制作类似的东西,但是我仍然需要将整个数据加载到内存中,这需要很多时间。另外,我不确定这个程序是否会运行,因为在我运行它的前20分钟,它根本没有输出任何东西 还有别的出路吗

import librosa
import glob
import tensorflow as tf
import os
import numpy as np


class_list, X_train, Y_train = [],[],[]
filename = "D:\\SpeechRecognitionData\\train\\audio\\"

class_names = os.listdir(filename)
print(class_names)

for classes in class_names:
    if classes == '_background_noise_':
        continue
    else:
        class_list.append(''.join(filename+classes))

print(class_list,"\n",len(class_list))


def create_X(address):
    wave,sr = librosa.load(address)
    wave.reshape(-1,1)
    yield wave


def getLabel(filename):
    base_name = os.path.basename(filename)
    return base_name

def onehot(Y_train):
    from sklearn import preprocessing
    enc = preprocessing.OneHotEncoder()
    Y_train = Y_train.reshape(-1,1)
    enc.fit(Y_train)
    Y_train = enc.transform(Y_train).toarray()
    return Y_train


def execute(X_train, Y_train):
    loop = 0
    for i in class_list:
        c=0
        loop+=1
        for file in glob.glob("".join(i+"\\*.wav")): # iterating through each .wav audio file in the directory to create training data
            if np.array(list(create_X(file))).shape[0] == 22050:
                c+=1
                Y_train.append(class_names.index(getLabel(i)))
                X_train.append(create_X(file))
                if c%100==0:
                    print("{} files processed in loop {}".format(c,loop))

    while 1:
        for i in range(1558): # 36*1558 = 56088
            if i%125==0:
                print("i= "+str(i))
            yield np.array(X_train[i*36:(i+1)*36]).reshape(X_train.shape[0],X_train.shape[1],1), onehot(np.array(Y_train[i*36:(i+1)*36]))


input_shape = (22050,1)

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Conv1D(16,activation='relu',input_shape=input_shape,kernel_size=(10)))
model.add(tf.keras.layers.MaxPool1D())
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.Conv1D(32,activation='relu',kernel_size=(10)))
model.add(tf.keras.layers.MaxPool1D())
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.Conv1D(16,activation='relu',kernel_size=(10)))
model.add(tf.keras.layers.MaxPool1D())
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(128,activation='relu'))
model.add(tf.keras.layers.Dense(64,activation='relu'))
model.add(tf.keras.layers.Dense(30,activation='softmax'))

model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])
generator = execute(X_train,Y_train)
model.fit_generator(generator,steps_per_epoch=56088//36,shuffle=True)
model.save("model.h5")

所以我通过看这个例子就知道了-

如果有人遇到这个问题,他们可以参考我的笔记本


谢谢

通过链接,它完全符合您的要求require@SiddhantTandon我确实经历过这件事,但我不明白身份是什么。这是非常模糊的描述,我找不到任何其他文章使用这种方法。如果你能帮我解释一下这种方法背后的意图/逻辑,那就太好了。为了简单地解释ID,样本的索引存储为列表,用于训练和验证。而你的标签,它只是一个以键、索引和值为标签的dict。在代码中,我看到您可以一次性处理所有的.wav文件,并将其添加到列表中,然后从这个完整的列表中生成示例。为什么不尝试分批执行此操作,例如:将20个wave文件附加到列表中,并生成这20个已处理的样本?然后一直这样做直到所有的.wav文件都被使用?只要试着定期在for循环中执行yield操作即可。