Как я могу получить процент совпадения с керасом - PullRequest
0 голосов
/ 06 марта 2019

У меня есть моя модель и моя предвзятость, и когда я предсказываю свое изображение, я получаю вектор, подобный этому

[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)

Я пробовал с помощью функций Предикат (), Прогноз_проба (), но не сработал

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Вы должны использовать двоичный_кросентропию вместо категориального_кросентропии:

  • categoryorical_crossentropy используется для многоклассовых задач, т. Е. Выбирается один класс из множества для каждой выборки. Возвращает векторы чисел от 0 до 1, сумма которых равна 1.

  • binary_crossentropy используется для задач с несколькими метками, т. Е. Присваивает, возможно, более одной метки для каждой выборки. Возвращает вектор чисел, каждое от 0 до 1.

0 голосов
/ 06 марта 2019

Для каждого изображения, если верна только одна из 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].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...