【问题标题】:How to properly setup a data set for training a Keras model如何正确设置数据集以训练 Keras 模型
【发布时间】:2020-06-23 12:28:37
【问题描述】:

我正在尝试使用简单的 Keras 顺序模型创建用于音频识别的数据集。

这是我用来创建模型的函数:

def dnn_model(input_shape, output_shape):
    model = keras.Sequential()
    model.add(keras.Input(input_shape))
    model.add(layers.Flatten())
    model.add(layers.Dense(512, activation = "relu"))
    model.add(layers.Dense(output_shape, activation = "softmax"))
    model.compile(  optimizer='adam',
                    loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True), 
                    metrics=['acc'])

    model.summary()
    
    return model

我正在使用这个 Generator 函数生成我的训练数据:

def generator(x_dirs, y_dirs, hmm, sampling_rate, parameters):
    window_size_samples = tools.sec_to_samples(parameters['window_size'], sampling_rate)    
    window_size_samples = 2**tools.next_pow2(window_size_samples) 
    hop_size_samples = tools.sec_to_samples(parameters['hop_size'],sampling_rate)

    for i in range(len(x_dirs)):
        features  = fe.compute_features_with_context(x_dirs[i],**parameters)
        praat = tools.praat_file_to_target( y_dirs[i],
                                            sampling_rate,
                                            window_size_samples,
                                            hop_size_samples,
                                            hmm)
        yield features,praat

变量x_dirsy_dirs 包含标签和音频文件的路径列表。我总共有 8623 个文件来训练我的模型。这就是我训练模型的方式:

def train_model(model, model_dir, x_dirs, y_dirs, hmm, sampling_rate, parameters, steps_per_epoch=10,epochs=10):

    model.fit((generator(x_dirs, y_dirs, hmm, sampling_rate, parameters)),
                            epochs=epochs,
                            batch_size=steps_per_epoch)
    return model

我现在的问题是,如果我传递所有 8623 文件,它将在第一个 epoch 中使用所有 8623 文件来训练模型,并在第一个 epoch 之后抱怨它需要 steps_per_epoch * epochs 批次来训练模型。

我只用切片列表的 8623 个文件中的 10 个对此进行了测试,但 Tensorflow 抱怨说需要 100 个批次。

那么我如何让我的生成器产生最有效的数据?我一直认为steps_per_epoch 只是限制了每个 epoch 接收的数据。

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    fit 函数会耗尽你的生成器,也就是说,一旦它产生了你所有的 8623 批次,它就不能再产生批次了。

    你想这样解决问题:

    def generator(x_dirs, y_dirs, hmm, sampling_rate, parameters, epochs=1):
        for epoch in range(epochs):  # or while True:
            window_size_samples = tools.sec_to_samples(parameters['window_size'], sampling_rate)    
            window_size_samples = 2**tools.next_pow2(window_size_samples) 
            hop_size_samples = tools.sec_to_samples(parameters['hop_size'],sampling_rate)
            
            for i in range(len(x_dirs)):
                features  = fe.compute_features_with_context(x_dirs[i],**parameters)
                praat = tools.praat_file_to_target( y_dirs[i],
                                                    sampling_rate,
                                                    window_size_samples,
                                                    hop_size_samples,
                                                    hmm)
                yield features,praat
    

    【讨论】:

    • 我只是用 10 和 while True: 的列表对其进行了测试,因为我无法更改方法采用的参数。拟合将超出 10 个数据集,我觉得要永远继续下去?
    • 这是你的 steps_per_epoch 干预的地方:fit 方法将在通过 steps_per_epoch 批次后停止每个时期
    • 天哪。我觉得我有一个非常糟糕的错字。我有batches = step_per_epoch
    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    相关资源
    最近更新 更多