ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

二、基于图像和结构化数据多模态融合的回归预测网络【框图讲解+源码】

二、基于图像和结构化数据多模态融合的回归预测网络【框图讲解+源码】

整理读研期间做的项目与日常小实验
本篇未完待续…代码部分整理后补充

0. 背景

实验室有一些材料的SEM(扫描电镜)图像、也有对应的组分信息(结构化数据,包含类别特征和连续的数值特征),以及对应的力学性能指标。
当时看多模态论文比较多,便想着既然有数据,正好可以用这些数据练习一下,于是,搭建一个多模态融合的模型,融合图像信息和材料的组分信息两种模态的数据信息,进行回归预测。

1. 网络结构

搭建的多模态融合模型框架如下图所示:
在这里插入图片描述

网络模型如下图所示:

网络结构

2. 结构分析

2.1 CBAM模块

CBAM模块如下:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.2 网络A结构

在这里插入图片描述

2.3 网络B结构

在这里插入图片描述

2.4 AdaptiveFusion结构

(1) 结构1

在这里插入图片描述
在这里插入图片描述

(2) 结构2

Concat or Sum

(3) 结构3

MHSA
在这里插入图片描述

3. 代码

3.1 数据集制作划分代码

import pandas as pd
import numpy as np# TODO 1. 数据集普通划分方式'''
- 数据集划分: 采用SEMDL软件进行划分。  
- 相关代码见对应的数据管理软件模块。
'''def get_k_fold_data_split(k,X):# X 为 np.array# 返回第i折交叉验证时所需要的训练和测试数据,分开放,X_train为训练数据,X_test为验证数据assert k > 1fold_size = X.shape[0] // k  # 每份的个数:数据总条数/折数(向下取整)nums_train = int(fold_size*0.2)print("nums_train:",nums_train)X_train = NoneX_test = Nonetemp_data = Nonefor j in range(8):print('j:',j)idx = slice(j * fold_size, (j + 1) * fold_size)print(idx)temp_data = X[idx,:]temp_data = temp_data.copy()np.random.shuffle(temp_data)idx1 = slice(0, 192)  # slice(start,end,step)切片函数 得到测试集的索引print('idx1',idx1)X_part1 = temp_data[idx1, :]  # 只对第一维切片即可if X_train is None:X_train = X_part1else:X_train = np.vstack((X_train, X_part1))  # 其他剩余折进行拼接 也仅第一维print('xtrain:',X_train.shape)idx2 = slice(192, 240)  # slice(start,end,step)切片函数 得到测试集的索引print('idx2',idx2)X_part2 = temp_data[idx2, :]  # 只对第一维切片即可if j == 0:X_test = X_part2else:X_test = np.vstack((X_test, X_part2))  # 其他剩余折进行拼接 也仅第一维print('x_test:', X_test.shape)return X_train, X_testdef k_split_data_split():''':return:F:\paper_work\dataset_sem\dataset_yasuo\100x\exp39组较长验证数据集 L{i+1}_train.csv  L{i+1}_val.csv'''k = 14  # 设置折数# 读取数据文件# F:\paper_work\dataset_sem\dataset_yasuo\100x\exp3\data.csvfilename = r'F:\paper_work\img_dataset\performence\train_val_test.csv'  # 原始所有数据dir_name = r'F:\paper_work\img_dataset\performence'  # 保存路径# 以上为需要设置的参数df = pd.read_csv(filename, header=None, index_col=None)df = np.array(df)print(df.shape)# 数据集划分后报保存路径train,test = get_k_fold_data(k,df)train_name = dir_name + '\\' + f'train_val.csv'val_name = dir_name + '\\' + f'test.csv'pd.DataFrame(train).to_csv(train_name, header=None, index=None)pd.DataFrame(test).to_csv(val_name, header=None, index=None)# TODO 2. 数据集K折交叉验证划分方式pass
# 辅助函数 用于辅助 k_split_data函数
def get_k_fold_data(k, i, X):# X 为 np.array# 返回第i折交叉验证时所需要的训练和测试数据,分开放,X_train为训练数据,X_test为验证数据assert k > 1fold_size = X.shape[0] // k  # 每份的个数:数据总条数/折数(向下取整)X_train, y_train = None, Nonefor j in range(k):idx = slice(j * fold_size, (j + 1) * fold_size)  # slice(start,end,step)切片函数 得到测试集的索引X_part = X[idx, :]  # 只对第一维切片即可if j == i:  # 第i折作testX_test = X_partelif X_train is None:X_train = X_partelse:X_train = np.vstack((X_train, X_part))  # 其他剩余折进行拼接 也仅第一维return X_train, X_testdef k_split_data():''':return:F:\paper_work\dataset_sem\dataset_yasuo\100x\exp39组较长验证数据集 L{i+1}_train.csv  L{i+1}_val.csv'''k = 9 # 设置折数# 读取数据文件# F:\paper_work\dataset_sem\dataset_yasuo\100x\exp3\data.csvfilename = r'F:\paper_work\dataset_sem_p2\dataset_kfold\data.csv' # 原始所有数据dir_name = r'F:\paper_work\dataset_sem_p2\dataset_kfold' # 保存路径# 以上为需要设置的参数-----df = pd.read_csv(filename,header=None,index_col=None)df = np.array(df)print(df.shape)# 数据集划分后报保存路径# k折交叉验证 划分数据集for i in range(9):train_name = dir_name + '\\'+f'L{i+1}_train.csv'val_name = dir_name + '\\'+f'L{i+1}_val.csv'print('*****************************')train,test = get_k_fold_data(k, i, df)pd.DataFrame(train).to_csv(train_name,header=None,index=None)pd.DataFrame(test).to_csv(val_name, header=None, index=None)# 裁剪数据集 只保留原先的val 前三十个
def save30pre():for i in range(9):path_ori = r'F:\paper_work\dataset_sem_p2\dataset_kfold\backup'+'\\'+f'L{i+1}_val.csv'path_out = r'F:\paper_work\dataset_sem_p2\dataset_kfold' + '\\' + f'L{i+1}_val.csv'df = pd.read_csv(path_ori, header=None, index_col=None)df = df[:][:30]df.to_csv(path_out,index=None,header=None)print(df.shape)if __name__ == '__main__':k_split_data()

3.2 模型结构代码

3.3 模型训练代码

3.4 相关绘图代码

附录1、CNN卷积层特征图可视化

下图为SEM图像中间特征层的可视化效果:
在这里插入图片描述
实现代码可以参考下面:
【卷积神经网络卷积层提取的特征图可视化】

pass
返回列表