论文阅读U-KAN Makes Strong Backbone for MedicalImage Segmentation and Generation

作为一种非常有潜力的代替MLP的模型,KAN最终获得了学术界极大的关注。在我昨天的博客里,解读了最近的热门模型KAN:

论文阅读KAN: Kolmogorov–Arnold Networks-优快云博客

KAN的原文作者提到了很多不足。本文算是对其中两个现有不足的回应,也就是:1)KAN不仅只能用于特定结构和深度,2)KAN不仅能用于小规模AI+Science任务,还可以用于更大规模或更复杂的任务。

本文将KAN融入了U-Net网络结构中,并运用在医学图像分割任务上。

1,U-KAN架构

整体结构如图,是个U-Net经典的对称编解码器结构。编解码器都有卷积部分和token化KAN模块部分组成。卷积部分如U-Net一样,不赘述。

Token化的KAN模块:

1)token化:首先对特征进行重塑,得到一系列扁平化的二维patch。接着进行线性投影,线性投影是通过一个核大小为3的卷积层实现的。卷积层足以编码位置信息,并且其性能实际上优于标准的位置编码技术。

2)KAN块:在获取到token之后,我们将它们传入一系列的KAN层(N=3)。在每个KAN层之后,特征会通过一个高效的深度卷积层(DwConv)、一个批量归一化层(BN)和一个ReLU激活函数。此外,还是用了残差连接。

2,消融实验

1)KAN层层数影响

2)KAN层换成MLP的话,结果会下降(在我看来本文最重要的结论也就是这个)

3)模型规模的影响

3,与SOTA对比

4,本文的缺陷与不足

本文在我看来有两个主要不足:

1)训练难度:KAN至关重要的训练难度问题没有提及。将KAN结构嵌入U-Net是否会导致训练变得不稳定或难以收敛呢?训练速度会慢多少呢?

2)实验对比不充分,结果可能不SOTA

本文的对比实验,完全没有对比基于Transformer的图像分割模型,对比的几个模型要么是纯卷积模型,要么是卷积+MLP模型。那么我们是否可以认为U-KAN的结果逊于主流的Transformer分割模型?

5总结

在我看来,虽然本文模型大概率并不SOTA,但是也不是非要SOTA的模型和实验才有价值。

本文的价值在于验证了KAN可以用于更广泛的数据集,并且在更多场景下展现了超越和取代MLP的潜力。

U-KAN代码复现可从以下方面着手。 在模型理解上,U-Net已成为各种视觉应用的基石,但存在局限于线性建模模式以及缺乏可解释性的问题,而U-KAN受Kolmogorov - Arnold网络(KANs)在准确性和可解释性方面的令人印象深刻的结果的启发,通过从Kolmogorov - Anold表示定理派生的非线性可学习激活函数堆栈来重塑神经网络学习[^2]。 在数据处理方面,若涉及类似ViM - UNet模型要求,数据集需以多模态的.nii.gz文件形式存储,并附带一个数据字典文件(dataset.json),这种格式方便数据存储和管理,能保留图像的多模态信息,有助于提高模型性能[^3]。 对于代码中的参数,U - KAN代码中为自定义的 `KANLinear` 层提供了参数,这些参数控制着该层的网格大小、样条曲线的行为、噪声比例等特性,每个参数在 `KANLayer` 类的 `__init__` 方法中都有定义和用途,复现代码时需明确这些参数的含义和设置方法[^4]。 以下是一个简单示例框架,假设使用Python和PyTorch: ```python import torch import torch.nn as nn # 模拟KANLayer类 class KANLayer(nn.Module): def __init__(self, grid_size, spline_behavior, noise_ratio): super(KANLayer, self).__init__() # 这里根据实际情况实现具体逻辑 self.grid_size = grid_size self.spline_behavior = spline_behavior self.noise_ratio = noise_ratio def forward(self, x): # 这里根据实际情况实现具体逻辑 return x # 模拟U - KAN模型 class UKANModel(nn.Module): def __init__(self, grid_size, spline_behavior, noise_ratio): super(UKANModel, self).__init__() self.kan_layer = KANLayer(grid_size, spline_behavior, noise_ratio) def forward(self, x): x = self.kan_layer(x) return x # 实例化模型 model = UKANModel(grid_size=32, spline_behavior='linear', noise_ratio=0.1) input_tensor = torch.randn(1, 3, 224, 224) output = model(input_tensor) print(output.shape) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝海渔夫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值