当前位置: 首页 > 知识库问答 >
问题:

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

缪远
2023-03-14

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

我的CNN模型对训练数据进行了良好的训练(训练准确率约为90%,验证准确率约为93%)。但在培训期间,如果我将批量大小设置为15000,则得到图I输出,如果我将批量大小设置为50000,则得到图II输出。有人能告诉我怎么了吗?预测不应该取决于批量大小,对吗?

我用于预测的代码:

y=model.predict_classes(补丁,batch_size=50000,详细=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'])

共有2个答案

张承颜
2023-03-14

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

商弘义
2023-03-14

Keras在预测功能中自动标准化输入。标准化所需的统计数据是在一个批次上计算的,这就是为什么您的输出可能取决于批次大小。您可以通过以下方式解决此问题:

  1. 如果Keras

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

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

现在,如果您想使用这个新的NO\U模型,您应该自己标准化主数据集(例如,通过减去图像中每个像素的平均值并除以标准偏差),然后应用NO\U模型来获得整个数据集的分数(您可以在循环中迭代示例或使用numpy。沿\u轴应用\unumpy。沿\u轴应用\u函数来执行此操作)。

更新2:为了使此解决方案生效,请进行更改

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

收件人:

model.add(Dense(nb_classes, activation = "softmax"))
 类似资料:
  • 问题内容: 我遵循了这个很棒的教程,并成功地在CloudML上训练了一个模型。我的代码还离线进行预测,但是现在我正在尝试使用Cloud ML进行预测并遇到一些问题。 为了部署我的模型,我遵循了本教程。现在,我有一个生成via的代码,并且我想对此进行预测。为此,我关注本文,我的命令如下所示: 但是我只有错误: 看起来它期望数据采用不同的格式。我在这里找到了JSON的格式规范,但找不到如何使用TFre

  • 我在日志中收到以下警告: WARN[本机传输请求:17058]2014-07-29 13:58:33776 BatchStatement。[keyspace.tablex]的java(第223行)批准备语句的大小为10924,超过了指定的阈值5120乘以5804。 有没有办法在Spring数据卡桑德拉指定大小? Cassandra 2.0.9和spring数据Cassandra 1.0.0-REL

  • 我最近一直在学习LMAX干扰器,并在做一些实验。令我困惑的一件事是EventHandler的onEvent处理程序方法的endOfBatch参数。考虑我的以下代码。首先,我调用的伪消息和使用者类Test1和Test1Worker: 请注意,我设置了500毫秒的延迟,以替代一些实际工作。我还在控制台中打印 然后我的驱动程序类(作为生产者)被称为DisruptrTest: 在这里,在初始化所需的内容之

  • 问题陈述 我在带标记的文本序列上训练keras中的多对多LSTM,使用预训练的GloVe嵌入来预测序列中每个元素的标记。我的训练机制包括小批量随机梯度下降,每个小批量矩阵都在列上添加了零填充,以确保输入到网络的长度相等。 关键的是,由于任务和数据的性质对我的小批量的自定义限制,我没有使用keras嵌入层。我的目标是为我的零填充单元实现掩蔽机制,以确保损失计算不会错误地将这些单元视为真正的数据点。

  • 有没有办法为Spring的NamedParameterJdbcTemplate对象设置批处理大小? 在我的项目中,我遇到了一些OutOfMemory问题,但我能够通过在一个较小的块循环中调用NamedParameterJdbcTemplate来解决它。但这需要一些额外的努力,比如确定块大小,将一个大列表拆分成更小的子列表等等。 我想知道NamedParameterJdbcTemplate是否有这样

  • 如何使目标“包”依赖于目标“测试”? 这里有一个解决方案:强制sbt 0.11运行测试,但它实际上不适用于xsbt web插件。