为什么我在keras三维CNN中的准确性总是0



我对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用于测试。这可能是问题所在吗?我想稍后在基本模型运行稳定时增强图像。还是我必须先这么做?

提前非常感谢!

这对于有两个类的分类问题没有意义:

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'

最新更新