Python Conv2D模型的训练[MNIST数据集]

Python Conv2D模型的训练[MNIST数据集],python,machine-learning,keras,generator,mnist,Python,Machine Learning,Keras,Generator,Mnist,作为一个更大项目的一部分,我正在编写一个小的卷积2D模型来训练数据集上的神经网络 我的经典工作流程如下: def train(model, X_train, y_train, X_val, y_val): model.fit_generator( generator=get_next_batch(X_train, y_train), steps_per_epoch=200, epochs=EPOCHS, validation

作为一个更大项目的一部分,我正在编写一个小的卷积2D模型来训练数据集上的神经网络

我的经典工作流程如下:

def train(model, X_train, y_train, X_val, y_val):
    model.fit_generator(
        generator=get_next_batch(X_train, y_train),
        steps_per_epoch=200,
        epochs=EPOCHS,
        validation_data=get_next_batch(X_val, y_val),
        validation_steps=len(X_val)
    )

    return model
加载数据集并将其转换为np数组 将数据集拆分为训练集和验证集 重塑X列。重塑X列形状[0],28,28,1和1对keras.utils.to_categoricaly_列进行编码,10 获取模型 根据数据进行培训,并保存 我的列车功能定义如下:

def train(model, X_train, y_train, X_val, y_val):
    model.fit_generator(
        generator=get_next_batch(X_train, y_train),
        steps_per_epoch=200,
        epochs=EPOCHS,
        validation_data=get_next_batch(X_val, y_val),
        validation_steps=len(X_val)
    )

    return model
我使用的发电机:

def get_next_batch(X, y):
    # Will contains images and labels
    X_batch = np.zeros((BATCH_SIZE, 28, 28, 1))
    y_batch = np.zeros((BATCH_SIZE, 10))

    while True:
        for i in range(0, BATCH_SIZE):
            random_index = np.random.randint(len(X))
            X_batch[i] = X[random_index]
            y_batch[i] = y[random_index]
        yield X_batch, y_batch
现在,它正在训练,但它在最后几步挂起:

Using TensorFlow backend.
Epoch 1/3
2018-04-18 19:25:08.170609: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
199/200 [============================>.] - ETA: 0s - loss: 
如果我不使用任何发电机:

def train(model, X_train, y_train, X_val, y_val):
    model.fit(
        X_train,
        y_train,
        batch_size=BATCH_SIZE,
        epochs=EPOCHS,
        verbose=1,
        validation_data=(X_val, y_val)
    )

    return model
它工作得很好

显然,我的方法get_next_batch做错了什么,但我不知道为什么


欢迎任何帮助

问题在于,您正在生成器函数中创建一个庞大的验证集。看看这些参数在哪里传递

    validation_data=get_next_batch(X_val, y_val),
    validation_steps=len(X_val)
假设您的批量大小为1000。因此,您正在提取1000个图像,并在其中运行1000次


因此,1000 x 1000=1000000。这是多少图像将通过您的网络运行,这将需要很长时间。您可以将步骤更改为注释中提到的静态数字,我只是认为解释有助于正确理解。

我不认为它卡住了,您只是没有给它足够的时间来检查整个验证集。试着设置validation_steps=2,看看你是否能通过这个阶段。你完全正确。验证步骤的最佳价值是什么?命名随Keras2而改变,但我不知道ot是否与nb_val_样本具有相同的含义。默认过程包括整个验证步骤。与训练集相比,您的验证集有多大?80%训练集48000、10和20%验证集12000、10。您可以耐心等待,或者可能将它们设置为验证集大小的一半。我认为6000张图像应该足以让您获得一个历元一个历元的估计,以了解模型的进度。