Насколько нерелевантная информация в изображении влияет на процесс обучения CNN?

У меня есть CNN для обнаружения болезни Альцгеймера по данным МРТ. МРТ представляет собой 3D-сканирование 1,5 Тл, и череп хорошо виден (готовый набор данных из ADNI1, год 3). Я пытался адаптировать удаление черепа, но безуспешно, поэтому решил запустить мою модель без удаления черепа.

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

Точность, Убыток

Мне было интересно, насколько входные данные влияют на процесс обучения модели. Я узнал, что предварительная обработка не всегда необходима для нейронных сетей, поскольку сеть сама вычитает функции, но эти результаты заставили меня усомниться в этом. Итак, мой вопрос: насколько нерелевантные данные (в моем случае череп) влияют на процесс обучения нейронной сети?

Изменить: добавлена ​​моя модель

#hot-one labeling
Y = np.load('y_array.npy')
X = np.load('images_array.npy')
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)
dummy_y = np_utils.to_categorical(encoded_Y)

#train-test split
X_train, X_test, y_train, y_test = train_test_split(X, dummy_y, test_size=0.2, random_state=1)
test_size=0.2, random_state=1)

print(X_train.shape , X_test.shape, y_train.shape, y_test.shape)
[out:] (718, 192, 192, 160) (180, 192, 192, 160) (718, 2) (180, 2)

batch_size = 64
epochs = 40
num_classes =2

AD_model = Sequential()
AD_model.add(Conv2D(64, kernel_size=(3, 3),activation='linear',input_shape=(192,192,160),padding='same'))
AD_model.add(LeakyReLU(alpha=0.1))
AD_model.add(MaxPooling2D((2, 2),padding='same'))
AD_model.add(Conv2D(128, (3, 3), activation='linear',padding='same'))
AD_model.add(LeakyReLU(alpha=0.1))
AD_model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
AD_model.add(Conv2D(256, (3, 3), activation='linear',padding='same'))
AD_model.add(LeakyReLU(alpha=0.1))                  
AD_model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
AD_model.add(Flatten())
AD_model.add(Dense(256, activation='linear'))
AD_model.add(LeakyReLU(alpha=0.1))                  
AD_model.add(Dense(num_classes, activation='sigmoid'))

AD_model.compile(loss='binary_crossentropy', optimizer='adam',metrics=['accuracy'])
AD_model.summary()

Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 192, 192, 64)      92224     
_________________________________________________________________
leaky_re_lu_1 (LeakyReLU)    (None, 192, 192, 64)      0         
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 96, 96, 64)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 96, 96, 128)       73856     
_________________________________________________________________
leaky_re_lu_2 (LeakyReLU)    (None, 96, 96, 128)       0         
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 48, 48, 128)       0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 48, 48, 256)       295168    
_________________________________________________________________
leaky_re_lu_3 (LeakyReLU)    (None, 48, 48, 256)       0         
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 24, 24, 256)       0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 147456)            0         
_________________________________________________________________
dense_1 (Dense)              (None, 256)               37748992  
_________________________________________________________________
leaky_re_lu_4 (LeakyReLU)    (None, 256)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 2)                 514       
=================================================================
Total params: 38,210,754
Trainable params: 38,210,754
Non-trainable params: 0

history = AD_model.fit(
    X_train, 
    y_train, 
    batch_size=batch_size,
    epochs=epochs,
    verbose=1,
    validation_data=(X_test, y_test))

person Mira    schedule 02.01.2020    source источник
comment
Кривые очень запутанные. Хотите поделиться своей моделью?   -  person manuel    schedule 02.01.2020
comment
Неактуальных данных всегда нет ....   -  person manuel    schedule 02.01.2020
comment
Нерелевантные данные могут повлиять на модель. Но сколько, сказать невозможно. Все данные и каждая модель разные. Теперь вам действительно стоит привнести достаточно информации в свой вопрос. Ничего не могу ответить.   -  person Daniel Möller    schedule 02.01.2020
comment
для удаления черепа вы можете использовать fsl https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FslInstallation   -  person Pygirl    schedule 02.01.2020
comment
@ DanielMöller Я добавил модель, которую использовал. Я не могу привести пример того, как выглядит один из МРТ, с которым я работаю, из-за конфиденциальности. Но примером аналогичного изображения является второе изображение, которое здесь (Sagittal 3D T1w FFE)   -  person Mira    schedule 02.01.2020
comment
У вас действительно 160 входных каналов? : O   -  person Daniel Möller    schedule 02.01.2020
comment
@ DanielMöller Да, это трехмерное изображение. Таким образом, 160 входных каналов представляют каждый срез изображения МРТ (высота, ширина, время / срез). Это изображение в оттенках серого, поэтому в данном случае нет измерения для цвета.   -  person Mira    schedule 02.01.2020
comment
@Pygirl Спасибо за предложение! К сожалению, я работаю над Windows, и fsl можно использовать только для систем unix, поскольку я читал здесь   -  person Mira    schedule 03.01.2020


Ответы (1)


Вы используете 2D-свертки на 3D-изображениях. Это может быть серьезной причиной снижения производительности. Вы просто отбрасываете одно пространственное измерение, заставляя его вести себя как объекты.

Наиболее очевидным предложением здесь является создание трехмерной сверточной модели.

Вы также используете «сигмоид» в двух классах для решения задачи, которая кажется категоричной.

Сделайте модель 3D

Прежде всего сделайте X 3D:

X = X.reshape((-1, 192, 192, 160, 1))

Затем сделайте свою модель 3D:

AD_model = Sequential()
AD_model.add(Conv3D(64, kernel_size=3,input_shape=(192,192,160,1),padding='same'))
AD_model.add(LeakyReLU(alpha=0.1))
AD_model.add(MaxPooling3D((2, 2, 2),padding='same'))
AD_model.add(Conv3D(128, 3, activation='linear',padding='same'))
AD_model.add(LeakyReLU(alpha=0.1))
AD_model.add(MaxPooling3D((2, 2, 2),padding='same'))
AD_model.add(Conv3D(256, 3, activation='linear',padding='same'))
AD_model.add(LeakyReLU(alpha=0.1))                  
AD_model.add(MaxPooling3D((2, 2, 2),padding='same'))

#warning, maybe this gets too big and you might need to do more pooling steps 
AD_model.add(Flatten()) 

AD_model.add(Dense(256, activation='linear'))
AD_model.add(LeakyReLU(alpha=0.1))                  
AD_model.add(Dense(num_classes, activation='sigmoid'))

Правильно разобраться с категоричной проблемой:

  • Если у вас y_train.shape == (batch, 2), причем одно измерение означает "здоровье", а другое - болезнь Альцгеймера, тогда вам нужны activation='softmax' и loss = 'categorical_crossentropy'.
  • Если у вас есть y_train.shape == (batch, 1), значение 0 является условием, а 1 - другим условием, тогда вам нужны activation='sigmoid' и loss = 'binary_crossentropy'.

(Протестируйте это) Используйте лучшие инициализаторы ядра для ReLU

Было бы интересно протестировать kernel_initializer='he_uniform' на слоях, использующих ReLU. Это может помочь в скорости и сходимости. (Не знаю, работает ли он с "дырявым" relu, но, возможно, стоит попробовать)

person Daniel Möller    schedule 02.01.2020
comment
Спасибо за ответ! Я адаптировал ваше предложение, и модель все еще работает (наполовину сделано), но точность, похоже, не превышает 50% и даже падает. Так что, похоже, он действует так же, как и раньше. - person Mira; 05.01.2020
comment
Тогда могут быть другие вещи, которые мы не можем обнаружить в вашем коде. Возможно, ваши данные неправильно масштабированы, возможно, ваши данные слишком сложны для этой модели, может быть, где-то еще есть ошибка. - person Daniel Möller; 05.01.2020