簡體   English   中英

Keras CNN model 精度沒有隨着時間的推移而提高和降低?

[英]Keras CNN model accuracy not improving and decreasing over epoch?

機器學習的新手在這里。 我目前正在研究使用 3D-CNN 進行 fMRI 成像的診斷機器學習框架。 我的數據集現在包含 636 張圖像,我正在嘗試區分控制和受影響(二進制分類)。 但是,當我嘗試訓練我的 model 時,在每個 epoch 之后,無論我做什么,我的准確率都保持在 48.13%。 此外,在整個 epoch 中,准確率從 56% 下降到 48.13%。 到目前為止,我已經嘗試過:

  • 改變我的損失函數(泊松、分類交叉熵、二元交叉熵、稀疏分類交叉熵、均方誤差、平均絕對誤差、鉸鏈、鉸鏈平方)
  • 改變我的優化器(我試過 Adam 和 SGD)
  • 改變層數
  • 使用權重正則化
  • 從 ReLU 更改為leaky 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)

主要問題是您正在使用帶有 1 個神經元的softmax激活。 將其更改為sigmoid ,使用binary_crossentropy作為損失 function。

同時,請記住,您使用的是Poisson損失 function,它適用於回歸問題而不是分類問題。 確保您檢測到您正在嘗試解決的確切方案。

具有一個神經元的 Softmax 使 model 不合邏輯,並且在最后一層僅使用一個 sigmoid 激活函數或 Softmax

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM