预测取决于 Keras 中的批量大小

Posted

技术标签:

【中文标题】预测取决于 Keras 中的批量大小【英文标题】:Prediction is depending on the batch size in Keras 【发布时间】:2016-09-22 14:53:41 【问题描述】:

我正在尝试使用 keras 对图像进行二元分类。

我的 CNN 模型在训练数据上得到了很好的训练(提供了 ~90% 的训练准确率和 ~93% 的验证准确率)。但是在训练期间,如果我设置批量大小=15000,我会得到图 I 输出,如果我设置批量大小=50000,我会得到图 II 作为输出。有人可以告诉我出了什么问题吗?预测不应该取决于批量大小,对吧?

我用于预测的代码:

y=model.predict_classes(patches, batch_size=50000,verbose=1) y=y.reshape((256,256))

我的模型:-

model = Sequential()

model.add(Convolution2D(32, 3, 3, border_mode='same',
                        input_shape=(img_channels, img_rows, img_cols)))
model.add(Activation('relu'))
model.add(Convolution2D(32, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Convolution2D(64, 3, 3, border_mode='same'))
model.add(Activation('relu'))
model.add(Convolution2D(64, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))

# let's train the model using SGD + momentum (how original).
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
              optimizer=sgd,
              metrics=['accuracy'])

【问题讨论】:

实际上似乎预测大小很重要并影响结果。检查 kares 代码:github.com/fchollet/keras/blob/master/keras/engine/training.py [第 818 行] github.com/fchollet/keras/blob/master/keras/models.py [第 548 行] 那么,有什么解决办法吗? :( 神经网络的解决方案与以往一样:尝试不同的设置并进行比较。另见http://svail.github.io/rnn_perf/,第 5.1 节 没错!尝试找到适合批量大小的值,您也可以尝试默认值 32 对于训练,我可以理解batch size对准确率有一定影响。但是预测应该取决于批量大小? 【参考方案1】:

Keras 在 predict 函数中自动标准化输入。标准化所需的统计数据是按批次计算的 - 这就是您的输出可能取决于批次大小的原因。您可以通过以下方式解决此问题:

    如果 Keras > 1.0,您可以简单地在函数式 API 中定义您的模型,然后简单地将经过训练的函数应用于自标准化数据。 如果您对模型进行了训练 - 您可以将其恢复为 Theano 函数,并将其应用于自标准化数据。 如果您的数据不是很大,您也可以简单地将批量大小设置为数据集中的示例数。

更新:这是第二个解决方案的代码:

import theano

input = model.layers[0].input # Gets input Theano tensor
output = model.layers[-1].output # Gets output Theano tensor
model_theano = theano.function(input, output) # Compiling theano function 

# Now model_theano is a function which behaves exactly like your classifier 

predicted_score = model_theano(example) # returns predicted_score for an example argument

现在,如果您想使用这个新的theano_model,您应该自行标准化主数据集(例如,通过减去平均值并除以图像中每个像素的标准差)并应用theano_model 以获得整个数据集的分数(您可以在循环中迭代示例或使用numpy.apply_along_axisnumpy.apply_over_axes 函数来执行此操作)。

更新 2: 为了使这个解决方案工作改变

model.add(Dense(nb_classes))
model.add(Activation('softmax'))

到:

model.add(Dense(nb_classes, activation = "softmax"))

【讨论】:

首先,我的数据集太大而无法放入 GPU。你能告诉我更多关于第二点的信息吗? 很抱歉打扰您,但我只是一个初学者。您能否评论代码,以便我了解发生了什么?我可以批量发送补丁吗? 'AttributeError: 'Activation' object has no attribute 'output'' - 收到此错误。有指针吗? 请发布您的代码并定义模型 - 这会更容易:) 添加到我的问题中!【参考方案2】:

我有类似的问题,我认为它与 GPU 的不确定性有关 - 在 CPU 上结果是相同的,而在 GPU(RTX 2080Ti 和 RTX 3090)上却不是。我无法解决它(使用 GPU 的确定性选项不起作用)。

【讨论】:

以上是关于预测取决于 Keras 中的批量大小的主要内容,如果未能解决你的问题,请参考以下文章

在 Keras 中拟合模型时,批量大小和 epoch 数应该有多大?

禁用 Keras 批量标准化/标准化

Keras 中的损失函数和批量大小

预测Keras中的类 - IndexError:索引196超出了轴0的大小为196的范围

制作自定义 Keras 层时不能使用未知的输入尺寸(批量大小)

keras中不同批量大小的损失计算