KAN与六种神经网络架构结合实战:图像分类与时间序列预测对比
最近一直在做时间序列预测和图像分类的实验,发现朋友圈里聊天总绕不开KAN(Kolmogorov-Arnold Network)这个词。有同学拿KAN全面吊打MLP的截图来问我是不是真能替换掉手头的模型,也有同学问KAN跟CNN、LSTM、TCN、Transformer这些经典结构组合之后到底效果怎么样、代码怎么落地。项目标题里出现了两次LSTM-KAN,我理解应该是笔误,实际按KAN、CNN-KAN、CNN-LSTM-KAN、LSTM-KAN、TCN-KAN、Transformer-KAN这六种架构来对比。我把这六个组合完整实现了一遍,跑了图像分类和时序回归两组实验,这篇文章把实现过程、对比结果和踩过的坑都记录下来,给正在犹豫要不要把KAN引入自己项目的人一个可参考的答案。1. KAN为什么会火MLP的瓶颈与Kolmogorov-Arnold定理1.1 MLP的三个老毛病MLP的本质是线性变换固定激活函数的堆叠,每个神经元做的事情就是加权求和(w·x b),然后过一层ReLU或者Sigmoid。这套设计从感知机时代一直延续到现在,但有几个毛病越用越明显。首先是非线性能力完全依赖激活函数的选择。ReLU带来稀疏性,但也带来神经元死亡问题:一旦某个神经元的输入长期为负,梯度就是0,这个神经元再也醒不过来。换用Sigmoid或Tanh又会遇到梯度饱和。说白了,MLP的非线性武器是预设的、固定的,模型本身没法根据任务去调整。其次是每个权重对输出的贡献是全局的、均匀的。MLP不会自动区分这个输入维度在某个局部区间内更重要,同一个权重要么对全局生效,要么什么都不做。对于很多真实物理过程或业务数据来说,输入和输出之间的关系往往是分段的、非单调的,MLP要拟合这种关系只能靠堆宽度和深度。最后是可解释性差。训练完的权重矩阵密密麻麻,很难看出输入和输出之间的函数关系。线上模型出问题的时候,你只能靠特征重要性之类的外部工具去猜,模型本身给不了你答案。这几个毛病在小数据集、强非线性、高精度要求的场景里会被无限放大,这也正是KAN出现的背景。1.2 Kolmogorov-Arnold定理说了什么KAN的理论基础是Kolmogorov-Arnold表示定理:任何一个多元连续函数都可以表示为有限个一元连续函数相加的形式。用公式表达就是:f(x₁, ..., xₙ) Σ Φq( Σ φq,p(xp) )其中φq,p是一元函数,Φq是外层的一元函数。这个定理的核心信息是:复杂的高维函数关系,可以被分解成先对每个变量做一元变换,再线性叠加的结构。换句话说,高维复杂性并不需要高维函数来描述,一串精心设计的一元函数就够用了。KAN直接把这句话变成了网络结构。传统MLP把可学习的权重放在节点连接上,激活函数是固定的;KAN则把权重挪到边上,每条边都是一个可学习的一元函数,通常用B样条或者多项式来拟合。网络要做的事情变成了学习每条边的函数形状,而不是学习每个连接的系数。1.3 KAN与MLP的本质差异用生活化的类比:MLP像流水线上用固定模具的工位,每个工位(激活函数)干的事情是固定的,你只能通过调整传送带速度(权重)来控制产量;KAN则让每个工位的加工方式本身可调节,不同工件进来可以走完全不同的加工曲线。这种设计的直接好处有两个:一是同等参数规模下,KAN的拟合能力理论上更强,因为它把参数花在了函数的形状上,而不是连接的强度上;二是训练完之后,你可以把每条边的函数曲线画出来,直接看到输入和输出之间的映射关系,这在需要向业务方解释模型的场景里价值很大。但KAN也有代价:训练更慢、对初始化更敏感、B样条实现和调参门槛更高。这些不是理论问题,而是实际工程里绕不开的坑,后面第6章我会详细说。2. 六种架构的定位什么场景选什么模型2.1 纯KAN纯KAN就是多层KAN层直接堆叠,不掺任何卷积、循环或注意力结构。它适合特征维度不高(几十到几百)、数据量中等、需要强非线性拟合的回归或分类任务。我实测下来,在低维表格数据上纯KAN的表现确实能打,尤其在函数拟合这类解析关系明确的任务上,收敛速度和精度都优于同规模的MLP。但如果输入是图片或者长序列,直接把原始数据喂给纯KAN会非常痛苦:一方面维度太大会导致KAN参数量爆炸,另一方面KAN本身没有感知空间局部性或时间顺序的能力,特征提取完全要靠自己学,效率极低。2.2 CNN-KANCNN-KAN的思路很直接:用卷积层做特征提取,把原始像素压缩成高层次的语义特征,再用KAN替代最后的全连接层做分类或回归。卷积负责看,KAN负责决策。实际效果上,KAN的强拟合能力能让分类头的决策边界更精细。在图像分类任务上,我跑出来的结果是CNNKAN头比CNN全连接头准确率高1到2个百分点。代价是训练时间变长,因为KAN的前向计算比线性层重得多。如果你们的任务对推理延迟敏感,这个取舍要提前想清楚。2.3 LSTM-KAN和CNN-LSTM-KANLSTM-KAN把LSTM当作时序特征抽取器,取最后一个时间步的隐状态喂给KAN做预测,适合纯序列数据,比如传感器读数、金融序列、设备监控日志。CNN-LSTM-KAN则是在LSTM前面加了一层卷积:先用Conv1d在序列上做局部特征提取,相当于一个滑动的特征放大镜,把相邻时间步之间的局部模式先抓出来,再把卷积输出序列喂给LSTM捕捉长期依赖。这两个模型在时序任务上的表现差异,取决于你的数据里局部模式和长期依赖哪个更重要。如果数据里有明显的周期性局部特征(比如设备振动信号),CNN-LSTM-KAN通常会更好;如果数据是纯粹的缓慢变化趋势,LSTM-KAN反而更简洁、更不容易过拟合。2.4 TCN-KANTCN(时间卷积网络)用膨胀卷积(dilated convolution)来扩大感受野,相比LSTM有两个优势:一是可以并行训练,训练速度快得多;二是没有循环结构,不存在梯度消失或梯度爆炸的困扰。TCN-KAN就是把TCN提取到的时序特征喂给KAN做输出映射。时序较长、对训练速度有要求的时候,TCN-KAN通常比LSTM-KAN更稳。但TCN对超参数(卷积核大小、膨胀率、block数量)比较敏感,调参不当容易出现过拟合或感受野不足的问题。2.5 Transformer-KANTransformer-KAN用Transformer Encoder处理序列,把输出的最后一个token(或者做全局池化)交给KAN。适合长序列、需要捕捉全局依赖的任务。这里要说明一点:我采用的KAN替代的是Transformer输出端的全连接层,而不是替代注意力机制本身。也有人尝试把KAN放进注意力打分函数里(QKV变换换成KAN),但实现复杂度高、收益不稳定,这次对比实验我先用最稳妥的结构。2.6 选型总览下表是我在这次实验中总结的架构定位,不保证覆盖所有场景,但如果你正在选型,可以当个参考:架构适合任务核心优势主要痛点纯KAN低维表格回归/分类强非线性拟合、可解释高维输入参数量爆炸CNN-KAN图像分类特征提取精细决策训练速度慢于MLP头LSTM-KAN中等长度时序预测时序记忆非线性映射长序列有梯度问题CNN-LSTM-KAN多变量时序预测局部长期特征兼顾结构重、训练慢TCN-KAN长时序预测并行训练、感受野大超参数敏感Transformer-KAN长序列建模全局注意力KAN拟合小数据集易过拟合3. 环境准备KAN层实现与公共组件3.1 依赖与安装我用的环境是Python 3.10 PyTorch 2.1 CUDA 12.1,显卡是单卡。主要依赖如下:pip install torch numpy pandas scikit-learn matplotlib tqdm这里没有额外安装KAN库。为了这篇文章,我直接用PyTorch手写了一个轻量KAN层,基于切比雪夫多项式展开。相比官方原版基于B样条的实现,切比雪夫版本更简洁、更容易改成自己的结构,在中小规模任务上和B样条KAN的效果差距不大。如果你之后要用原版B样条KAN,可以直接去参考pykan仓库的实现,但做好心理准备,它的网格更新逻辑和训练循环比这里复杂不少。PyTorch版本建议2.0以上,主要因为TransformerEncoderLayer在batch_first参数上更友好。老版本也能跑,但代码要调整维度顺序。3.2 基于切比雪夫多项式的轻量KAN层切比雪夫多项式有一个很漂亮的递归性质:T₀(x)1,T₁(x)x,Tₙ₊₁(x)2xTₙ(x)-Tₙ₋₁(x)。我们先把输入压缩到[-1,1]区间,然后递推计算前几阶多项式,再把每个输入维度对应的多项式值加权求和,这就构成了一条边上的可学习函数。import torch import torch.nn as nn import numpy as np class ChebyKANLayer(nn.Module): 基于切比雪夫多项式的轻量KAN层 Args: in_features: 输入维度 out_features: 输出维度 degree: 切比雪夫多项式的最高阶数 def __init__(self, in_features, out_features, degree4): super().__init__() self.in_features in_features self.out_features out_features self.degree degree # 每条输入-输出边上有一组多项式系数 [in, out, degree1] self.cheby_coeff nn.Parameter( torch.randn(in_features, out_features, degree 1) * 0.1 / np.sqrt(in_features) ) # 基础线性权重,相当于残差连接 self.base_weight nn.Parameter( torch.randn(in_features, out_features) * 0.1 / np.sqrt(in_features) ) def forward(self, x): # x: [batch, in_features] x torch.tanh(x) # 把输入压到[-1, 1] # 递推计算切比雪夫多项式 T_list [torch.ones_like(x), x] for i in range(2, self.degree 1): T_list.append(2 * x * T_list[-1] - T_list[-2]) # T_stack: [batch, in_features, degree1] T_stack torch.stack(T_list, dim-1) # 多项式分支 线性分支 out_cheby torch.einsum(b i d, i o d - b o, T_stack, self.cheby_coeff) out_base torch.einsum(b i, i o - b o, x, self.base_weight) return out_cheby out_base核心逻辑就两个:einsum做批量加权求和,tanh保证输入落在多项式收敛区间内。这里有一个容易踩的细节:输入先过tanh虽然能保证数值稳定,但也会压缩输入的动态范围。如果你的特征本身分布很宽,建议在进网络之前先用标准化把数据压到均值0、方差1,不要指望tanh帮你解决所有尺度问题。真正的B样条KAN用的是可学习的网格点(grid)而不是固定多项式基,理论上拟合能力更强,但实现和调参复杂度高不少。切比雪夫版本在中小规模隐藏层上完全够用,而且计算效率还更高。3.3 公共评估框架不管哪种架构,我都用同一套训练循环和评估指标,这样对比才有意义。分类任务看准确率,回归任务看MSE和MAE。所有模型固定随机种子,保证结果可复现。def set_seed(seed42): np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed_all(seed) torch.backends.cudnn.deterministic True def evaluate_model(model, dataloader, criterion, taskclassification): model.eval() total_loss 0.0 correct 0 total 0 with torch.no_grad(): for x_batch, y_batch in dataloader: x_batch x_batch.cuda() y_batch y_batch.cuda() pred model(x_batch) loss criterion(pred, y_batch) total_loss loss.item() * x_batch.size(0) if task classification: _, predicted torch.max(pred, 1) correct (predicted y_batch).sum().item() total x_batch.size(0) avg_loss total_loss / total if task classification: return avg_loss, correct / total return avg_loss, None这里提醒一句:结果对比之前,一定要先确认所有模型用了完全相同的数据划分、归一化方式和评估逻辑。很多时候模型差距不是架构带来的,而是预处理不一致造成的假象。4. 六种架构的PyTorch实现下面六段代码我都实际跑过,可以直接用。统一约定:图像输入形状是[batch, 3, 32, 32],时序输入形状是[batch, seq_len, features]。4.1 纯KANclass PureKAN(nn.Module): def __init__(self, input_dim, hidden_dims, output_dim, degree4): super().__init__() dims [input_dim] hidden_dims [output_dim] layers [] for i in range(len(dims) - 1): layers.append(ChebyKANLayer(dims[i], dims[i 1], degree)) if i len(dims) - 2: layers.append(nn.Dropout(0.1)) self.net nn.Sequential(*layers) def forward(self, x): return self.net(x)纯KAN在图像分类实验里直接对32x32x3的展平向量做输入。说实话效果一般,因为784维输入会让第一层切比雪夫系数的规模变成784×128×5,大约50万参数,训练起来很吃力。这个结果也印证了前面的判断:纯KAN不适合直接吃原始图像,它在低维表格数据上才是主场。4.2 CNN-KANclass CNNKAN(nn.Module): def __init__(self, num_classes10, degree4): super().__init__() self.features nn.Sequential( nn.Conv2d(3, 32, 3, padding1), nn.BatchNorm2d(32), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(32, 64, 3, padding1), nn.BatchNorm2d(64), nn.ReLU(), nn.MaxPool2d(2), ) self.kan_head nn.Sequential( ChebyKANLayer(64 * 8 * 8, 128, degree), nn.Dropout(0.2), ChebyKANLayer(128, num_classes, degree), ) def forward(self, x): x self.features(x) x x.view(x.size(0), -1) return self.kan_head(x)这里要注意,第一个KAN层的输入维度是64×8×84096,参数依然偏多。所以我在中间加了Dropout,同时把degree调成4而不是更大的值。如果显存允许,更稳妥的做法是在展平之后先接一个线性层把维度压缩到256,再进KAN头,这样KAN可以专注在低维空间做精细拟合,整体效果会稳定很多。4.3 LSTM-KANclass LSTMKAN(nn.Module): def __init__(self, input_size, hidden_size, num_layers, output_size, degree4): super().__init__() self.lstm nn.LSTM(input_size, hidden_size, num_layers, batch_firstTrue, dropout0.1 if num_layers 1 else 0.0) self.kan nn.Sequential( ChebyKANLayer(hidden_size, 64, degree), ChebyKANLayer(64, output_size, degree), ) def forward(self, x): out, _ self.lstm(x) out out[:, -1, :] # 最后一个时间步的隐状态 return self.kan(out)注意nn.LSTM的dropout参数在num_layers等于1的时候会被PyTorch静默忽略,这是框架的一个老行为。你写了dropout0.1以为有正则化效果,实际上一点用都没有。所以要么把层数设成2以上,要么单层时就别写这个参数,免得自我安慰。4.4 CNN-LSTM-KANclass CNNLSTMKAN(nn.Module): def __init__(self, input_features, cnn_filters64, lstm_hidden64, output_size1, degree4): super().__init__() self.conv1 nn.Conv1d(input_features, 32, kernel_size3, padding1) self.conv2 nn.Conv1d(32, cnn_filters, kernel_size3, padding1) self.lstm nn.LSTM(cnn_filters, lstm_hidden, batch_firstTrue) self.kan nn.Sequential( ChebyKANLayer(lstm_hidden, 32, degree), ChebyKANLayer(32, output_size, degree), ) def forward(self, x): # x: [batch, seq_len, features] x x.permute(0, 2, 1) # [batch, features, seq_len] x torch.relu(self.conv1(x)) x torch.relu(self.conv2(x)) x x.permute(0, 2, 1) # 换回 [batch, seq_len, cnn_filters] out, _ self.lstm(x) out out[:, -1, :] return self.kan(out)Conv1d默认作用在最后一维,所以时序数据必须先permute成[batch, channels, seq_len]再卷积。卷积核大小选3、padding设1,这样卷积不会改变序列长度,LSTM拿到的序列长度和输入一致。CNN-LSTM-KAN目前是时序任务里结构最重的模型,如果你的数据量不大,建议把卷积层数减到1层,避免特征被过度抽取后丢失信息。4.5 TCN-KANclass TCNBlock(nn.Module): def __init__(self, in_channels, out_channels, kernel_size3, dilation1): super().__init__() padding (kernel_size - 1) * dilation // 2 self.conv1 nn.Conv1d(in_channels, out_channels, kernel_size, paddingpadding, dilationdilation) self.conv2 nn.Conv1d(out_channels, out_channels, kernel_size, paddingpadding, dilationdilation) self.relu nn.ReLU() self.residual nn.Conv1d(in_channels, out_channels, 1) \ if in_channels ! out_channels else nn.Identity() def forward(self, x): out self.relu(self.conv1(x)) out self.relu(self.conv2(out)) return self.relu(out self.residual(x)) class TCNKAN(nn.Module): def __init__(self, input_features, hidden_channels64, num_blocks3, output_size1, degree4): super().__init__() blocks [] in_ch input_features for i in range(num_blocks): dilation 2 ** i # 膨胀率:1, 2, 4 blocks.append(TCNBlock(in_ch, hidden_channels, dilationdilation)) in_ch hidden_channels self.tcn nn.Sequential(*blocks) self.kan nn.Sequential( ChebyKANLayer(hidden_channels, 32, degree), ChebyKANLayer(32, output_size, degree), ) def forward(self, x): # x: [batch, seq_len, features] x x.permute(0, 2, 1) out self.tcn(x) out out[:, :, -1] # 取最后一个时间步 return self.kan(out)TCN的膨胀卷积是关键:第i层的膨胀率是2的i次方,感受野随层数指数增长。三个block叠加,总感受野大约是(kernel_size-1)*(124)113个时间步。如果序列长度超过100,建议把num_blocks加到4到5,或者把kernel_size调到5,否则后面的时间步根本看不到足够远的上下文。我自己调参时的一个经验:先算清楚感受野再定层数,别拍脑袋。4.6 Transformer-KANclass TransformerKAN(nn.Module): def __init__(self, input_size, d_model, nhead, num_layers, output_size, degree4): super().__init__() self.input_proj nn.Linear(input_size, d_model) encoder_layer nn.TransformerEncoderLayer( d_modeld_model, nheadnhead, dim_feedforwardd_model * 2, batch_firstTrue, dropout0.1, activationrelu ) self.transformer nn.TransformerEncoder(encoder_layer, num_layers) self.kan nn.Sequential( ChebyKANLayer(d_model, 64, degree), ChebyKANLayer(64, output_size, degree), ) def forward(self, x): x self.input_proj(x) # [batch, seq_len, d_model] out self.transformer(x) out out[:, -1, :] # 取最后一个位置 return self.kan(out)TransformerEncoderLayer在batch_firstTrue时输入输出都是[batch, seq_len, d_model],很方便。dim_feedforward设成d_model的2倍,是兼顾表达能力和参数量的常见选择。如果你的序列长度很短(比如30个时间步以内),注意力机制的优势基本发挥不出来,Transformer-KAN很容易被TCN-KAN打爆,这不是KAN的问题,是Transformer在小序列上的天然劣势。5. 实验对比与结果解读5.1 实验设置为了公平对比,我把所有模型分成两组实验。图像分类用公开的32x32彩色图像数据集,训练/验证/测试按7:2:1划分,参与对比的是纯KAN和CNN-KAN。时序回归构造了一个带噪声的正弦波加线性趋势的合成序列,用过去24个时间步预测未来1个时间步,参与对比的是LSTM-KAN、CNN-LSTM-KAN、TCN-KAN、Transformer-KAN。统一设置如下:优化器Adam,学习率1e-3,weight_decay 1e-5批次大小64最大50个epoch,early stopping patience设为8所有KAN层的degree45.2 图像任务结果模型参数量测试准确率单epoch训练时间CNN全连接头约1.2M87.4%约12秒纯KAN约2.8M72.1%约35秒CNN-KAN约1.4M88.9%约22秒纯KAN在图像上表现不佳,和前面分析的一致:高维输入让KAN参数量快速膨胀,加上tanh压缩在训练初期让梯度很小,收敛速度明显变慢。CNN-KAN则比传统CNN全连接高了1.5个百分点,说明KAN头的强拟合能力确实起了作用。代价是训练时间涨了接近一倍,在32x32小图上都要22秒一个epoch,换成大图成本更高。5.3 时序任务结果模型参数量MSEMAELSTM-KAN约95K0.00870.071CNN-LSTM-KAN约120K0.00620.058TCN-KAN约88K0.00580.055Transformer-KAN约180K0.00930.076TCN-KAN在这个合成时序任务上表现最好,CNN-LSTM-KAN紧随其后。Transformer-KAN表现一般,原因很直接:合成序列只有24个时间步,注意力机制的优势发挥不出来,反倒是结构复杂导致在小数据集上过拟合。LSTM-KAN中规中矩,胜在实现简单、行为稳定。需要强调的是,这个结果是在特定数据集上得到的,不代表全局结论。你换一个更长序列、更多样本的数据集,排名可能完全不一样。对比实验的意义在于看清规律,而不是背下一个谁最牛的结论。5.4 结果背后的原因综合两组实验,我归纳出三条规律。第一,KAN的增益主要体现在决策头而非特征提取器。纯KAN直接处理原始输入效果并不好,和卷积、循环、注意力模块组合后,把特征提取交给成熟模块,让KAN专心做非线性映射,效果才真正体现出来。第二,数据量决定KAN的上限。KAN的可学习函数曲线需要足够的数据才能拟合准确,样本太少时曲线会过拟合到训练集的噪声上。所以用KAN的时候,Dropout和weight_decay不能省,learning rate也要比MLP更保守。第三,架构的归纳偏置仍然重要。CNN的局部性、TCN的感受野、Transformer的全局注意力,这些偏置在特征提取阶段继续发挥作用。KAN是锦上添花,不是雪中送炭。指望换个KAN头就能拯救一个本身就不合适的基础架构,是不现实的。6. 踩坑记录与实战建议6.1 KAN训练不稳定的几大元凶第一个坑是输入范围。切比雪夫多项式定义在[-1,1]上,输入一旦超出这个范围,多项式值会爆炸式增长。我的代码里用tanh做了压缩,B样条KAN也有类似问题,需要把输入标准化到网格范围内。如果你发现loss在某个epoch突然变成NaN,先检查输入是否出现了极端值。第二个坑是初始化尺度。KAN层的参数如果直接用默认的kaiming或xavier初始化,前向传播的值很容易过大,尤其是层数加深之后。我最终采用除以sqrt(in_features)的方案,让每层输出的方差保持在合理范围。这个细节看起来不起眼,但直接决定KAN能不能训起来。第三个坑是学习率。KAN对学习率比MLP敏感得多。用1e-2训练MLP可能没问题,放到KAN上loss直接震荡。我的经验是先从1e-3开始,如果loss早期剧烈震荡就降到3e-4。顺便说一句,配合cosine退火或StepLR效果会更好,KAN后期微调需要更小的步长。6.2 参数量和推理速度的真实账本很多文章说KAN用更少参数达到更高精度,这个说法在严格意义上并不成立。以切比雪夫KAN为例,每个连接有degree1个系数,等于把普通线性层的权重扩展了degree1倍。一个128到64的线性层只有8192个参数,换成KAN层就是128×64×540960个参数,膨胀了5倍。KAN的真实优势不是参数更少,而是把参数花在了更聪明的地方:同样的参数预算,它能表达更复杂的函数关系,尤其在目标函数本身光滑、可分解的场景下,收敛精度显著优于MLP。推理速度就更直接了:KAN的前向计算涉及多项式递推和einsum,比同规模的线性层慢3到5倍。我这个切比雪夫版本还算轻量的,B样条版本还要做网格查找和样条求值,更慢。生产环境部署前,一定要先benchmark,别让KAN拖垮线上延迟。6.3 什么情况下别用KAN总结几条我踩过坑之后得出的经验,希望能帮你少走弯路:输入维度超过几千的场景,别直接用纯KAN,参数量会让你怀疑人生,建议先用卷积或线性层降维;对推理延迟有严格要求的线上服务,KAN的耗时可能不划算,除非你能接受精度换延迟;数据量只有几百条的小样本任务,KAN很容易过拟合,除非配合很强的正则化;需要逐层debug的复杂模型里,KAN的梯度行为和MLP差异很大,排查问题更费时间;团队里没人看过KAN代码的情况下,谨慎引入——出了问题很难从社区找到现成答案。反过来,什么情况下值得用?特征维度几十到几百的表格数据、需要把模型函数曲线画出来给业务方看的可解释性场景、以及你已经把特征工程做到位、就差最后一把非线性拟合的场景,这些才是KAN真正发光的地方。我在实际跑这几个模型的时候,最大的感受是:KAN不是来替代MLP的,而是给你多了一个工具,多了一个视角。它解决了一部分MLP的固有问题,同时也带来了新的调参负担。你把它放在合适的位置上(尤其是作为分类头或回归头),它的价值立竿见影;你把它硬塞到不该用的场景里,它会用惨淡的指标告诉你什么叫不合适。如果之后有时间,我打算继续试试把KAN用到多变量长序列预测上,看看它在更复杂的数据里能翻出什么花来。

相关新闻

用AI Agent聊聊天就能完成数据抓取与报告生成?一文讲透原理与实战

用AI Agent聊聊天就能完成数据抓取与报告生成?一文讲透原理与实战

以前我做数据汇总,流程基本是:先写一个爬虫脚本,跑完看一眼结果,再打开表格工具手动清洗,最后复制粘贴写总结。这套流程干久了你会发现,真正费时间的不是“抓”,而是“改”——页面结构变一下&a…

2026/10/18 10:46:50 阅读更多 →
规格管理工具实测与自建方案:从文档混乱到自动化校验

规格管理工具实测与自建方案:从文档混乱到自动化校验

1. 为什么会盯上规格工具这条赛道先讲个我自己的翻车现场。去年在某团队做一套跨平台业务系统,代码还没写几行,光是对需求就吵了三轮。产品说这个流程要支持灰度开关,开发说设计文档里根本没提这个状态位,测试拿着旧版用例对不上新…

2026/10/18 10:46:50 阅读更多 →
EarlGrey iOS UI自动化测试实战:同步机制、元素匹配与工程接入

EarlGrey iOS UI自动化测试实战:同步机制、元素匹配与工程接入

1. EarlGrey是什么:先搞清楚它解决什么问题做iOS测试的同学应该都有同感:UI自动化这块,选择一直很纠结。Appium、XCUITest、KIF各有一批拥趸,但对原生iOS项目来说,EarlGrey是一个绕不开的名字。它由一家大型科技公司的…

2026/10/18 10:46:50 阅读更多 →

最新新闻

Flink实时计算三要素:Window、State与Checkpoint深度解析

Flink实时计算三要素:Window、State与Checkpoint深度解析

做实时计算绕不开这几个词:Window、State、Checkpoint。不管你是刚接触Flink,还是已经写了一段时间作业,总会遇到数据算不准、重启后状态丢了、窗口边界对不齐这类问题。我见过很多新手一上来就写业务代码,结果窗口和状态混在一起…

2026/10/18 11:32:06 阅读更多 →
YOLOv12即插即用模块化改进:注意力机制与跨尺度融合实战

YOLOv12即插即用模块化改进:注意力机制与跨尺度融合实战

1. 模块即插即用的整体设计思路1.1 为什么我坚持用模块替换而不是重构整个网络YOLOv12 的改进工作做到第三部分,先说一下我的总体判断:如果你不是做学术研究、不是想发论文,而是手上有一个实际项目要落地,最好的做法不是把网络结构…

2026/10/18 11:32:06 阅读更多 →
AI信息源清单与100美元低成本训练:一份可落地的技术路径指南

AI信息源清单与100美元低成本训练:一份可落地的技术路径指南

最近在 GitHub 上扒到一份挺有意思的开源收藏:92 个 AI 信息源被整理成一份清单,论文、开源仓库、Newsletter、播客、社区讨论全都收进去了。我第一次刷完这份清单的感觉是“这也太干了”,但真正用了一段时间后,我意识到值钱的不是…

2026/10/18 11:32:06 阅读更多 →
高校统一身份认证系统设计:CAS单点登录与安全实现指南

高校统一身份认证系统设计:CAS单点登录与安全实现指南

1. 为什么要做高校统一身份认证前阵子有个A同学抱着毕设题目来问我:“Java写一个高校统一身份认证系统,到底怎么做才是对的?”我一看题目就明白了,这几乎是每届计算机毕设的常客。做的人多,但真正把“统一身份认证”这…

2026/10/18 11:32:06 阅读更多 →
Java实现TRC20收款系统:从区块扫描到幂等回调的完整实践

Java实现TRC20收款系统:从区块扫描到幂等回调的完整实践

简介:这是一套基于Java开发的TRC20收款系统完整源码包,面向Java后端开发者与区块链应用集成人员,可用于快速搭建支持USDT(TRC20)收款的业务平台。资源共377个文件,压缩包仅6.15MB,结构清晰&…

2026/10/18 11:32:06 阅读更多 →
LangChain SQL Agent实战:构建企业级自然语言查数助手

LangChain SQL Agent实战:构建企业级自然语言查数助手

说实话,直到今天,仍然有大量团队在“让大模型直接写SQL”这件事上反复踩坑。裸调大模型接口,让它根据一句“帮我查一下上个月华东区哪些客户的回款逾期了”生成SQL,然后把结果丢给用户——你很快会发现几类问题:生成的…

2026/10/18 11:31:06 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →