Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我在keras 3d CNN中的准确度总是0?_Python_Tensorflow_Keras_Deep Learning_Cnn - Fatal编程技术网

Python 为什么我在keras 3d CNN中的准确度总是0?

Python 为什么我在keras 3d CNN中的准确度总是0?,python,tensorflow,keras,deep-learning,cnn,Python,Tensorflow,Keras,Deep Learning,Cnn,我对keras、cnn和deep learning都很陌生,所以如果解决方案很简单的话,我非常抱歉。我在这里真的走投无路了 所以-问题是,我有一个3D CNN,其中有50x50x50的立方体作为输入数据。我想把它们分为0或1,所以这是一个二进制分类问题。在将其装配到NN之前,我当然准备了数据,对其进行了重构、调整大小和规范化。因此,图像具有可比性(1个体素为2 mm),标准化为0到1的范围,大小相同 因此,当我试图将数据拟合到我的模型中时,结果并不那么令人鼓舞。精度总是显示为0,我在一个历元中获

我对keras、cnn和deep learning都很陌生,所以如果解决方案很简单的话,我非常抱歉。我在这里真的走投无路了

所以-问题是,我有一个3D CNN,其中有50x50x50的立方体作为输入数据。我想把它们分为0或1,所以这是一个二进制分类问题。在将其装配到NN之前,我当然准备了数据,对其进行了重构、调整大小和规范化。因此,图像具有可比性(1个体素为2 mm),标准化为0到1的范围,大小相同

因此,当我试图将数据拟合到我的模型中时,结果并不那么令人鼓舞。精度总是显示为0,我在一个历元中获得的最高精度是
精度: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'激活而不是<代码> '''卷积层的线性'< /代码>。

你能打印出你的输入的形状吗?它像一个符咒!非常感谢。但我仍然不太明白到底是什么问题,以及为什么它现在起作用。你能解释一下为什么以前没有意义吗?毕竟,我不只是想要一个工作程序,我想从我的错误中学到一些东西。批处理规范是一个复杂的操作,在这里根本没有意义。此外,输出层上的神经元数量几乎总是你拥有的类别数量(除非你有两个类别,你可以放1,并使用二进制交叉熵和sigmoid激活)。谢谢你,我想我现在明白了!