为什么我的Keras模型仅在1407个训练实例上训练而不是在45k训练实例上训练?

时间:2020-09-28 19:53:12

标签: python tensorflow machine-learning keras data-science

Epoch 2/100
**1407/1407** [==============================] - 17s 12ms/step - loss: 1.9419 - accuracy: 0.2907 - val_loss: 2.1100 - val_accuracy: 0.2406
Epoch 3/100

出于某种奇怪的原因,它说它仅在1407个实例上进行训练,即使我传递的训练数据的形状为45k

x_train.shape
=> (45000, 32, 32, 3)

1 个答案:

答案 0 :(得分:4)

数字1407不指样本数,而是指每个时期的步骤。例如,假设您有1000个训练样本。如果将batch_size = 100设置为100,则每个纪元需要花费10个步骤来遍历整个数据集。如果未指定batch_size模型,fit会将其默认设置为32。45000/32 = 1406.25,因此将其舍入为1407。1407 X 32 = 45024,因此对于每个时期,您都要遍历整个训练集一次,外加24个额外样本。对于验证数据,最好每个时期仅通过一次验证集。因此,请尝试选择验证批处理大小,以使validation_samples / validation_batch_size为整数,然后在model.fit中将其指定为validation_steps的值。这是一个方便的小函数,它将确定最大的可用批处理大小和步骤数,其中length是数据集中的样本数,b_max是根据内存容量允许的最大批处理大小。

def get_bs(length,b_max):
    batch_size=sorted([int(length/n) for n in range(1,length+1) if length % n ==0 and length/n<=b_max],reverse=True)[0]  
    return batch_size,int(length/batch_size)
# example
batch_size, steps=get_bs(1000, 80)
print (batch_size, steps)
# results in  batch_size=50 and steps=20

该函数还可用于确定length是否为质数,因为只要使b_max = length-1,batch_size就会返回1。