尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

表格数据如何用自组织映射编码成图像——TabSOM技术原理解读

表格数据如何用自组织映射编码成图像——TabSOM技术原理解读 表格数据在机器学习里通常被当作“二维表”一行是一条样本一列是一个特征。但绝大多数深度学习模型并不直接消费这种表结构而是把每个样本整理成一维向量后交给全连接层。这种做法看似简单却隐藏着一个结构错位——表格样本本身没有空间顺序特征列的顺序是可以任意调换的因此模型既不能利用邻近特征之间的局部关系也不会因为调换特征位置而损失太多。TabSOMTabular-to-Image Encoding Based on Self-Organizing Maps针对的正是这个问题用自组织映射 SOM 将表格向量编码成二维图像让 CNN、Vision Transformer 这类空间感知模型能够复用原有结构在表格数据上继续做分类、回归或异常检测。这篇文章会从三个层次展开。先说明为什么表格数据需要“转成图像”而不是“换成向量”再拆解 SOM 的训练机制讲清楚为什么 SOM 训练后的权重适合承担编码任务随后给出一套可运行的最小 Python 实现包括标准化、SOM 训练、响应图生成和 CNN 分类验证。最后会集中讨论网格尺寸、激活半径、数据泄漏、死神经元等实际项目中容易踩的坑以及如何从实验阶段平滑过渡到生产环境。1. 表格数据的问题和 TabSOM 的整体思路1.1 表格学习里的结构错位在结构化数据任务里XGBoost、LightGBM、逻辑回归之所以仍是很多团队的首选一个重要原因是表格特征通常来自人工设计、业务统计和历史积累特征之间没有稳定且普遍存在的空间邻接关系。可以把一条表格样本想象成一个装满不同物品的盒子知道盒子里有哪些物品还不够还要知道物品的类别、单位、量级和业务含义。把它们展开成一维向量时下标只表示摆放顺序不表示任何空间语义。而图像模型成功的关键之一是学到了“相邻像素之间有局部相关”的先验。一张自然照片里相邻像素通常属于同一个物体或同一个纹理区域卷积网络通过局部感受野、共享权重和池化操作把这种空间相关性逐步抽象成高层语义。如果把表格样本强行 reshape 成图像等于人为创造了一种不存在的相邻关系CNN 学到的局部模式会被特征顺序干扰很难稳定复现。TabSOM 的出发点是用数据本身来学习一个二维拓扑排列。它不再使用固定列顺序映射到像素位置而是先让 SOM 在大量表格样本上训练得到一组按网格排列的原型向量随后把任意一条样本和这些原型比较把比较结果放到网格的对应位置上就形成一张灰度响应图。这样一行样本对应的不再是随意排列的向量而是带有拓扑关系、可以放在空间卷积结构里处理的特征图。1.2 直接用向量输入为什么不够一个容易产生的疑问是既然全连接网络也能拟合复杂函数为什么不在表格上直接做深度模型非要绕道生成图像关键在于归纳偏置。全连接层的每个输出节点都和全部输入节点相连它很难高效表达“相邻位置共享信息”这种结构。图片数据天生就有二维坐标卷积网络可以用很小的卷积核提取边缘、纹理和局部形状反而是一维向量场景里如果特征列之间没有固有顺序卷积核不知道该把哪些列当作邻居。并不是说表格数据不能直接进入深度模型只是 MLP 需要更充分的样本量来重建这种联系。TabSOM 希望把高维空间中的距离关系嵌入到二维网格上让空间卷积结构重新有据可依。它编码的不只是原始数值还包括样本在整体数据分布中的相对位置。1.3 一条主流程串起整个方案TabSOM 并不特指某一个固定代码库而是一类“表格到图像”的方法。按它的名字拆开可以理解为先用 SOM 学习拓扑表示再把每条表格样本映射成图像。常见工程流程如下原始表格数据 - 缺失值与异常值处理 - 连续特征标准化 - 离散特征编码 - 训练 SOM 网格 - 对每条样本计算 SOM 响应图 - 堆叠成图像数据集 - 训练 CNN 或 Vision Transformer这条链路里有两个关键对象SOM 权重网格和响应图生成函数。SOM 权重网格代表数据在高维空间里压缩成二维网格后的原型响应图生成函数决定一个表格样本如何变成像素值。了解 SOM 的内部机制是理解 TabSOM 的前提。2. 自组织映射TabSOM 编码的底层机制2.1 SOM 比 K-Means 多出的那部分能力自组织映射自组织映射Self-Organizing Map, SOM是高维数据可视化领域常用的无监督方法也可以看作一种受拓扑约束的聚类算法。它和 K-Means 类似都要为每个簇维护一个中心向量但 SOM 的不同点在于这些中心向量不是彼此孤立放置的而是排列在一个低维网格上通常是矩形网格也可以是六边形网格。每个网格节点就是一个神经元它保存一个与输入维度相同的权重向量。K-Means 训练结束后只会得到若干个不相邻的簇中心。SOM 训练结束后除了一组原型向量还额外得到了一张“拓扑地图”网格上相邻的神经元它们对应的权重向量通常也相似。在 TabSOM 里这种邻域一致性非常关键。如果只是聚类那么一条样本只能得到簇编号而 SOM 训练出的网格能让相似的样本落在相邻的亮块中这样生成出来的图像就具有局部的平滑区域而不是一堆随机孤立的亮点。2.2 一次训练迭代里的竞争、协作和更新SOM 的训练过程可以从“竞争、协作、更新”三步理解。每一轮迭代算法会从训练集中取出一条样本向量 x然后计算 x 与全部神经元权重向量的距离找到距离最小的那个神经元称为最佳匹配单元 BMU。这里的竞争是在寻找谁最能代表当前样本规则通常是欧氏距离。找到 BMU 后SOM 并不会只更新 BMU 一个神经元。它会根据 BMU 周围的距离定义一个邻域函数比如高斯邻域。离 BMU 越近的神经元受到的更新比例越大离得远的神经元几乎不更新。这一步是协作机制也是与 K-Means 最明显的差异所在。最后更新时每个受影响神经元 w_i 的权重向量都向当前样本 x 靠近更新公式可以写成w_i - w_i learning_rate * h(c, i) * (x - w_i)其中 h(c, i) 是 BMU 编号 c 和神经元 i 之间的邻域权重learning_rate 是学习率。训练早期通常使用较大的学习率和较宽的邻域让地图先形成一个粗略的拓扑结构训练后期逐渐缩小学习率和邻域半径让每个神经元收敛到更精细的位置。很多开源 SOM 库会配置 learning_rate_decay_rate 和 sigma_decay_rate正是为了体现这个先粗略后精细的过程。实际使用时不要一开始就把邻域设得太小否则网格可能很快分裂成互不相关的孤立区域后续生成的响应图也就没有太大意义。2.3 训练完成后留下哪些信息一个 SOM 训练完成之后最直接的产物是权重矩阵。若网格大小为 side × side输入维度为 D权重矩阵的形状就是 side × side × D。这个矩阵可以理解为 D 维空间里一个有组织的采样相邻位置点的原形更加接近。除此之外还可以从 SOM 中计算多种辅助图。比如 U-Matrix 展示相邻神经元权重距离的大小可以用来观察聚类边界频率矩阵统计每个神经元被多少样本激活为 BMU用来判断死神经元。在 TabSOM 场景里我们既可以把完整权重矩阵保留下来用它给样本生成响应图也可以把训练好的 SOM 当作一个编码器组件与 scaler 一起打包保存供后续推理使用。SOM 的学习不依赖样本标签因此 TabSOM 的图像编码过程也天然是自监督的。哪怕下游是回归、分类、异常检测中的任意一种任务只要训练数据能反映分布SOM 都可以在未标签数据上完成训练。这一点对数据稀缺场景很友好。3. 用 Python 走通一条最小 TabSOM 编码链路3.1 依赖的选择和测试数据先准备一个最小环境。SOM 层面不需要自己手写全部逻辑可以直接使用 MiniSom它轻量且便于用来复现教学场景下游 CNN 可以使用 TensorFlow/Keras 或 PyTorch这里用 Keras 展示流程。如果只想验证 SOM 编码不安装深度学习框架也可以后续部分会单独说明。pip install minisom scikit-learn matplotlib tensorflow为了演示编码链路这里使用常见的小型分类数据比如乳腺癌数据集。它包含 30 个数值特征和 2 个类别规模不大适合观察方法从 SOM 到 CNN 的完整通路。要注意的是示例数据只是示例真实项目需要替换成自己的数据文件并先完成缺失值处理。import numpy as np from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler data load_breast_cancer() X, y data.data, data.target X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy ) scaler StandardScaler().fit(X_train) X_train_scaled scaler.transform(X_train) X_test_scaled scaler.transform(X_test) print(X_train_scaled.shape, X_test_scaled.shape)标准化这里体现两层目的。第一层是让每个特征在欧氏距离计算中权重相近避免某个数值范围过大的特征主导整个距离第二层是让后续 SOM 训练的尺度稳定下来。注意 scaler 只能用训练集拟合测试集只做 transform不能重新 fit否则会造成数据泄漏。3.2 训练 SOM 并构造样本响应图MiniSom 的常用参数包括方格边长、输入维度、初始 sigma、学习率和邻域函数。选择边长 12 或 14 是一个常见起点边长越大图像分辨率越高但需要更多训练样本和轮数来稳定支撑地图边长太小则会把不同类别压到同一块区域导致生成的图像分不开。from minisom import MiniSom side 14 n_features X_train_scaled.shape[1] som MiniSom( side, side, n_features, sigma1.5, learning_rate0.5, neighborhood_functiongaussian, random_seed42 ) som.pca_weights_init(X_train_scaled) som.train_batch(X_train_scaled, 20000, verboseFalse)pca_weights_init 会先用数据做主成分方向的线性投影来初始化权重。这样做比随机初始化更温和能避免开始阶段大量神经元离数据太远也能明显减少死神经元。train_batch 表示每次从训练集中随机抽取一条样本更新模型是 MiniSom 适合中小数据集的默认训练方式。训练完成后定义编码函数对一条样本 x计算它与所有神经元的欧氏距离形成 side × side 的距离矩阵再把距离使用高斯函数转换成相似度距离越近像素值越接近 1距离越远像素值越接近 0。def sample_to_activation(som, x, sigma0.8): weights som.get_weights() distances np.linalg.norm(weights - x, axis-1) activation np.exp(-(distances ** 2) / (2 * sigma ** 2)) return activation def build_image_set(som, X, sigma0.8): images [sample_to_activation(som, row, sigma) for row in X] images np.asarray(images) return images[..., np.newaxis]sample_to_activation 返回一个二维数组这就是单个表格样本的灰度响应图。它表示的是“当前样本与 SOM 网格中每个原型的相似程度”。一个样本只要进入训练好的 SOM必然会在 BMU 周围形成一块较亮的区域。由于 SOM 本身维护拓扑邻域相似的样本激活的亮块会靠近不相似的样本激活的区域会分开这正是后续 CNN 可以学习的结构。对训练集和测试集分别执行图像生成检查输出的形状img_train build_image_set(som, X_train_scaled, sigma1.0) img_test build_image_set(som, X_test_scaled, sigma1.0) print(img_train.shape) print(img_test.shape)正常输出会类似(455, 14, 14, 1) (114, 14, 14, 1)最后一项 1 表示单通道灰度图。这里的 455 和 114 是本份数据按 8: 2 切分后的近似结果换成其他数据会变化关键是最后三个维度应该与 SOM 网格边长一致。3.3 把响应图交给 CNN 做下游验证得到图像集后可以接一个简单的 CNN 来验证编码是否有效这里以二分类为例。输入形状为 (side, side, 1)网络包含两层卷积、池化和全连接。from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout model Sequential([ Conv2D(16, (3, 3), activationrelu, input_shape(side, side, 1)), MaxPooling2D((2, 2)), Conv2D(32, (3, 3), activationrelu), MaxPooling2D((2, 2)), Flatten(), Dense(64, activationrelu), Dropout(0.3), Dense(1, activationsigmoid) ]) model.compile(optimizeradam, lossbinary_crossentropy, metrics[accuracy]) model.fit( img_train, y_train, validation_data(img_test, y_test), epochs20, batch_size32, verbose1 )实际训练时还要关注验证集准确率并保留一份原始表格直接送入全连接模型作为基线。只有对比原始表格 MLP 和 TabSOM 编码后 CNN 的差距才能判断 SOM 图像编码确实带来了收益。上面代码没有包含早停策略生产实验建议增加 EarlyStopping 并根据验证集准确率保存最佳模型。如果不想引入 TensorFlow也可以把响应图展平后交给逻辑回归或随机森林用来快速检查特征是否可分。展平操作会丢失空间结构不能发挥这个方法的真正价值但作为早期验证会比直接初始化 CNN 更快。4. 真正影响图像质量的参数和设计取舍4.1 网格大小等于图像分辨率SOM 的方格边长 side 决定了响应图的分辨率。比如 8 × 8 得到 64 个神经元14 × 14 得到 196 个神经元。边长取得小每个神经元要被更多样本支撑单张图看到的细节更少但训练更稳定边长取得大图像更精细可是对应每个神经元的样本数减少如果训练集不够大很多神经元会落在空区域响应图可能产生噪声斑点。实际选择没有一个固定公式。常见做法是观察不同 side 下量化误差的下降速度量化误差描述每个样本到其 BMU 的平均距离。误差越高说明图像丢失原始信息越多误差下降到一定程度后开始选择较小且稳定的 side。部分教材会给出类似k round(sqrt(5 * sqrt(N)))的经验公式N 是样本数但最终还是要根据可行性、训练耗时和下游准确率综合评估。4.2 激活半径决定亮块范围sample_to_activation 里的 sigma 是激活半径不是 SOM 训练时那个 sigma。这个参数控制距离矩阵转换成相似度时的衰减速度。sigma 偏小每个样本只会点亮 BMU 附近极少量神经元图像主体接近单点CNN 看到的局部信息太少sigma 偏大大部分神经元都会获得较高亮度分类边界会被模糊掉图像看起来像一整块灰度片。可以先打印一组样本的距离分布再根据距离的典型范围选取 sigma。比如大多数距离集中在 0 到 3那么 sigma1.0 通常能让 BMU 附近形成体积合适的亮块距离 2.5 之外的像素值已经接近零。这个参数可以和网格大小放在一起做网格搜索观察验证集指标变化。4.3 单通道、多通道还是多尺度最直接的 TabSOM 编码是一张单通道灰度图。如果想给模型更丰富的表示一种工程变体是把多个 sigma 下生成的激活图叠成三个通道相当于在同一张 SOM 地图上观察近距离、中距离和远距离三个尺度。此时单条样本会产生 side × side × 3 的图像再交给 CNN 进行处理。多尺度编码在样本靠近类边界时往往能保留更鲁棒的邻域信息。def build_multi_scale_image(som, x, sigmas(0.6, 1.0, 1.6)): channels [sample_to_activation(som, x, s) for s in sigmas] return np.stack(channels, axis-1)另一个需要避免的做法是直接从每个特征维度产生单通道图像后按特征堆叠。例如为 30 个特征各自生成一张图最后得到 side × side × 30 的宽通道输入这种做法会让通道数随特征数量膨胀且每个通道内的信息往往过于简单并不利于普通 CNN 训练。4.4 不同编码策略对比编码策略具体做法图像含义适用场景注意事项BMU 单点图只把最佳匹配神经元位置标记为 1样本所属的原型位置简单可视化CNN 很难学出有效特征高斯激活图为每个神经元计算相似度样本在二维拓扑上的分布默认推荐需要合理设置激活 sigma多尺度激活图多种 sigma 堆叠成多通道不同邻域范围的综合响应CNN 分类、鲁棒性要求高输入通道增加训练更慢特征分布地图将每一维特征作为归一化灰度图每个特征在拓扑网格上的原型值特征解释性分析不适合直接当作单样本图像会丢失样本交互关系表中前三类面向“单条样本生成单张图像”最后一类更像是映射特征全貌的可视化图。实际 TabSOM 相关工作通常要同时提供两条能力既能表达单样本和原型的空间关系又能利用 SOM 的拓扑排列形成 CNN 可识别的局部模式。如果要复现具体论文建议以原始论文中的激活函数或归一化公式为准这里描述的架构是一套可落地的常见骨架。5. 怎样验证“编码后图像真的有用”5.1 先看响应图是否产生结构差异训练完 SOM 之后不要急着写 CNN先观察几类样本的图像是否真的呈现不同的结构。可以随机抽出几个正类样本和负类样本将 sample_to_activation 生成的 side × side 灰度图显示出来。如果全部样本的响应图几乎相同说明 SOM 没有把两类数据分到不同区域要么网格太小要么样本本身特征重叠严重要么训练邻域参数设置不合理。另一种更可靠的可视化是把同一类样本的响应图求平均。平均图能显示出每一类主要激活哪些网格区域。如果两类平均图即使看区域也不同CNN 就有机会学到跨类差异如果平均图高度相似就要先回到 SOM 参数调整而不是换更大 CNN。也可以激活神经元的频次画成频率分布查看是否有明显的“坏神经元”。某个神经元若从未成为任何样本的 BMU它在编码图中通常也不会被点亮只会给整张图贡献一片空白区域白白增加图像尺寸。5.2 用最简单的 CNN 跑分类和原始表格 MLP 对比验证 TabSOM 有效性最直接的方式是控制变量。原始表格用全连接网络处理图像编码用同样复杂度的 CNN 处理两边使用相同的训练轮数、优化器和早停策略比较验证集指标。这里不要求 CNN 一定超过最好的 GBDT因为 TabSOM 本身的目标是让图像模型能处理表格数据因此优先比较的是“表格 MLP”与“编码图 CNN”两者在深度模型框架下的差异。建议设计成一个较完整的对照组对照组 A原始向量 - MLP 对照组 BSOM 响应图 - CNN 对照组 CPCA 降维后响应图 - CNN 组 D距离图 - CNN如果有能力还可以对比把原始表格标准化后随机 reshape 成同样边长的图像直接交给同一个 CNN用来证明 SOM 的拓扑有序排列带来了收益。这几个实验合在一起能够回答一个问题效果提升到底来自 SOM 的拓扑结构还是单纯来自图像形态。再进一步如果某个表格任务里历史最优方案就是 XGBoostTabSOM 即使能让 CNN 在验证集上接近 XGBoost也已经很有价值因为模型族切换后获得了迁移学习、多模态融合或图像数据增强等能力。不要用 TabSOM 去挑战“所有表格场景必须超过 GBDT”这个不现实的目标。5.3 可复用的验证检查清单检查项检查方式合格标准SOM 是否收敛观察量化误差随迭代下降曲线误差趋于平稳且没有大幅抖动死神经元数量统计每个神经元被激活为 BMU 的样本数大部分神经元都有样本不应大量为 0单类响应图差异绘制正负类别的平均响应图两类平均图亮区存在可区分差异图像维度和样本量查看生成图片形状符合 (side, side, 1)训练集样本数与图片数一致数据泄漏检查检查 scaler 与 SOM 是否只在训练集拟合测试集只调用 transform 或已训练好的 SOM基线对照原始向量 MLP 与编码图 CNNCNN 不大幅劣于 MLP或能带来额外收益这份清单不需要全部做到自动化前几项可以在可视化脚本里完成后面几项要放进实验管理工具里记录。建议建立一个项目子目录统一保存 scaler、sou model、图像生成配置和训练 seed确保实验可复现。6. 几个容易踩的坑和对应排查方式6.1 连续特征没有标准化距离被大数值特征主导表格数据集经常存在年龄、收入、累计金额等量纲差异巨大的特征。如果第 3 个特征的取值范围是 0 到 100000第 7 个特征是 0 到 1SOM 的欧氏距离会接近完全被第 3 个特征主导其他特征对激活图的贡献很小。最终的响应图看似在变化实际只反映了单变量分布。解决方式是在训练 SOM 前对连续特征做 StandardScaler 或 RobustScaler。更稳妥的做法是只在训练集上 fit之后把 scaler 和 SOM 一起存入一个预处理对象中。检查时可以直接统计各特征标准差若有些特征标准差远高于其他特征说明应该先做标准化。6.2 训练结束后出现大量死神经元死神经元指训练完成后没有任何样本把它当作 BMU也没有被任何激活亮起的神经元。死神经元会让响应图的一部分永远处于暗态CNN 需要学习去忽略它们浪费模型容量并降低稳定性。常见原因包括随机初始化远离数据、邻域半径太小导致拓扑结构扩展不充分以及训练轮数不够。修复方向包括使用 pca_weights_init 做初始化训练初期维持较大的 sigma让地图扩展阶段覆盖完整数据区域固定 random_seed 复现结果训练结束后统计神经元激活频率。如果激活频率分布极端可以缩小网格边长或增大训练轮数。6.3 激活 sigma 设置不当响应图全亮或全暗响应图几乎全亮时说明当前样本与网格上所有原型都较接近或 sigma 设得太大像素值差别很小。响应图几乎只有一个亮点其他区域全暗时则说明 sigma 设得太小CNN 可学习的空间上下文太弱。需要结合距离矩阵的分布判断而不是随意拍定 sigma。若距离矩阵最大值是 6均值在 2 左右取 sigma1 时距离大于 3 的像素值会快速落到接近 0。实际可以先随机抽样 100 条样本打印每条距离矩阵的分位数再在 sigma0.5、1.0、1.5、2.0 中选择一个能保留一定范围响应的值。也可以在验证集上做一个小范围网格搜索。6.4 测试数据参与了 SOM 训练造成数据泄漏SOM 是无监督学习很多人容易让整个数据集参与 SOM 训练。但如果测试集也进入了 SOM 训练阶段SOM 的原型已经接触过测试样本后续用“测试集生成响应图”再做评估会得到偏乐观的结果部署到新数据时往往达不到同等效果。正确流程是先划分 train/testtrain 用来 fit scaler 并 train SOMtest 只通过同一 scaler 变换后再使用已经训练好的 SOM 生成图像。CNN 训练也只是用 train 图test 图只用于最后验证。6.5 SOM 随机性造成多次实验结果波动SOM 的训练和初始化包含随机过程。即使同样的数据如果 random_seed 不固定每次生成的响应图可能不同下游 CNN 指标会跟着波动导致无法判断参数改动是优化还是噪声。MiniSom 支持 random_seed 参数深度学习中固定 Keras/TensorFlow 或 PyTorch 的全局随机种子也很有必要。在多轮实验中最好选择稳定的指标而不是单次最大准确率作为结果。建议对每个参数组合跑 3 到 5 次记录均值与方差。若标准差明显高于参数之间的差距说明当前参数不是主导因素应该先降低训练随机性。7. 工程落地和扩展方向7.1 把 TabSOM 当作可复用预处理组件在生产项目中TabSOM 不只是一段训练脚本而是一条完整的特征编码管线。推荐把数据清洗、标准化、SOM 训练和激活函数封装成一个 Pipeline 对象最终保存 scaler、SOM 权重以及配置参数。当新样本到达时先生成响应图再喂给已经训练好的图像分类模型。import joblib joblib.dump(scaler, artifact/scaler.joblib) joblib.dump(som, artifact/som.joblib) # 推断时 scaler joblib.load(artifact/scaler.joblib) som joblib.load(artifact/som.joblib) x_vec scaler.transform([new_record])[0] image sample_to_activation(som, x_vec, sigma1.0)需要注意保存 SOM 方格大小、input_dim、激活 sigma 等配置。如果读取出来的 SOM 与当前特征维度不匹配通常是因为训练时的输入列顺序发生了变化。在真实系统中要维护一份列名清单推理时按相同顺序读取。7.2 从学习环境到生产环境的差异学习环境为了验证算法通常只关心验证集指标。生产环境至少还要增加数据版本、模型版本、特征列校验和推理日志。表格数据的列名变化很常见生产模型需要能检测“当前输入少了某列”或“某列的取值分布与训练异常”。虽然 TabSOM 的响应图像在 CNN 里看的是一个张量但追溯哪个像素对应 SOM 的哪个位置、哪个神经元受到哪些特征影响仍然是排错时需要保留的信息。性能方面也要考虑。SOM 网格尺寸如果设为 32 × 32每条样本推理需要计算 1024 个神经元距离实时在线推理会遇到压力。可以先批量生成图像再用 CNN 做图像推理也可以在请求高峰期把响应图编码过程放到预处理服务里而不是每次都重新加载很大的 SOM 权重。7.3 值得继续探索的方向TabSOM 可以继续向几个方向扩展。一类是和预训练图像模型结合把生成的响应图输入到 ImageNet 预训练模型之上利用大规模视觉特征迁移到表格任务另一类是与异常检测结合因为 SOM 本身能给出每个样本到原型的距离响应图中的亮斑形态会比标量距离包含更丰富的信息。在多模态场景里表格样本和文本、图像同时出现时TabSOM 让表格和图像共享同一个视觉 Transformer 编码空间可以做统一表示学习或跨模态检索。这个方向比单纯提升表格分类准确率更有长期价值。实际落地时不要一开始追求复杂网络和超大网格。先用一个小型 SOM 与浅层 CNN 验证响应图是否可分再逐步扩大网格和网络规模。稳定的 SOM 拓扑结构是后续一切视觉模型收益的基石参数上的持续调试远比更换大模型更值得先做。
返回列表