首页 文章

预测取决于Keras的批量大小

提问于
浏览
8

我正在尝试使用keras进行图像的二进制分类 .

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

我用于预测的代码:

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

Figure 1

Figure 2

我的模特: -

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'])

1 回答

  • 5

    Keras在 predict 函数中自动标准化输入 . 标准化所需的统计数据是在批次上计算的 - 这就是您的输出可能取决于批量大小的原因 . 你可以解决这个问题:

    • 如果Keras> 1.0,您可以简单地在功能API中定义您的模型,并简单地将经过训练的函数应用于自标准化数据 .

    • 如果您对模型进行了培训 - 您可以将其恢复为Theano功能,并将其应用于自我标准化数据 .

    • 如果您的数据不是很大,您也可以简单地将批量大小设置为数据集中的示例数 .

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

    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 函数) .

    UPDATE 2: 为了使这个解决方案发生变化

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

    至:

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

相关问题