为什么我在keras 3d CNN中的准确性始终为0?

时间:2020-10-07 04:23:14

标签: python tensorflow keras deep-learning cnn

我一般对keras,cnn和深度学习还是陌生的,所以如果解决方案很简单,我非常抱歉。我真的在这里死胡同。

所以-事实是,我有一个3D CNN,其中50x50x50的多维数据集作为输入数据。我想将它们分类为0或1,所以这是一个二进制分类问题。在将其拟合到NN之前,我当然准备了数据,对其进行了重构,调整大小和标准化。因此图像是可比较的(1个体素为2毫米),归一化为0到1范围,并且大小都相同。

因此,当我尝试将数据拟合到模型中时,结果并不那么令人鼓舞。精度始终显示为0,在一个纪元中我拥有的最高精度为accuracy: 0.0159,损耗始终在3.2和3.5之间

我也改变了时期的数量,但是我有5还是50都没有关系。结果总是相同的。

这是我的CNN体​​系结构的代码

    model = Sequential()
    model.add(Conv3D(64, kernel_size=(5, 5, 5), activation='linear',
                     kernel_initializer='glorot_uniform', input_shape=shape))
    model.add(BatchNormalization(center=True, scale=True))
    model.add(LeakyReLU(.1))
    model.add(Dropout(.25))
    model.add(Conv3D(128, kernel_size=(3, 3, 3), activation='linear',
                     kernel_initializer='glorot_uniform'))
    model.add(BatchNormalization(center=True, scale=True))
    model.add(LeakyReLU(.1))
    model.add(MaxPooling3D(pool_size=(3, 3, 3)))
    model.add(Dropout(.25))

    model.add(Conv3D(256, kernel_size=(3, 3, 3), activation='linear',
                     kernel_initializer='glorot_uniform'))
    model.add(BatchNormalization(center=True, scale=True))
    model.add(LeakyReLU(.1))
    model.add(Dropout(.25))
    model.add(Conv3D(512, kernel_size=(3, 3, 3), activation='linear',
                     kernel_initializer='glorot_uniform'))
    model.add(BatchNormalization(center=True, scale=True))
    model.add(LeakyReLU(.1))
    model.add(MaxPooling3D(pool_size=(3, 3, 3)))
    model.add(Dropout(.25))

    model.add(Flatten())
    model.add(Dense(256))
    model.add(BatchNormalization(center=True, scale=True))
    model.add(LeakyReLU(.1))
    model.add(Dropout(.5))
    model.add(Dense(512))
    model.add(BatchNormalization(center=True, scale=True))
    model.add(LeakyReLU(.1))
    model.add(Dropout(.5))
    model.add(Dense(256))
    model.add(BatchNormalization(center=True, scale=True))
    model.add(Activation('softmax'))

    model.compile(optimizer='adam',
                  loss='binary_crossentropy',
                  metrics=['accuracy'])
    
    print(training_patients[0])
    model.summary()
    model.fit(training_patients, training_labels, epochs=50, batch_size=50)

所以我想问一下,我的体系结构是否有问题?还是您认为问题更多出在数据方面?

我只有420张图像;我将其中3/4用于训练,而1/4用于测试。这可能是问题吗? 当基础模型运行稳定时,我想稍后再放大图像。还是我必须先这样做?

非常感谢您!

1 个答案:

答案 0 :(得分:1)

对于具有两个类的分类问题,这没有任何意义:

model.add(Dense(256))
model.add(BatchNormalization(center=True, scale=True))
model.add(Activation('softmax'))

将其更改为此:

model.add(Dense(1))
model.add(Activation('sigmoid'))

还考虑对卷积层使用'relu'激活而不是'linear'