Keras CNN模型的准确性是否会随着时间的推移而提高和降低?

时间:2020-08-02 04:27:25

标签: python tensorflow machine-learning keras deep-learning

这里是机器学习的新手。 我目前正在使用在fMRI成像上使用3D-CNN的诊断机器学习框架。我的数据集目前包含636张图像,并且我试图区分控件和受影响对象(二进制分类)。但是,当我尝试训练模型时,每经过一个纪元,无论我做什么,我的准确性都保持在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 :(得分:0)

主要问题是您正在对1个神经元使用softmax激活。将sigmoid作为损失函数将其更改为binary_crossentropy

同时,请记住,您正在使用Poisson损失函数,该函数适用于回归问题而不是分类问题。确保您检测到要解决的确切情况。

答案 1 :(得分:0)

带有一个神经元的Softmax使模型不合逻辑,并且仅在最后一层使用S型激活函数或Softmax