利用CNN实现图像和数值数据融合

本文介绍了如何利用CNN结合MRI图像和数值数据进行融合,以提升医疗领域的预测准确性。通过三种融合方法对比,重点探讨了CNN在特征提取上的优势。文章展示了训练CNN模型、提取图像特征并与数值数据拼接的步骤,并以FashionMNIST和Iris数据集为例进行演示。最终,通过决策树模型展示了融合数据的预测效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用CNN实现图像(MRI)和数值数据融合

一、背景

在很多实际任务当中,模型构建数据类型多样,有数值型、图像、音频等各式各样的数据,如果单纯利用某种类型的数据构建分类或回归模型,好处是构建简单,数据不存在类型不同融合困难的问题,但如果单纯的利用某一种数据且模型性能一般,如accuracy在0.6-0.7之间徘徊,那有必要纳入更多的特征,特别是在医疗领域,部分数值型数据本来的可分性就不好,因此要纳入一部分的图像数据,如早期预测一个人是否会患某种疾病,训练集样本均为正常人,此时无论是数值型数据或影像数据,区别并不大,因此要考虑融合二者来提升预测的准确性。

二、目前常用的图像和数值型数据融合的方式

目前来说,把图像和数值型数据融合方式有三种:

1、直接把图像转为向量

这种方法是最暴力的解法,如一张32X32像素的彩色图片,其转化为向量为32X32X3=3072,相当于纳入了3072个特征,优点是纳入了所有图像中的细节(像素级),缺点是由于纳入了所有的细节(像素),会不必要的有一部分混杂因素,因此需要复杂的特征工程,另一方面,其计算量会大大增加,导致模型拟合或后期应用出现问题。

2、利用软件提取图像中的某些特征

在这里插入图片描述如上面的这张颅脑磁共振成像,利用某些软件如FSL,可以提取丘脑、海马体、脑皮厚度、脑容量等参数,之后把这部分参数当作新的特征和数值型数据融合,优点是大大减少了特征数,提升了计算速度,缺点是一些器质性病变无法体现。

3、利用CNN(卷积神经网络)

在这里插入图片描述
CNN也可以用来提取特征,前提是该模型预测准确性较好,自然相当于提取的特征较为准确,一般是在卷积基后的flatten层和数值型数据拼接在一起,实现图像和数值型数据的融合,具体如上图所示。

三、CNN实现图像和数值型数据融合的步骤

1、训练CNN网络

这一步是整个融合过程中较为重要的步骤,只有较为准确的CNN网络才能提取准确有用的特征,一般采用预训练+微调的模式来训练CNN,为了演示方便,我们采用Fashion MNIST数据集来为我们的图像,iris数据集作为我们的数值型数据,来做演示。另外由于Fashion MNIST类别有10中,而iris只有3种,我们之纳入irsi的数据来“假定为我们图像配套的数值型数据”,新建一个py文件,具体代码如下:

import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow import keras
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'


# 加载数据
fashion_mnist = tf.keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
# 查看数据大小
# print(train_images.shape)
# print(test_images.shape)
# 数据集归一化
train_images_norm = train_images / 255.0
test_images_norm = test_images / 255.0
train_images_reshape = train_images.reshape([-1, 28, 28, 1])
test_images_reshape = test_images.reshape([-1, 28, 28, 1])

L = keras.layers
model = keras.Sequential([
    # 卷积层
    L
以下是一个简单的示例代码,用于将CNN模型中的图像数据数值数据特征融合,进行回归预测。在这个示例中,我们使用了PyTorch框架,并假设我们已经有了一个可以处理图像数据CNN模型一个可以处理数值数据特征的MLP模型。 ``` import torch import torch.nn as nn import torch.optim as optim # 定义CNN模型 class CNNModel(nn.Module): def __init__(self): super(CNNModel, self).__init__() self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1) self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1) self.conv3 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1) self.pool = nn.MaxPool2d(kernel_size=2, stride=2) self.fc1 = nn.Linear(64 * 4 * 4, 128) self.fc2 = nn.Linear(128, 10) def forward(self, x): x = self.conv1(x) x = nn.functional.relu(x) x = self.pool(x) x = self.conv2(x) x = nn.functional.relu(x) x = self.pool(x) x = self.conv3(x) x = nn.functional.relu(x) x = self.pool(x) x = x.view(-1, 64 * 4 * 4) x = self.fc1(x) x = nn.functional.relu(x) x = self.fc2(x) return x # 定义MLP模型 class MLPModel(nn.Module): def __init__(self): super(MLPModel, self).__init__() self.fc1 = nn.Linear(5, 16) self.fc2 = nn.Linear(16, 32) self.fc3 = nn.Linear(32, 1) def forward(self, x): x = self.fc1(x) x = nn.functional.relu(x) x = self.fc2(x) x = nn.functional.relu(x) x = self.fc3(x) return x # 定义整合模型 class FusionModel(nn.Module): def __init__(self): super(FusionModel, self).__init__() self.cnn_model = CNNModel() self.mlp_model = MLPModel() self.fc1 = nn.Linear(10 + 1, 1) def forward(self, x1, x2): x1 = self.cnn_model(x1) x2 = self.mlp_model(x2) x = torch.cat((x1, x2), dim=1) x = self.fc1(x) return x # 加载数据 train_loader = ... test_loader = ... # 初始化模型优化器 model = FusionModel() optimizer = optim.Adam(model.parameters(), lr=0.001) # 训练模型 for epoch in range(num_epochs): for i, (images, features, labels) in enumerate(train_loader): # 将图像数据数值数据特征作为输入 images = images.float() features = features.float() labels = labels.float() output = model(images, features) # 计算损失函数并更新模型 loss = nn.functional.mse_loss(output, labels) optimizer.zero_grad() loss.backward() optimizer.step() # 测试模型 with torch.no_grad(): total_loss = 0 for images, features, labels in test_loader: images = images.float() features = features.float() labels = labels.float() output = model(images, features) total_loss += nn.functional.mse_loss(output, labels, reduction='sum').item() avg_loss = total_loss / len(test_loader.dataset) print('Test Loss: {:.4f}'.format(avg_loss)) ``` 在这个示例中,我们定义了三个模型: 1. CNN模型处理图像数据 2. MLP模型处理数值数据特征 3. FusionModel整合两个模型的输出,并进行回归预测 在训练测试过程中,我们将图像数据数值数据特征作为输入,通过FusionModel模型进行融合,并计算损失函数优化模型。最后,我们使用测试集对模型进行评估,并输出测试损失。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值