CNN - как я могу правильно получить val_loss и val_acc, используя керасы? - PullRequest
0 голосов
/ 27 февраля 2019

Микроскопические изображения имеют формат .tif и имеют следующие характеристики:

  • Цветовая модель: R (ed) G (reen) B (lue)
  • Размер: 2048 x1536 пикселей
  • Масштаб пиксела: 0,42 мкм x 0,42 мкм
  • Объем памяти: 10-20 МБ (прибл.)
  • Тип этикетки: по изображению
  • 4 класс: доброкачественный, инвазивный, в Ситу, обычный

CNN код:

from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense


classifier = Sequential()


classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Conv2D(32, (3, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Flatten())


classifier.add(Dense(activation = 'relu', units = 128))
classifier.add(Dense(activation = 'softmax', units = 4))


classifier.compile(optimizer = 'adam', loss = 'sparse_categorical_crossentropy', metrics = ['accuracy'])


from keras.preprocessing.image import ImageDataGenerator

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

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

training_set = train_datagen.flow_from_directory('BioImaging2015/breasthistology/Training_data',
                                                 target_size = (64, 64),
                                                 batch_size = 1,
                                                 class_mode = 'binary')

test_set = test_datagen.flow_from_directory('BioImaging2015/breasthistology/Test_data',
                                            target_size = (64, 64),
                                            batch_size = 1,
                                            class_mode = 'binary')

classifier.fit_generator(training_set,
                         samples_per_epoch = 5000,
                         nb_epoch = 20,
                         validation_data = test_set,
                         nb_val_samples = len(test_set))

data:

Found 249 images belonging to 4 classes.
Found 36 images belonging to 4 classes.

Сначала данные test_data былив одном файле.но он дал ошибку

Found 0 images belonging to 0 classes.

Затем я сделал это в 4 файла.

Вывод:

Epoch 1/20
5000/5000 [==============================] - 1056s 211ms/step - loss: 1.3914 - acc: 0.2754 - val_loss: 1.3890 - val_acc: 0.2500
Epoch 2/20
5000/5000 [==============================] - 1056s 211ms/step - loss: 1.2874 - acc: 0.3740 - val_loss: 1.6325 - val_acc: 0.3333
Epoch 3/20
5000/5000 [==============================] - 1056s 211ms/step - loss: 0.7412 - acc: 0.7098 - val_loss: 1.4916 - val_acc: 0.4722
Epoch 4/20
5000/5000 [==============================] - 1056s 211ms/step - loss: 0.3380 - acc: 0.8780 - val_loss: 1.4263 - val_acc: 0.5278
Epoch 5/20
5000/5000 [==============================] - 1057s 211ms/step - loss: 0.1912 - acc: 0.9346 - val_loss: 2.1176 - val_acc: 0.4722
Epoch 6/20
5000/5000 [==============================] - 1103s 221ms/step - loss: 0.1296 - acc: 0.9568 - val_loss: 2.8661 - val_acc: 0.4167
Epoch 7/20
5000/5000 [==============================] - 1182s 236ms/step - loss: 0.0964 - acc: 0.9698 - val_loss: 3.5154 - val_acc: 0.3611
Epoch 8/20
5000/5000 [==============================] - 1245s 249ms/step - loss: 0.0757 - acc: 0.9790 - val_loss: 3.6839 - val_acc: 0.3889
Epoch 9/20
3540/5000 [====================>.........] - ETA: 5:54 - loss: 0.0664 - acc: 0.9819

Вот мое понимание:

  1. Потеря уменьшается, а акк увеличивается.Таким образом, это указывает на то, что моделирование обучено хорошим способом.

Мои вопросы:

  1. Значение val_acc уменьшается, а значение val_loss увеличивается.Зачем?Это переоснащение?если я пишу dropout, acc и val_acc не увеличиваются.две потери не уменьшаются.
  2. После 9 эпох, акк все еще увеличивается.Так я должен использовать больше эпох и останавливаться, когда акк перестает расти?Или я должен остановиться там, где val_acc перестает расти?Но val_acc не увеличивается.
  3. Правильно ли работает сеть cnn? Я не вижу, в чем проблема.

изменяется:

  1. loss = 'sparse_categorical_crossentropy' -> loss = 'categorical_crossentropy'
  2. class_mode = 'binary' -> class_mode = 'categorical'

output2:

Epoch 1/20
5000/5000 [==============================] - 1009s 202ms/step - loss: 1.3878 - acc: 0.2752 - val_loss: 1.3893 - val_acc: 0.2500
Epoch 2/20
5000/5000 [==============================] - 1089s 218ms/step - loss: 1.3844 - acc: 0.2774 - val_loss: 1.3895 - val_acc: 0.2500
Epoch 3/20
5000/5000 [==============================] - 1045s 209ms/step - loss: 1.3847 - acc: 0.2764 - val_loss: 1.3894 - val_acc: 0.2500
Epoch 4/20
5000/5000 [==============================] - 1077s 215ms/step - loss: 1.3843 - acc: 0.2764 - val_loss: 1.3885 - val_acc: 0.2500
Epoch 5/20
5000/5000 [==============================] - 1051s 210ms/step - loss: 1.3841 - acc: 0.2768 - val_loss: 1.3887 - val_acc: 0.2500
Epoch 6/20
5000/5000 [==============================] - 1050s 210ms/step - loss: 1.3841 - acc: 0.2782 - val_loss: 1.3891 - val_acc: 0.2500
Epoch 7/20
5000/5000 [==============================] - 1053s 211ms/step - loss: 1.3836 - acc: 0.2780 - val_loss: 1.3900 - val_acc: 0.2500

1 Ответ

0 голосов
/ 28 февраля 2019

Поскольку у вас есть четыре класса и активация softmax на последнем слое, мне кажется очень маловероятным, что ваш выбор class_mode='binary' для flow_from_directory() и loss='sparse_categorical_crossentropy' для classifier.compile() правильный.Метки, сгенерированные таким образом, не будут иметь смысла.

class_mode='binary' будет генерировать метки в форме [0,1,1,0,1,1,...], которые имеют смысл только для прогноза да / нет (следовательно, «двоичный»), в то время как loss='sparse_categorical_crossentropy'ожидает метки в виде [1,3,2,4,3,2,1,2,...] (одно целое число для каждого класса).

Попробуйте взамен class_mode='categorical' и loss='categorical_crossentropy'.Это сгенерирует ярлыки с горячим кодированием, например,

[[0,0,1,0],
 [0,1,0,0],
 [0,0,0,1],
 ...      ]

, что именно то, что loss='categorical_crossentropy' ожидает получить.Также для этого идеально подходит выбор activation='softmax' в последнем слое, так как он гарантирует, что четыре значения в последнем слое всегда суммируют ap с 1.

Относительно ваших вопросов:

  1. Да, вы, скорее всего, столкнетесь с перегрузкой из-за неправильных меток (они не имеют смысла).Ваша модель в основном изучает случайные метки (данные обучения) и, следовательно, не работает с другими случайными метками (данные проверки).
  2. Вам следует остановиться, когда val_acc перестанет расти.Да, в вашем случае эта точка достигается уже после двух эпох.Но для хороших моделей это обычная практика.У вашего понимания есть недостаток: отличные результаты на тренировочных данных - не цель!Помните, в конце концов, вы хотите, чтобы ваша модель предсказывала изображения, которых она никогда не видела прежде, поэтому только данные проверки говорят вам правду.(На самом деле, еще лучше иметь еще один тестовый набор данных, который никогда не затрагивался во время обучения, и сравнить его с этим в самом конце после вызова fit или fit_generator.
  3. .только ваши данные не являются (как объяснено выше). Однако, если после моего предложенного исправления это все еще плохо работает, вам нужно будет поэкспериментировать с большим количеством объектов в ваших сверточных слоях, а также с добавлением еще большего количества сверточных слоев.Средние слои со скоростью от 0,2 до 0,5 - это всегда хороший способ избежать наложения. Вам нужно будет поэкспериментировать с этими настройками.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...