| 方面 | RNN/LSTM | Transformer |
|---|---|---|
| 信息传递 | 按时间步递归传递 | 所有位置并行交互 |
| 长程依赖 | 较难 | 更擅长 |
| 并行计算 | 较弱 | 较强 |
| 序列位置信息 | 天然按顺序处理 | 需位置编码 |
| 典型应用 | 时间序列、小规模序列 | 文本、谱图、大规模序列 |
Transformer 的优势来自并行注意力,但计算量随序列长度快速增加。
Transformer 本身不天然知道顺序,因此需要位置编码。
一种常见形式:
PE(pos,2i)=sin(100002i/dpos)
PE(pos,2i+1)=cos(100002i/dpos)
位置编码使模型区分谱图中的不同角度位置或文本中的不同词位置。
以 XRD 谱图为例:
2θ: 20 21 22 ... 80
强度: I1 I2 I3 ... In
建模方式:
谱图建模必须注意背景扣除、归一化、峰位偏移和仪器差异。
增材制造或焊接过程可能产生:
建模目标:
import numpy as np
# 模拟一条谱图:1000 个角度点
angle = np.linspace(20, 80, 1000)
intensity = np.exp(-0.5 * ((angle - 45) / 1.5)**2)
intensity += 0.08 * np.random.randn(1000)
# 模型输入可以是形状为 (长度, 特征数) 的序列
x_seq = np.stack([angle, intensity], axis=1)
print(x_seq.shape) # (1000, 2)
后续可将其送入 1D CNN、LSTM 或 Transformer。
材料文献文本中常见实体:
Transformer 可用于:
| 任务 | 输出 | 指标 |
|---|---|---|
| 序列分类 | 类别 | Accuracy、F1、AUC |
| 序列回归 | 数值 | MAE、RMSE、R2 |
| 序列标注 | 每点标签 | Token F1、IoU |
| 异常检测 | 异常概率 | Precision、Recall、PR-AUC |
材料任务中应重点关注错误的工程代价,而不是只看平均指标。
材料研究天然是多模态的:
本节关注:如何让模型联合利用多源信息,而不是孤立处理单一数据。
多模态学习是指同时利用两种或多种数据模态进行表示学习、预测或生成。
统一表达:
y^=fθ(x(1),x(2),…,x(M))
其中 M 为模态数量。
材料示例:
y^=fθ(成分,热处理工艺,显微图像,XRD谱图)
单一模态往往无法完整描述材料状态:
多模态融合的目标:
在不同证据之间建立互补关系,提高预测、检索和解释能力。
| 方式 | 做法 | 优点 | 风险 |
|---|---|---|---|
| 早期融合 | 原始特征直接拼接 | 简单直接 | 维度不一致、尺度差异大 |
| 中间融合 | 各模态编码后融合 | 表征能力强 | 结构设计复杂 |
| 后期融合 | 各模型结果再融合 | 模块独立 | 难学习深层交互 |
材料小样本任务中,后期融合和中间融合通常更容易控制风险。
若图像特征为 zimg,成分特征为 zcomp,谱图特征为 zspec,则:
z=[zimg;zcomp;zspec]
然后使用:
y^=gθ(z)
优点:实现简单。
缺点:不同模态尺度、噪声和缺失情况差异较大。
图像 ─→ CNN 编码器 ─┐
谱图 ─→ Transformer ─┼─→ 融合层 ─→ 预测
文本 ─→ 文本编码器 ─┤
表格 ─→ MLP 编码器 ─┘
中间融合更适合复杂材料任务,因为每种模态先由合适的网络提取表示。
例如:
假设三个模型输出概率:
p^(1),p^(2),p^(3)
加权融合:
p^=m=1∑Mαmp^(m),m=1∑Mαm=1
适合场景:
多模态融合的前提是样本对应关系清楚。
常见对齐关系:
若样本对齐错误,模型会学习错误关联,且很难通过训练损失发现。
深度模型常将不同模态编码为向量:
zimg=Eimg(ximg)
ztxt=Etxt(xtxt)
若两者描述同一材料对象,希望它们在表示空间中接近。
这就是跨模态检索和对比学习的基础。
给定正样本对 (i,j),使其相似度更高;给定负样本对,使其相似度更低。
一种常见目标形式:
Li=−log∑kexp(sim(zi,zk)/τ)exp(sim(zi,zj)/τ)
其中:
材料应用:图像—文本、结构—性能、谱图—相组成的表示对齐。
输入 A:显微组织图像
输入 B:合金成分向量
输出:硬度或强度
融合逻辑:
比单独使用图像更合理,因为相似图像可能由不同成分产生;比单独使用成分更合理,因为工艺导致的组织差异不可忽略。
论文图像:显微组织、相图、谱图
论文文本:材料体系、工艺、性能、结论
可能任务:
关键要求:证据可追踪,不能只输出生成式结论。
输入 A:XRD 谱图
输入 B:候选晶体结构或相组成
输出:相识别、结构匹配或相分数估计
建模意义:
现实数据中经常不是每个样本都有完整模态。
处理策略:
材料数据库常见问题:文献中有性能但无图像,有图像但缺少精确工艺参数。
import numpy as np
# 假设已经得到图像、谱图和成分的特征向量
z_img = np.random.rand(128) # CNN 输出
z_spec = np.random.rand(64) # 谱图编码器输出
z_comp = np.random.rand(20) # 成分和工艺特征
z_fused = np.concatenate([z_img, z_spec, z_comp])
print(z_fused.shape) # (212,)
实际应用中应对每类特征做尺度归一化,并在验证集上评估融合是否真正带来增益。
评价时应回答:
常用方法:
显微组织识别不是单一任务,而是一组任务:
本节重点建立从图像任务到材料问题的映射。
| 任务 | 输入 | 输出 | 材料案例 |
|---|---|---|---|
| 分类 | 整张图像 | 一个类别 | 珠光体/贝氏体/马氏体 |
| 语义分割 | 整张图像 | 每个像素类别 | α相/β相/孔洞/基体 |
| 实例分割 | 整张图像 | 每个对象掩膜 | 每个晶粒或颗粒 |
| 目标检测 | 整张图像 | 缺陷框和类别 | 裂纹、孔洞、夹杂物 |
| 回归计量 | 图像或掩膜 | 数值指标 | 孔隙率、相分数、晶粒尺寸 |
选择任务前必须明确材料问题是什么。
适用场景:
数据需求:
分类任务相对容易启动,但信息粒度较粗。
语义分割输出与输入图像同尺寸:
Y^∈{1,2,…,K}H×W
其中每个像素都有类别标签。
材料应用:
U-Net 由编码器和解码器组成:
输入图像
↓ 编码器:提取高层特征,降低分辨率
瓶颈层
↑ 解码器:恢复空间分辨率
↘ 跳跃连接:融合低层细节和高层语义
输出分割掩膜
跳跃连接对材料图像很重要,因为相界、晶界和小缺陷需要保留空间细节。
交并比 IoU:
IoU=∣A∪B∣∣A∩B∣
其中:
IoU 越高,预测区域与真实区域重合越好。
在多类别分割中,通常计算每一类 IoU,再取平均得到 mIoU。
Dice 系数:
Dice=∣A∣+∣B∣2∣A∩B∣
Dice 对小目标分割较常用。
材料应用:
小缺陷任务中,Dice 往往比像素准确率更有意义。
目标检测输出:
材料场景:
检测任务要求标注缺陷位置,标注成本通常高于分类。
真实工程中缺陷样本往往少于正常样本。
问题:
应对策略:
精确像素标注成本很高,材料专家时间有限。
可能策略:
| 标注方式 | 成本 | 信息量 | 适用任务 |
|---|---|---|---|
| 图像级标签 | 低 | 低 | 分类、弱监督定位 |
| 框标注 | 中 | 中 | 缺陷检测 |
| 点标注 | 中 | 中 | 颗粒计数、弱监督分割 |
| 像素掩膜 | 高 | 高 | 精细相分割 |
标签质量往往比模型结构更决定最终性能。
标注前应明确:
错误做法:将同一试样切成多个 patch 后随机划分。
风险:
同一试样的相似 patch 同时进入训练集和测试集
↓
模型测试分数虚高
↓
新试样泛化失败
推荐:
常见流程:
材料图像预处理应尽量自动化,避免人工选择导致隐性偏差。
同一像素大小对应的真实尺寸可能不同。
若像素尺寸为 r,某区域面积为 Np 个像素,则真实面积为:
A=Npr2
若忽略尺度,模型可能无法区分:
任务设定:
分析重点:
任务设定:
相分数计算:
fα=NtotalNα
其中 Nα 为目标相像素数。
任务设定:
工程关注:
分割只是中间结果,最终应回到材料量。
可统计:
示例:圆度可定义为:
C=P24πA
其中 A 为面积,P 为周长。
import numpy as np
# mask: 0 表示基体,1 表示第二相
mask = np.random.choice([0, 1], size=(256, 256), p=[0.72, 0.28])
phase_fraction = mask.sum() / mask.size
print("第二相面积分数:", phase_fraction)
# 若每个像素对应 0.2 微米
pixel_size = 0.2
area_um2 = mask.sum() * pixel_size**2
print("第二相面积(um^2):", area_um2)
import numpy as np
from scipy import ndimage
mask = np.random.choice([0, 1], size=(128, 128), p=[0.95, 0.05])
labels, n = ndimage.label(mask)
areas = ndimage.sum(mask, labels, index=np.arange(1, n + 1))
print("对象数量:", n)
print("平均面积:", areas.mean() if n > 0 else 0)
该方法可用于孔洞、颗粒或析出相的初步统计。
传统图像处理:
深度学习:
工程实践中常将二者结合:深度模型分割,传统方法统计材料量。
部署前至少检查:
深度模型不仅要“给答案”,还应回答:
本节关注可信深度学习的基本思想。
材料场景中错误预测可能导致:
因此,模型输出应包括预测结果和可信程度,而不是只输出一个类别。
| 类型 | 来源 | 是否可通过增加数据降低 | 材料案例 |
|---|---|---|---|
| Aleatoric | 数据本身噪声 | 通常难以完全消除 | 成像噪声、标注边界模糊 |
| Epistemic | 模型知识不足 | 可以通过增加数据降低 | 新合金体系、新成像条件 |
小样本材料问题中,epistemic uncertainty 通常尤其重要。
深度分类模型常输出 Softmax 概率:
p^k=∑j=1Kexp(zj)exp(zk)
但高 Softmax 值不一定表示模型真实可靠。
原因:
理想校准模型满足:
在模型给出 80% 置信度的样本中,约有 80% 预测正确。
期望校准误差 ECE:
ECE=m=1∑Mn∣Bm∣∣acc(Bm)−conf(Bm)∣
其中 Bm 表示第 m 个置信度分箱。
训练后仍开启 Dropout,多次前向预测:
y^(1),y^(2),…,y^(T)
预测均值:
yˉ=T1t=1∑Ty^(t)
预测方差可作为不确定性估计。
适用:快速近似,不需要训练多个模型。
深度集成训练多个独立模型:
p^(y∣x)=M1m=1∑Mp^m(y∣x)
若多个模型意见一致,不确定性较低;
若多个模型分歧较大,不确定性较高。
优点:通常效果稳健。
缺点:训练和推理成本更高。
可解释性方法回答:
材料图像中,合理关注区域可能包括:
Grad-CAM 利用类别输出对特征图的梯度,估计特征图重要性。
权重:
αkc=Z1i∑j∑∂Aijk∂yc
热力图:
LGrad−CAMc=ReLU(k∑αkcAk)
其中 Ak 为第 k 个特征图。
热力图可以帮助发现:
但热力图不是严格因果证明,只是辅助诊断工具。
材料图像中常见偏差:
可解释性分析可帮助发现这些偏差,但最终需要回到数据流程排查。
分布外样本包括:
对分布外样本,模型可能给出高置信错误预测。
应对策略:
主动学习流程:
已有少量标注数据 → 训练模型
↓
在未标注样本上预测不确定性
↓
选择最有价值样本给专家标注
↓
加入训练集并重新训练
材料小样本问题中,主动学习可以减少专家标注成本。
选择策略包括:最大不确定性、类别边界样本、代表性样本等。
建议报告:
神经网络基础
├─ 层、激活函数、损失、反向传播
├─ CNN:图像局部特征与显微组织识别
├─ RNN/Transformer:谱图、文本和工艺序列
├─ 多模态融合:成分、工艺、图像、谱图、文本
├─ 应用任务:分类、分割、检测、组织计量
└─ 可信机制:不确定性、校准、可解释性、人工审核
核心观点:深度学习不是单独的模型技巧,而是材料数据链条中的一个环节。
| 概念 | 公式 |
|---|---|
| 神经元 | a=ϕ(wTx+b) |
| 交叉熵 | L=−∑k=1Kyklogp^k |
| 梯度下降 | θt+1=θt−η∇θL |
| 自注意力 | softmax(dk |
| IoU | $\mathrm{IoU}=\frac{ |
| Dice | $\mathrm{Dice}=\frac{2 |
这些公式构成深度图像识别与多模态建模的基础语言。
使用 Python 构造一个小型“合成显微组织图像”数据集,并完成二分类模型训练。
import numpy as np
import matplotlib.pyplot as plt
def make_particle_image(size=64, n=10):
img = np.zeros((size, size), dtype="float32")
yy, xx = np.mgrid[:size, :size]
for _ in range(n):
cx, cy = np.random.randint(0, size, 2)
r = np.random.randint(3, 8)
img[(xx - cx)**2 + (yy - cy)**2 < r**2] = 1.0
img += 0.15 * np.random.randn(size, size)
return np.clip(img, 0, 1)
def make_stripe_image(size=64):
x = np.linspace(0, 4 * np.pi, size)
img = (np.sin(x)[None, :] > 0).astype("float32")
img = np.repeat(img, size, axis=0)
img += 0.15 * np.random.randn(size, size)
return np.clip(img, 0, 1)
X, y = [], []
for _ in range(120):
X.append(make_particle_image())
y.append(0)
for _ in range(120):
X.append(make_stripe_image())
y.append(1)
X = np.array(X)
y = np.array(y)
print(X.shape, y.shape)
plt.imshow(X[0], cmap="gray")
plt.axis("off")
plt.show()
建议先用传统特征或简单模型完成分类,再尝试 CNN。
提交内容:
这些问题将直接关系到后续“生成式 AI、知识库和主动学习”的学习。
阅读建议:先跑通官方图像分类示例,再将自然图像替换为材料图像或合成显微图像。