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

时间:2018-04-18 17:39:05

标签: python machine-learning keras generator mnist

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

我的(经典)工作流程如下:

  1. 加载数据集并将其转换为np array
  2. 将数据集拆分为培训和验证集
  3. 重塑(X_train.reshape(X.shape[0], 28, 28, 1))和one_hot_encode(keras.utils.to_categorical(y_train, 10)
  4. 获取模型
  5. 根据数据训练并保存
  6. 我的火车功能定义如下:

    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做错了,但我无法弄清楚原因。

    任何帮助都会受到欢迎!

1 个答案:

答案 0 :(得分:1)

问题是您在生成器函数中创建了一个巨大的验证集。看看传递这些参数的地方......

    validation_data=get_next_batch(X_val, y_val),
    validation_steps=len(X_val)

假设您的BATCH_SIZE为1,000。所以你要拉1000张图像,然后运行1000次。

所以1,000 x 1,000 = 1,000,000。这是通过您的网络运行的图像数量,这需要很长时间。您可以将步骤更改为注释中提到的静态数字,我只是认为解释会有助于将其放在透视中。