【问题标题】:Why can I provide batchsize in tf.Model.fit()为什么我可以在 tf.Model.fit() 中提供 batchsize
【发布时间】:2021-05-07 07:55:50
【问题描述】:

我对@9​​87654321@的文档有点困惑

上面写着:

batch_size:整数或无。每次梯度更新的样本数。如果未指定,batch_size 将默认为 32。如果您的数据是数据集、生成器或 keras.utils.Sequence 实例的形式(因为它们会生成批次),请不要指定 batch_size。

我想,当我训练(或预测)我的模型时,我必须提供一些数据,而且我必须分批进行。

例如,如果我的神经网络的输入大小是 (2),那么我可以给出:

inputs = np.ones((1,2))
my_model.fit(inputs, target_output)

#or this:
inputs = np.ones((10,2))
my_model.fit(inputs, target_output)

#but never this:
inputs = np.ones((2))
my_model.fit(inputs, target_output)

我的问题:

所以当我调用my_model.fit() 时,如果我在调用中提供的批处理已经具有定义的大小,为什么我还想另外提供batch_size?

编辑:我已经考虑过了。如果inputs 是我放入my_model.fit() 的数据,假设它包含1000 个示例,那么我是否可以指定在这1000 个示例中我只想使用100 个(随机?)示例进行设置batch_size=100 的训练?如果这是真的,我为什么不事先提取样本,而只将样本提供给my_model.fit()

方便吗?

Edit2:我已经知道,我需要为批量大小增加额外的维度,正如 this question 中所回答的那样。

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    为了更好地概括学习,网络将查看您“批量”提供的样本。这与您的整个数据集不同。如果您总共有 1000 个样本且批量大小为 100,则网络将对 100 个样本进行前向传播,然后基于这 100 个样本进行反向传播,然后对接下来的 100 个样本进行前向传播。如果没有这个,网络将进行前向传播,然后反向传播每个单独的样本,或者一次反向传播所有样本。对每个单独的样本进行反向传播会使网络对每个样本过于敏感——您希望它根据所有样本共有的特征和模式进行学习。

    然后,您的批量大小是一个有价值的超参数,可用于调整模型的学习方式。您可以通过增加批量大小来鼓励更多的泛化,或者通过减少批量大小来鼓励更多的专业化。当您拟合模型时,您会说“这是我所有的训练数据”,然后说“一次查看 64 个样本”

    【讨论】:

    • 哦,有道理。嗯,这意味着,我对批处理的工作原理有完全错误的理解。谢谢你的回答!
    【解决方案2】:

    我们使用批量大小的原因之一是我们可能有一个大数据集,如果我们使用 None,我们的内存空间无论是在 GPU 还是主内存上都无法容纳它们。
    现在,如果您使用 CNN 模型的摘要,您会看到每个输入张量都有一个形状

    (None,height,width,channel)
    

    这意味着,根据您的批量大小,如果您有这样的矩阵,模型将放置相关数量的图像而不是 无,基于此

    a = tf.ones((120,120,3))
    

    然后你输入形状

    (None,120,120,3)
    

    有很多方法可以通过模型传递它,在这样做的过程中,在轴 0 上扩展你的维度

    a = tf.expand_dims(a,axis=0)
    

    然后,你的形状会

    print(a.shape())
    (1,120,120,3)
    

    最后,你通过猫或将它安装在模型上。

    【讨论】:

    • 对不起,但这完全不能回答我的问题。我不认为你理解我的问题。我会尽量让它更精确。
    猜你喜欢
    • 2020-08-19
    • 2012-04-12
    • 2011-05-25
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2020-11-19
    相关资源
    最近更新 更多