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)