Точность модели Keras CNN не улучшается и не уменьшается с течением времени? - PullRequest
0 голосов
/ 02 августа 2020

Newb ie для машинного обучения здесь. В настоящее время я работаю над структурой машинного обучения Diagnosti c с использованием 3D-CNN для получения изображений с помощью фМРТ. Мой набор данных сейчас состоит из 636 изображений, и я пытаюсь различить guish между контрольным и затронутым (двоичная классификация). Однако, когда я пытался тренировать свою модель, после каждой эпохи моя точность оставалась на уровне 48,13%, что бы я ни делал. Кроме того, за эпоху точность снижается с 56% до 48,13%. До сих пор я пытался:

  • изменить свои функции потерь (пуассон, категориальная перекрестная энтропия, двоичная перекрестная энтропия, разреженная категориальная перекрестная энтропия, среднеквадратическая ошибка, средняя абсолютная ошибка, шарнир, шарнир в квадрате)
  • изменение моего оптимизатора (я пробовал Adam и SGD)
  • изменение количества слоев
  • с использованием регуляризации веса
  • изменение с ReLU на дырявый ReLU ( Я подумал, возможно, это могло бы помочь, если бы это был случай переобучения)

Пока ничего не помогло.

Есть какие-нибудь советы? Вот мой код:

#importing important packages
import tensorflow as tf
import os
import keras
from keras.models import Sequential
from keras.layers import Dense, Flatten, Conv3D, MaxPooling3D, Dropout, BatchNormalization, LeakyReLU
import numpy as np
from keras.regularizers import l2
from sklearn.utils import compute_class_weight
from keras.optimizers import SGD

BATCH_SIZE = 64
input_shape=(64, 64, 40, 20)

# Create the model
model = Sequential()

model.add(Conv3D(64, kernel_size=(3,3,3), activation='relu', input_shape=input_shape, kernel_regularizer=l2(0.005), bias_regularizer=l2(0.005), data_format = 'channels_first', padding='same'))
model.add(MaxPooling3D(pool_size=(2, 2, 2)))
model.add(Conv3D(64, kernel_size=(3,3,3), activation='relu', input_shape=input_shape, kernel_regularizer=l2(0.005), bias_regularizer=l2(0.005), data_format = 'channels_first', padding='same'))
model.add(MaxPooling3D(pool_size=(2, 2, 2)))
model.add(BatchNormalization(center=True, scale=True))

model.add(Conv3D(64, kernel_size=(3,3,3), activation='relu', input_shape=input_shape, kernel_regularizer=l2(0.005), bias_regularizer=l2(0.005), data_format = 'channels_first', padding='same'))
model.add(MaxPooling3D(pool_size=(2, 2, 2)))
model.add(Conv3D(64, kernel_size=(3,3,3), activation='relu', input_shape=input_shape, kernel_regularizer=l2(0.005), bias_regularizer=l2(0.005), data_format = 'channels_first', padding='same'))
model.add(MaxPooling3D(pool_size=(2, 2, 2)))
model.add(BatchNormalization(center=True, scale=True))

model.add(Flatten())
model.add(BatchNormalization(center=True, scale=True))
model.add(Dense(128, activation='relu', kernel_regularizer=l2(0.01), bias_regularizer=l2(0.01)))
model.add(Dropout(0.5))
model.add(Dense(128, activation='sigmoid', kernel_regularizer=l2(0.01), bias_regularizer=l2(0.01)))
model.add(Dense(1, activation='softmax', kernel_regularizer=l2(0.01), bias_regularizer=l2(0.01)))
 
# Compile the model
model.compile(optimizer = keras.optimizers.sgd(lr=0.000001), loss='poisson', metrics=['accuracy', tf.keras.metrics.Precision(), tf.keras.metrics.Recall()])

# Model Testing 
history = model.fit(X_train, y_train, batch_size=BATCH_SIZE, epochs=50, verbose=1, shuffle=True)

Ответы [ 2 ]

0 голосов
/ 27 августа 2020

Softmax с одним нейроном делает модель нелогичной и использует только одну из сигмовидных функций активации или Softmax в последнем слое

0 голосов
/ 02 августа 2020

Основная проблема в том, что вы используете активацию softmax с 1 нейроном. Измените его на sigmoid с binary_crossentropy в качестве функции потерь.

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

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