однослойная сетка в керасе с imagedatagenerator, но потери всегда отрицательны - PullRequest
0 голосов
/ 21 января 2019

Я пробовал много видов сетей, но даже в базовой сети (однослойной) потери, которые устанавливаются как binary_crossentropy, всегда отрицательны

здесь код

from __future__ import print_function
import numpy as np
import keras
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D
import os
import cv2
from PIL import ImageFile

ImageFile.LOAD_TRUNCATED_IMAGES = True
train_path = 'D:/rectangle'
val_path = 'D:/rectang'

model = Sequential()
model.add(Conv2D(32, 1, 1, input_shape=(230, 230, 3)))
model.add(Flatten())
model.add(Dense(64))
model.add(Dropout(0.5))
model.add(Dense(1))

model.compile(loss='binary_crossentropy',
          optimizer='rmsprop',
          metrics=['accuracy'])

train_datagen = ImageDataGenerator(
            samplewise_center=True,
            samplewise_std_normalization=True)
test_datagen = ImageDataGenerator()

train_generator = train_datagen.flow_from_directory(
    train_path,
    target_size=(230, 230),
    batch_size=32,
    class_mode='binary')
validation_generator = test_datagen.flow_from_directory(
    val_path,
    target_size=(230, 230),
    batch_size=32,
    class_mode='binary')

model.fit_generator(
    train_generator,
    steps_per_epoch=200,
    epochs=50,
    validation_data=validation_generator,
    nb_val_samples=800
)

здесьобработка: 1/200 [..............................] - ETA: 20:17 - убыток: 12.9030 - в соотв.: 0.1250 2/200 [..............................] - ETA: 10:22 - убыток: -2.0179 - в соотв.: 0,0625 3/200 [..............................] - ETA: 7:03 - потери: -6,3273 - в соотв.: 0,0417 4/200 [..............................] - ETA: 5:23 - потери: -7,8592 - в соотв.: 0,0312 5/200 [..............................] - ETA: 4:24 - убыток: -8,6776 - акк: 0,0250 6/200 [..............................] - ETA: 3:44 - потери: -9,5563 - в соотв.: 0,0208 7/200 [> .............................] - ETA: 3:15 - убыток: -9,3298 - в соотв.: 0,0179 8/200 [> .............................] - ETA: 2:54 - потери: -9,3455 - в соотв.: 0,0156 9/200 [> .............................] - ETA: 2:37 - убыток: -10.2439 - в соотв.: 0,0139 10/200 [> .............................] - ETA: 2:24 - потери: -10.5647 - согласно: 0,0125 11/200 [> .............................] - ETA: 2:13 - потеря: -10,8719 - в соответствии с 0,0114 12/200 [> .............................] - ETA: 2:04 - потери: -11,3775 - согласно: 0,0104 13/200 [> .............................] - ETA: 1:56 - потери: -11.3066 - согласно: 0,0096 14/200 [=> ............................] - ETA: 1:49 - потери: -11,4598 - согласно: 0,0089 15/200 [=> ............................] - ETA: 1:48 - потери: -11,4930 - в соответствии с 0,0083 16/200 [=> ............................] - ETA: 1:47 - потери: -11,6465 - согласно: 0,0078 17/200 [=> ............................] - ETA: 1:51 - потери: -11.6061 - согласно: 0,0074

входное изображение - это фотография гистологических изображений рака молочной железы, с размером 460 * 460 и 20000 фото в формате PNG.Буду признателен, если это будет решено!

1 Ответ

0 голосов
/ 21 января 2019

Поскольку вы выполняете двоичную классификацию (исходя из вашей потери), ваша последняя функция активации должна быть сигмовидной.Таким образом, вместо

model.add(Dense(1))

ваш последний слой должен выглядеть следующим образом:

model.add(Dense(1,activation='sigmoid'))

Без указания этого, ваша активация будет просто линейнойпо умолчанию, который соответствует регрессии senario, а не классификации.

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