赞
踩
该项目将柯尔莫哥洛夫-阿诺德网络(KAN)创新架构的思想扩展到卷积层,将卷积的经典线性变换转变为每个像素中可学习的非线性激活。
该存储库由以下人员创建:
此存储库使用 KAN 的有效实现,可在此处获取。KAN 的原始实现可在此处获取。KAN 的原始论文可在此处获取。
KAN 是多层感知器 (MLP) 的有前途的替代品。KAN 与 MLP 一样具有强大的数学基础:MLP 基于通用近似定理,而 KAN 基于 Kolmogorov-Arnold 表示定理。KAN 和 MLP 是双重的:KAN 在边上有激活函数,而 MLP 在节点上有激活函数。KAN 似乎比 MLP 更高效地利用参数,但每个 KAN 层都比 MLP 层有更多参数。
有关这种新颖架构的更多信息,请访问:
KAN 卷积与卷积非常相似,但我们不是将核与图像中相应的像素之间的点积应用到每个元素上,而是将可学习的非线性激活函数应用于每个元素,然后将它们相加。KAN 卷积的核相当于一个由 4 个输入和 1 个输出神经元组成的 KAN 线性层。对于每个输入 i,我们应用一个 ϕ_i 可学习函数,该卷积步骤的结果像素是 ϕ_i(x_i) 的总和。下图可以直观地看到这一点。
假设我们有一个 KxK 核。在这种情况下,对于这个矩阵的每个元素,我们都有一个 ϕ,其参数数量为:gridsize + 1。对于实现问题,高效 kan 定义:
这为激活函数 b 提供了更多的可表达性。因此,线性层的参数数量为 gridsize + 2。因此,KAN 卷积总共有 K²(gridsize + 2) 个参数,而普通卷积只有 K²。考虑到 gridsize 通常(在我们的实验中)介于 k 和 k² 之间,但 k 往往是一个较小的值,介于 2 和 16 之间。
我们测试过的不同架构包括:
这里我们有一些结果:
模型 | 测试准确度 | 测试精度 | 测试回忆 | 测试F1分数 | 参数数量 | 卷积层 |
---|---|---|---|---|---|---|
1层MLP | 0.922 | 0.922 | 0.921 | 0.921 | 7850 | - |
卷积网络(小) | 0.976 | 0.976 | 0.976 | 0.976 | 2740 | [5,1] k=[3,3] |
ConvNet(中等) | 0.991 | 0.991 | 0.991 | 0.991 | 157 030 | [5,5] k=[3,3] |
ConvNet(大) | 0.995 | 0.995 | 0.995 | 0.995 | 887530 | [32,1,2,1] k=[5,5,3,3] |
KANConv 和 MLP | 0.985 | 0.985 | 0.984 | 0.984 | 163,726 | 坎康夫[5,5]k=[3,3] |
简单的Conv和KAN | 0.980 | 0.980 | 0.980 | 0.980 | 37 030 | [5,1] k=[3,3] |
坎坎 | 0.987 | 0.987 | 0.987 | 0.987 | 94,650 | 坎康夫[5,5]k=[3,3] |
卷积层中的列表在每个元素中包含卷积数量以及相应的内核大小。
基于 28x28 MNIST 数据集,我们可以观察到 KANConv & MLP 模型与 ConvNet (Big) 相比达到了可接受的精度。然而,不同之处在于,KANConv & MLP 所需的参数数量比标准 ConvNet 所需的参数数量少七倍。此外,KKAN 的准确度比 ConvNet Medium 低 0.04,参数数量几乎只有一半(94k vs 157k),这显示了该架构的潜力。需要对更多数据集进行实验才能得出一定的结论。
KAN 卷积的实现是一个很有前途的想法,尽管它仍处于早期阶段。我们已经进行了一些初步实验来评估 KAN 卷积的性能。我们之所以说是初步的,是因为我们想尽快发布这个想法,以便社区可以开始研究它。
我们知道有许多超参数需要调整,并且需要进行许多实验。在接下来的几天和几周内,我们将彻底调整模型和用于比较的模型的超参数。我们尝试了超参数和架构的一些变化,但这是启发式的,没有使用任何精确的方法。我们还认识到,由于计算能力和时间原因,我们没有使用大型或更复杂的数据集,我们正在努力解决这一问题。
未来我们将在更复杂的数据集上进行实验,这意味着 KANS 的参数数量将会增加,因为我们需要实现更多的 Kan 卷积层。
目前,与传统卷积网络相比,我们还没有看到 KAN 卷积网络的性能有显着提高。我们认为这是因为我们使用的是简单的数据集和小模型,因为我们的架构的优势在于与我们尝试过的最佳架构(ConvNet Big,这是一个不公平的比较,因为它需要的参数要少得多)其大小)。最后连接相同 MLP 的 2 个相等卷积层和 KAN 卷积层之间的比较显示,经典方法稍胜一筹,准确度提高了 0.06,而 KAN 卷积层和参数数量几乎一半的 KAN 线性层则减少了 0.04准确性。我们相信,随着模型和数据集复杂性的增加,我们将看到 KAN 卷积网络的性能显着提高。而且随着维度输入的增加,我们模型的参数数量也会增长得更快。
git clone git@github.com/AntonioTepsich/ckan.git
cd ckan
pip install -r requirements.txt
只需将文件复制kan_convolutional
到您的项目并导入即可。
from kan_convolutional.KANConv import KAN_Convolutional_Layer
为 MNIST 构建 KANConv
import torch
from torch import nn
import torch.nn.functional as F
from kan_convolutional.KANConv import KAN_Convolutional_Layer
class KANC_MLP(nn.Module):
def __init__(self,device: str = 'cpu'):
super().__init__()
self.conv1 = KAN_Convolutional_Layer(
n_convs = 5,
kernel_size= (3,3),
device = device
)
self.conv2 = KAN_Convolutional_Layer(
n_convs = 5,
kernel_size = (3,3),
device = device
)
self.pool1 = nn.MaxPool2d(
kernel_size=(2, 2)
)
self.flat = nn.Flatten()
self.linear1 = nn.Linear(625, 256)
self.linear2 = nn.Linear(256, 10)
def forward(self, x):
x = self.conv1(x)
x = self.pool1(x)
x = self.conv2(x)
x = self.pool1(x)
x = self.flat(x)
x = self.linear1(x)
x = self.linear2(x)
x = F.log_softmax(x, dim=1)
return x
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。