Python 图像中的无关信息对CNN的学习过程有多大影响?
我有一个CNN在核磁共振数据上检测阿尔茨海默症。MRI是3D 1.5T扫描,头骨非常清晰(来自ADNI1第3年的预制数据集)。我一直在尝试适应颅骨剥离,但没有成功,所以决定在不剥离颅骨的情况下运行我的模型 结果令我相当困惑。正如所附图片所示,该模型没有正常的学习曲线。我试着改变模型的参数,增加更多的层并放弃正则化,但我要么得到了这条随机学习曲线,要么得到了一条恒定的曲线(准确度和损失在整个时代都不会改变),而且准确度非常低,仍然非常低(这是二元分类) ,, 我想知道输入数据对模型的学习过程有多大的影响。我了解到神经网络并不总是需要预处理,因为网络本身会减去特征,但这些结果让我质疑这一点。所以我的问题是:不相关的数据(在我的例子中是头骨)对神经网络的学习过程有多大的影响 编辑:添加了我的模型Python 图像中的无关信息对CNN的学习过程有多大影响?,python,tensorflow,keras,neural-network,neuroscience,Python,Tensorflow,Keras,Neural Network,Neuroscience,我有一个CNN在核磁共振数据上检测阿尔茨海默症。MRI是3D 1.5T扫描,头骨非常清晰(来自ADNI1第3年的预制数据集)。我一直在尝试适应颅骨剥离,但没有成功,所以决定在不剥离颅骨的情况下运行我的模型 结果令我相当困惑。正如所附图片所示,该模型没有正常的学习曲线。我试着改变模型的参数,增加更多的层并放弃正则化,但我要么得到了这条随机学习曲线,要么得到了一条恒定的曲线(准确度和损失在整个时代都不会改变),而且准确度非常低,仍然非常低(这是二元分类) ,, 我想知道输入数据对模型的学习过程有多
#hot-one labeling
Y = np.load('y_array.npy')
X = np.load('images_array.npy')
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)
dummy_y = np_utils.to_categorical(encoded_Y)
#train-test split
X_train, X_test, y_train, y_test = train_test_split(X, dummy_y, test_size=0.2, random_state=1)
test_size=0.2, random_state=1)
print(X_train.shape , X_test.shape, y_train.shape, y_test.shape)
[out:] (718, 192, 192, 160) (180, 192, 192, 160) (718, 2) (180, 2)
batch_size = 64
epochs = 40
num_classes =2
AD_model = Sequential()
AD_model.add(Conv2D(64, kernel_size=(3, 3),activation='linear',input_shape=(192,192,160),padding='same'))
AD_model.add(LeakyReLU(alpha=0.1))
AD_model.add(MaxPooling2D((2, 2),padding='same'))
AD_model.add(Conv2D(128, (3, 3), activation='linear',padding='same'))
AD_model.add(LeakyReLU(alpha=0.1))
AD_model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
AD_model.add(Conv2D(256, (3, 3), activation='linear',padding='same'))
AD_model.add(LeakyReLU(alpha=0.1))
AD_model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
AD_model.add(Flatten())
AD_model.add(Dense(256, activation='linear'))
AD_model.add(LeakyReLU(alpha=0.1))
AD_model.add(Dense(num_classes, activation='sigmoid'))
AD_model.compile(loss='binary_crossentropy', optimizer='adam',metrics=['accuracy'])
AD_model.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_1 (Conv2D) (None, 192, 192, 64) 92224
_________________________________________________________________
leaky_re_lu_1 (LeakyReLU) (None, 192, 192, 64) 0
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 96, 96, 64) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 96, 96, 128) 73856
_________________________________________________________________
leaky_re_lu_2 (LeakyReLU) (None, 96, 96, 128) 0
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 48, 48, 128) 0
_________________________________________________________________
conv2d_3 (Conv2D) (None, 48, 48, 256) 295168
_________________________________________________________________
leaky_re_lu_3 (LeakyReLU) (None, 48, 48, 256) 0
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 24, 24, 256) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 147456) 0
_________________________________________________________________
dense_1 (Dense) (None, 256) 37748992
_________________________________________________________________
leaky_re_lu_4 (LeakyReLU) (None, 256) 0
_________________________________________________________________
dense_2 (Dense) (None, 2) 514
=================================================================
Total params: 38,210,754
Trainable params: 38,210,754
Non-trainable params: 0
history = AD_model.fit(
X_train,
y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(X_test, y_test))
您正在3D图像上使用2D卷积。这可能是缺乏性能的一个巨大原因。您只是简单地丢弃了一个空间维度,使其行为就像只是特征一样 这里最明显的建议是建立一个三维卷积模型 你也在两个类中使用“sigmoid”来解决一个似乎是明确的问题 使模型成为3D 在做任何事情之前,先做
X
3D:
X = X.reshape((-1, 192, 192, 160, 1))
然后将模型制作为3D:
AD_model = Sequential()
AD_model.add(Conv3D(64, kernel_size=3,input_shape=(192,192,160,1),padding='same'))
AD_model.add(LeakyReLU(alpha=0.1))
AD_model.add(MaxPooling3D((2, 2, 2),padding='same'))
AD_model.add(Conv3D(128, 3, activation='linear',padding='same'))
AD_model.add(LeakyReLU(alpha=0.1))
AD_model.add(MaxPooling3D((2, 2, 2),padding='same'))
AD_model.add(Conv3D(256, 3, activation='linear',padding='same'))
AD_model.add(LeakyReLU(alpha=0.1))
AD_model.add(MaxPooling3D((2, 2, 2),padding='same'))
#warning, maybe this gets too big and you might need to do more pooling steps
AD_model.add(Flatten())
AD_model.add(Dense(256, activation='linear'))
AD_model.add(LeakyReLU(alpha=0.1))
AD_model.add(Dense(num_classes, activation='sigmoid'))
正确处理分类问题:
- 如果你有
,一个维度表示健康,另一个维度表示阿尔茨海默症,那么你需要y\u train.shape==(批次,2)
和activation='softmax'
李>loss='categorical\u crossentropy'
- 如果您有
,值0是一个条件,1是另一个条件,那么您需要y\u train.shape==(批处理,1)
和activation='sigmoid'
李>loss='binary\u crossentropy'
在使用ReLU的层上测试
kernel\u initializer='he\u uniform'
可能会很有趣。这可能有助于加快速度和收敛。(不知道它是否适用于“泄漏”relu,但可能值得尝试)您正在3D图像上使用2D卷积。这可能是缺乏性能的一个巨大原因。您只是简单地丢弃了一个空间维度,使其行为就像只是特征一样
这里最明显的建议是建立一个三维卷积模型
你也在两个类中使用“sigmoid”来解决一个似乎是明确的问题
使模型成为3D
在做任何事情之前,先做X
3D:
X = X.reshape((-1, 192, 192, 160, 1))
然后将模型制作为3D:
AD_model = Sequential()
AD_model.add(Conv3D(64, kernel_size=3,input_shape=(192,192,160,1),padding='same'))
AD_model.add(LeakyReLU(alpha=0.1))
AD_model.add(MaxPooling3D((2, 2, 2),padding='same'))
AD_model.add(Conv3D(128, 3, activation='linear',padding='same'))
AD_model.add(LeakyReLU(alpha=0.1))
AD_model.add(MaxPooling3D((2, 2, 2),padding='same'))
AD_model.add(Conv3D(256, 3, activation='linear',padding='same'))
AD_model.add(LeakyReLU(alpha=0.1))
AD_model.add(MaxPooling3D((2, 2, 2),padding='same'))
#warning, maybe this gets too big and you might need to do more pooling steps
AD_model.add(Flatten())
AD_model.add(Dense(256, activation='linear'))
AD_model.add(LeakyReLU(alpha=0.1))
AD_model.add(Dense(num_classes, activation='sigmoid'))
正确处理分类问题:
- 如果你有
,一个维度表示健康,另一个维度表示阿尔茨海默症,那么你需要y\u train.shape==(批次,2)
和activation='softmax'
李>loss='categorical\u crossentropy'
- 如果您有
,值0是一个条件,1是另一个条件,那么您需要y\u train.shape==(批处理,1)
和activation='sigmoid'
李>loss='binary\u crossentropy'
在使用ReLU的层上测试
kernel\u initializer='he\u uniform'
可能会很有趣。这可能有助于加快速度和收敛。(不知道它是否与“leaky”relu配合良好,但可能值得一试)曲线非常混乱。是否要共享您的模型?始终没有不相关的数据…不相关的数据可能会影响模型。但不可能说有多少。每个数据和模型都是不同的。现在,你应该为你的问题提供足够的信息。不可能回答任何问题。对于颅骨剥离部分,您可以使用fslhttps://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FslInstallation
@DanielMöller我添加了我使用的模型。我不能给出一个例子来说明我正在处理的一个核磁共振成像由于隐私问题看起来是什么样子。但第二幅图像(矢状3D T1w FFE)是一幅类似的图像,曲线非常混乱。是否要共享您的模型?始终没有不相关的数据…不相关的数据可能会影响模型。但不可能说有多少。每个数据和模型都是不同的。现在,你应该为你的问题提供足够的信息。不可能回答任何问题。对于颅骨剥离部分,您可以使用fslhttps://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FslInstallation
@DanielMöller我添加了我使用的模型。我不能给出一个例子来说明我正在处理的一个核磁共振成像由于隐私问题看起来是什么样子。但第二张图片(矢状3D T1w FFE)就是一个类似的例子。谢谢你的回答!我采纳了你的建议,模型仍在运行(完成了一半),但精确度似乎没有超过50%,甚至还在下降。所以看起来它的行为和以前类似。那么可能还有其他我们在你的代码中无法检测到的东西。可能您的数据缩放不正确,可能您的数据对于这个模型来说太难了,可能其他地方有错误。谢谢您的回答!我采纳了你的建议,模型仍在运行(完成了一半),但精确度似乎没有超过50%,甚至还在下降。所以看起来它的行为和以前类似。那么可能还有其他我们在你的代码中无法检测到的东西。可能您的数据缩放不正确,可能您的数据对于这个模型来说太难了,可能其他地方有bug。