我如何获得与keras巧合的百分比

时间:2019-03-06 05:30:54

标签: python tensorflow keras

我有我的模型和偏见,当我预测图像时,我会得到一个像这样的向量

[0,0,0,1]

我需要这样的东西

[。48,.52,.08,.97]

我的训练代码是:

entrenamiento_datagen = ImageDataGenerator(
rescale=1. / 255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)

test_datagen = ImageDataGenerator(rescale=1. / 255)

entrenamiento_generador = entrenamiento_datagen.flow_from_directory(
data_entrenamiento,
target_size=(altura, longitud),
batch_size=batch_size,
class_mode='categorical')

validacion_generador = test_datagen.flow_from_directory(
data_validacion,
target_size=(altura, longitud),
batch_size=batch_size,
class_mode='categorical')

cnn = Sequential()
cnn.add(Convolution2D(filtrosConv1, tamano_filtro1, padding ="same",input_shape=(longitud, altura, 3), activation='relu'))
cnn.add(MaxPooling2D(pool_size=tamano_pool))

cnn.add(Convolution2D(filtrosConv2, tamano_filtro2, padding ="same"))
cnn.add(MaxPooling2D(pool_size=tamano_pool))

cnn.add(Flatten())
cnn.add(Dense(256, activation='relu'))
cnn.add(Dropout(0.5))
cnn.add(Dense(clases, activation='sigmoid'))

cnn.compile(loss='categorical_crossentropy',
        optimizer=optimizers.Adam(lr=lr),
        metrics=['accuracy'])

我的分类代码是:

ongitud, altura = 150, 150
modelo = './modelo/modelo.h5'
pesos_modelo = './modelo/pesos.h5'
with CustomObjectScope({'GlorotUniform': glorot_uniform()}):
cnn = load_model(modelo)
cnn.load_weights(pesos_modelo)

def predict(file):
  x = load_img(file, target_size=(longitud, altura))
  x = img_to_array(x)
  x = np.expand_dims(x, axis=0)
  array = cnn.predict_proba(x[0:1])
  print(array)

我尝试过使用predict(),predict_proba(),但没有用

2 个答案:

答案 0 :(得分:1)

您应该使用binary_crossentropy而不是categorical_crossentropy:

  • categorical_crossentropy用于解决多类别问题,即为每个样本从多个类别中选择一个类别。它返回一个介于0和1之间的数字向量,这些向量的总和为1。

  • binary_crossentropy用于解决多标签问题,即为每个样本分配可能多于一个的标签。它返回一个数字向量,每个数字在0到1之间。

答案 1 :(得分:0)

对于每个图像,如果4个标签中只有一个是正确的(类似于ImageNet),则最后一层的激活应为softmax。

cnn.add(Dense(clases, activation='softmax'))

这样,概率总和将等于1,您可以选择概率最高的类别。例如这是使用cnn.predict()或cnn.predict_proba()的输出(两者都是相同的)。

[0.09843186 0.613065 0.19164166 0.09686147]

cnn.predict_classes()将给出类,在这种情况下为[1]。