创新概念:柯尔莫哥洛夫-阿诺德网络

news2024/11/16 20:53:03

文章目录

  • 一、说明
  • 二、基础概念
  • 三、kolmogorov-Arnold 网络性质
    • 3.1 KAN 的潜在优势
    • 3.2 挑战和注意事项
  • 四、基本 KAN 超参数
  • 五、COLAB 代码
  • 六、注意点

一、说明

kolmogorov-Arnold 网络 (KAN) 是深度学习领域的一项“创新”,它提供了一种受现有 Kolmogorov-Arnold 表示定理启发的构建神经网络的新方法。它们被认为是广泛使用的多层感知器 (MLP) 的潜在替代品,而 MLP 为许多深度学习应用提供了支持。

二、基础概念

虽然 MLP 在节点(“神经元”)上具有固定的激活函数,但 KAN 在边缘(“权重”)上具有可学习的激活函数。KAN 根本没有线性权重——每个权重参数都被参数化为样条函数的单变量函数取代,从而允许在粗粒度和细粒度网格之间切换。

在这里插入图片描述

如果f是有界域上的多元连续函数,则f可以写成单变量连续函数与二元加法运算的有限组合。

在这里插入图片描述
其中 ϕq,p : [0, 1] → R 且 Φq : R → R。对于下一层l,我们有:
在这里插入图片描述
其中 Φ l是第 l个 KAN 层对应的函数矩阵。一般的 KAN 网络是由 L 层组成的:给定一个输入向量x0 ∈ R ,KAN 的输出为
在这里插入图片描述
在数学中,符号“◦”通常用来表示函数组合。

工作原理如下:

  • 假设有两个函数,f(x) 和 g(x)。
  • 函数组合,表示为f ∘ g(读作“f 与 g 组合”),是通过先应用g(x) ,然后取g(x)的输出并将其作为f(x)的输入来创建的一个新函数。
    它将高维函数分解为几个一维函数,得到 α = k+1(其中 k 是样条函数的分段多项式阶)。

分段多项式函数是由其域内不同区间的不同多项式函数定义的函数。它本质上是将较简单的多项式片段拼接在一起以创建更复杂的函数。

从数学上来说,它被写成:

( f ∘ g ) ( x ) = f ( g ( x ) ) (f ∘ g)(x) = f(g(x)) (fg)(x)=f(g(x))

这基本上意味着您对输入值x执行g(x),然后获取结果输出并将其插入f(x)以获得最终答案。
以下是关于函数组合的一些要点:

  • 顺序很重要:(f ∘ g)(x) 通常与 (g ∘ f)(x) 不同,这意味着函数组合是非交换的。
  • 函数组合可以与多个函数链接在一起。例如, (h ∘ f ∘ g)(x) 将首先应用g(x) ,然后将f应用于g的输出,最后将h应用于f的输出。

西虽然 MLP 依赖于在隐藏层内的每个神经元上应用的固定激活函数(如 ReLU 或 sigmoid),但 KAN 采用​​了不同的方法。它们将重点放在神经元之间的连接(边缘)上。它们的区别如下:

  • MLP: MLP 中的激活函数是预定义的非线性函数。它们为网络引入了学习输入数据和期望输出之间复杂关系的基本能力。神经元之间的连接带有简单的权重,这些权重在训练期间会进行调整。
  • KAN: KAN 不会在每个神经元上使用固定的激活函数,而是在边缘本身上使用可学习的激活函数。这些激活函数是使用基函数(如B 样条函数)构建的。将基函数想象成可以组合起来创建更复杂函数的构建块。通过学习这些基函数的系数,KAN 可以在每个连接上实现高度灵活且富有表现力的激活函数。值得注意的是,KAN 完全从网络中移除了传统的线性权重,所有权重参数都被边缘激活函数中的系数所取代。

三、kolmogorov-Arnold 网络性质

3.1 KAN 的潜在优势

  • 提高准确率:与 MLP 的固定激活相比,KAN 中的可学习激活函数有可能捕捉数据中更复杂的关系。这种灵活性可以使模型在特定任务上表现出色,尤其是那些涉及复杂模式的任务。
  • 可解释性增强:与 MLP(黑匣子)的不透明性不同,KAN 提供了一定程度的可解释性。通过分析学习到的基函数系数,研究人员可以深入了解网络如何做出决策。这对于理解模型的内部工作原理并进一步提高其性能非常有价值。这将消除许多采用障碍,尤其是在人工智能监管过度的国家。

3.2 挑战和注意事项

  • 增加训练时间:学习激活函数中基函数系数的过程可能耗费大量计算资源。与 MLP 相比,这意味着 KAN 需要更长的训练时间和更多的 RAM 需求,尤其是对于复杂的网络架构而言。
  • 超参数调整: KAN 引入了与所用基函数的选择和数量相关的新超参数。与调整更简单的 MLP 架构相比,找到这些超参数的最佳配置需要付出更多努力。
    KAN 可能对所有事物都过度拟合:在这个实验中,KAN 将特征中的纯随机数据与提供的标签进行拟合,准确率极高。这很麻烦。
    与 MLP 一样,KAN 具有必须在训练期间进行调整的超参数。以下是 Kolmogorov-Arnold 神经网络中宽度、网格和 k 的细分:

四、基本 KAN 超参数

  • 宽度width

在标准神经网络中,宽度是指隐藏层中神经元的数量。在 KAN 中,该概念类似,但侧重于用于构建每层激活函数的基函数数量。
更广泛的 KAN(更多基础函数)允许更复杂、更具表现力的激活,从而有可能在特定任务上带来更好的性能。
然而,增加宽度也会导致更长的训练时间和潜在的过度拟合。

  • 网格grid

KAN 利用B 样条(或类似技术)来定义激活函数。这些 B 样条是在点网格上构建的。
网格定义了激活函数运行的间隔及其可以捕获的细节级别。
更精细的网格(更多点)可以捕获数据中更精细的细节,但也会增加计算成本和过度拟合。

  • k

此参数与激活函数中使用的B 样条函数的具体类型有关。它决定了B 样条函数的平滑程度。正如你可能猜测的那样,我们也可以把 k 用作正则化工具。
较高的 k 值会导致B 样条曲线更平滑,从而可能提高训练期间的稳定性。
然而,非常高的 k 可能会限制激活函数的灵活性。

  • 关键点:

宽度、网格和 k 都是 KAN 中的超参数,需要进行调整才能在特定任务上获得最佳性能。
在选择这些值时,需要在表达力、训练时间和潜在的过度拟合之间进行权衡。
在 KAN 中,每条边的索引为 ( l,i,j ),其中l 是层索引,i是输入神经元索引,j是输出神经元索引。当我们为每一层、输入和输出神经元创建公式时,您将看到这一点。

五、COLAB 代码

我们从 Colab 开始安装必要的库:

!pip install pykan==0.0.5 -q

数据集可以在kaggle上找到,与信用卡欺诈有关。“该数据集包含欧洲持卡人在 2013 年 9 月通过信用卡进行的交易。该数据集显示两天内发生的交易,在 284,807 笔交易中,有 492 笔是欺诈交易。该数据集非常不平衡,正类(欺诈)占所有交易的 0.172%。

它仅包含数值输入变量,这些变量是 PCA 转换的结果。[…] 特征 V1、V2、…V28 是通过 PCA 获得的主要成分,唯一没有通过 PCA 转换的特征是“时间”和“金额”。特征“时间”包含数据集中每笔交易与第一笔交易之间经过的秒数。特征“金额”是交易金额,此特征可用于基于示例的成本敏感学习。特征“类别”是响应变量,在存在欺诈的情况下取值为 1,否则取值为 0。”

获取 CSV 文件并添加到您的 Google Drive文件夹。然后:

from google.colab import drive
drive.mount('/content/drive')

然后转到 CSV 所在的文件夹:

%cd /content/drive/My Drive/folder/

我们已经准备好开始了:

from kan import KAN
import matplotlib.pyplot as plt
import torch
import numpy as np
import pandas as pd
from scipy import stats

## DATASET AT : https://www.kaggle.com/datasets/mlg-ulb/creditcardfraud

df=pd.read_csv('creditcard.csv').reset_index()
df=df.iloc[:,1:]
df.shape

数据形状:(284807, 31)

如果有必要,我们会删除缺失的值。

df=df.dropna().sample(frac=1)
df.shape

对于变量选择,我使用了一个简单的 t 检验,这是一种统计检验,用于比较两组的平均值以确定它们之间是否有显著差异。它可以用来评估连续变量的平均值在分类变量定义的类别之间是否有差异。差异越大越显著,从选择该变量中获得的信息就越多。

# t-test
selected=[]
for i in range(1,df.shape[1]-1):
    t_stat, p_value = stats.ttest_ind(df[df.Class==0].iloc[:,i], df[df.Class==1].iloc[:,i])
    if p_value<0.01 and abs(t_stat>19):
        selected.append(i)

我们选择 3 个变量,V12、V14 和 V17。现在我们准备数据,对其进行混洗并拆分训练/测试。在这里,您可能希望减少示例数量,以避免在下一步 ( model.symbolic_formula() ) 中耗尽计算机 RAM。

from sklearn.model_selection import train_test_split

dataset = {}
X_train, X_test, y_train, y_test = train_test_split(df.iloc[:,select], np.array(df.Class), test_size=0.2, random_state=42, shuffle=True)
dataset['train_input'] = torch.from_numpy(np.array(X_train))
dataset['test_input'] = torch.from_numpy(np.array(X_test))
dataset['train_label'] = torch.from_numpy(np.array(y_train))
dataset['test_label'] = torch.from_numpy(np.array(y_test))

X = dataset['train_input']
y = dataset['train_label']

我们定义KAN模型、第一个隐藏层、第二个隐藏层、深度和分段多项式:

model = KAN(width=[3,3], grid=3, k=3) 

在这里插入图片描述
我们还定义了训练和测试准确度的函数:

def train_acc():
    return torch.mean((torch.argmax(model(dataset['train_input']), dim=1) == dataset['train_label']).float())

def test_acc():
    return torch.mean((torch.argmax(model(dataset['test_input']), dim=1) == dataset['test_label']).float())

然后我们对 KAN 进行 20 个 epoch 的训练。由于我们处理的是分类问题,因此我们将使用 CrossEntropy 作为损失函数。

results = model.train(dataset, opt="Adam", steps=20, metrics=(train_acc, test_acc), loss_fn=torch.nn.CrossEntropyLoss())

在这里插入图片描述
请注意,更重要的权重更加明显,而不太重要的权重则逐渐消失:

model.plot(beta=0.2,scale=1.3,in_vars=[r'$x_{}$'.format(i) for i in range(1,4)])

在这里插入图片描述
让我们提取激活函数的值:l 是层索引,i是输入神经元索引,j是输出神经元索引。

让我们绘制所有的激活函数:

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots(3, 3, figsize=(6, 6))
l=0

# Iterate over all combinations of i, j
for i in range(3):
    for j in range(3):
        # Get the appropriate subplot
        inputs = model.spline_preacts[l][:, j, i]
        outputs = model.spline_postacts[l][:, j, i]
        rank = np.argsort(inputs)
        inputs = inputs[rank]
        outputs = outputs[rank]

        # Plot on the appropriate subplot
        ax[i, j].plot(inputs, outputs, marker="o")
        ax[i, j].set_title(f'l={l}, i={i}, j={j}')

# Adjust layout
plt.tight_layout()
plt.show()

在这里插入图片描述
接下来,我们修剪模型并重新训练:

model = model.prune()
model(dataset['train_input'])
results = model.train(dataset, opt="Adam", steps=20, metrics=(train_acc, test_acc), loss_fn=torch.nn.CrossEntropyLoss());
results['train_acc'][-1], results['test_acc'][-1]

在这里插入图片描述

model.plot()

在这里插入图片描述

model.fix_symbolic(0,0,0,'sin') # Symbolification
model.plot(beta=0.2)

在这里插入图片描述

model.unfix_symbolic(0,0,0)
model.plot(beta=0.2)

在这里插入图片描述
现在我们将获得包含这 3 个变量(输入、第 1 层中的变量/激活 B 样条、第 2 层中的变量/激活 B 样条)的所有符号公式:

lib = ['x','x^2','x^3','x^4','exp','log','sqrt','tanh','sin','tan','abs']
model.auto_symbolic(lib=lib)
formula = model.symbolic_formula()[0][0]

在这里插入图片描述

formula1, formula2,formula3 = model.symbolic_formula()[0]
formula1

在这里插入图片描述
正如您所注意到的,我们在这个公式中加入了权重,这使得它具有可解释性,这与 MLP 不同。现在我们来检查一下这个公式的准确性。在下面的代码中,subs是一种逐项用变量值替换公式中的值的方法:

# how accurate is this formula? subs == substitute value in formula by variable value
def acc(formula1, formula2,formula3, X, y):
    batch = X.shape[0]
    correct = 0
    for i in range(batch):
        logit1 = np.array(formula1.subs('x_1', X[i,0]).subs('x_2', X[i,1]).subs('x_3', X[i,2])).astype(np.float64)
        logit2 = np.array(formula2.subs('x_1', X[i,0]).subs('x_2', X[i,1]).subs('x_3', X[i,2])).astype(np.float64)
        logit3 = np.array(formula3.subs('x_1', X[i,0]).subs('x_2', X[i,1]).subs('x_3', X[i,2])).astype(np.float64)
        correct += (logit3 > logit2 > logit1) == y[i]
    return correct/batch

print('train acc of the formula:', acc(formula1, formula2,formula3, dataset['train_input'], dataset['train_label']))
print('test acc of the formula:', acc(formula1, formula2,formula3, dataset['test_input'], dataset['test_label']))

在这里插入图片描述
在原文中,每个B 样条函数的公式(或方程)都是按顺序排列的,以确保函数f的正确表示和近似。B样条函数是在特定区间内定义的,并且它们的支撑(非零区域)是有限的。因此,按顺序排列B 样条方程可确保通过将这些基函数以线性组合的形式相加,从而准确地重建函数f在其整个域上的值。

此外,这种有序结构对于近似界限至关重要。该定理依赖于B 样条函数的有序应用,以网格大小G为依据提供近似误差的界限。这种有序应用保持了近似所需的连续性和可微性。

按照这个顺序,我们可以系统地细化网格(从粗到细),同时保持近似过程的准确性和稳定性。这种方法对于确保近似误差随着网格变得更细而减小至关重要,这是基于样条的近似理论的一个关键方面。

logit1 = np.array(formula1.subs('x_1', X[i,0]).subs('x_2', X[i,1]).subs('x_3', X[i,2])).astype(np.float64)
logit2 = np.array(formula2.subs('x_1', X[i,0]).subs('x_2', X[i,1]).subs('x_3', X[i,2])).astype(np.float64)
logit3 = np.array(formula3.subs('x_1', X[i,0]).subs('x_2', X[i,1]).subs('x_3', X[i,2])).astype(np.float64)

(logit1>logit2>logit3)

我们将会得到如下结果:

(155.2>143.7>162.5)

在这里插入图片描述

(logit1>logit2>logit3).astype(float)

在这里插入图片描述

六、注意点

H然而,在测试多个超参数和正则化因子设置时,我直觉地认为 KAN 绝对适合一切,甚至是随机数据。所以,我做了一个测试,我使用随机变量作为特征:

df.V12=np.random.random(df.shape[0])
df.V14=np.random.random(df.shape[0])
df.V17=np.random.random(df.shape[0])

输出如下:
在这里插入图片描述
请注意,无论是在训练集还是测试集中,准确率确实非常高。事实上,KAN 能够拟合任何连续函数,包括随机数据,其机制类似于向 MLP 添加不相关变量以提高准确率,但要极端得多。据说,通过适当的正则化、B 样条的平滑度和网络的深度,KAN 找到最佳拟合的机会比 MLP 更高。但这种说法需要实证支持,需要更多的研究。

有趣的是,作者在论文中指出,“柯尔莫哥洛夫-阿诺德表示定理在机器学习中基本上被判了死刑,被认为理论上合理但实际上毫无用处[1][2]”。

请注意,我采取了一种批判性的方法,强调需要对这种过度拟合问题的原因进行更深入的分析。我并不是想贬低 KAN。但在 MLP 中,至少我们有垃圾进垃圾出问题,MLP 不会无差别地适应一切。

根据 [2],柯尔莫哥洛夫定理是一个迷人的数学定理,它告诉我们如何用更简单的函数(仅依赖于一个变量的函数)来表示复杂函数(依赖于多个变量的函数),就像我们之前看到的一样。这对于设计神经网络来说可能非常有用,神经网络本质上是我们用来逼近复杂函数的工具。

然而,早在 1989 年,[2] 就指出柯尔莫哥洛夫定理对于创建实用的神经网络没有帮助,原因如下:

  1. 辅助函数的复杂性:为了使柯尔莫哥洛夫定理奏效,它使用了一些更简单的函数(我们称之为“辅助函数”)。但为了使该定理成立,这些辅助函数往往非常复杂。如果我们希望这些辅助函数平滑(以处理噪音)且易于使用,该定理就无法按预期发挥作用。另一位名叫维图什金的数学家早在 1954 年就证明了这一点。在 KAN 中,这是可调的,我们也有正则化工具。

  2. 辅助函数的特殊性:在实际的神经网络中,我们希望我们的网络具有固定的结构,我们可以对其进行调整以适应不同的问题。在 Kolmogorov 的设置中,我们需要的特定辅助函数实际上取决于我们试图表示的特定函数。这意味着对于每个新问题,我们都需要一组完全不同的辅助函数。嗯,MLP 也存在这个问题,这就是 CNN 存在的原因,也是我们将 MLP 微调到特定领域的原因。

  3. 实践中的复杂性:即使我们可以使用该定理,辅助函数最终也可能与我们试图近似的原始函数一样复杂。这违背了目的,因为我们想要一种更简单的方法来处理和计算这些函数。这一点引起了我的注意,因为 35 年后,KAN 和 MLP 都存在这个问题。我看到到处都是数学体操,试图解决只有认识论颠覆才能解决的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1960657.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【时时三省】(C语言基础)循环语句do while循环

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ——csdn时时三省 do语句的语法 do 循环语句&#xff1b; while(表达式)&#xff1b; 表达式为真继续循环 表达式为假停止 示例: break和cobtinue的运用 示例: cobtinue会跳出这个括号 到while 接着一直循…

Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 | 1/2(含分析过程)

Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 | 1/2&#xff08;含分析过程&#xff09; 目录 Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 | 1/2&#xff08;含分析过程&#xff09; 一、简单介绍 二、机器学习 1、为什么使用机器学习&a…

Qt6 qml文件导入系统组件时不再需要版本号

qt开发中&#xff0c;以往在Qt5中&#xff0c;我们导入quick组件的时候总是要写版本号&#xff0c;挺麻烦的&#xff0c;而现在Qt6中qml导入组件无需再使用版本号了。直接导入即可。 import QtQuick import QtQuick.Controls import QtQuick.Window 想要看是否有这个组件&…

【题解】2024牛客多校第5场

E 安 https://ac.nowcoder.com/acm/contest/81600/E 分析 简单博弈 / 思维题。 当 ai > bi 时&#xff0c;当前骑士一定存活。 当 ai < bi 时&#xff0c;当前骑士一定死亡。 为了使得自己存活的骑士尽可能多&#xff0c;若存在 ai bi 的情况&#xff0c;一定会选…

XXE-lab-master靶场:PHP_xxe

目录 有回显 测试回显位置 构建payload 无回显数据外带 构建payload 漏洞修复 XXE-lab是一个一个包含php,java,python,C#等各种语言版本的XXE漏洞靶场。 下载地址&#xff1a;https://github.com/c0ny1/xxe-lab 将PHPStudy的中间件与版本信息调制为 php-5.4.29Apache 以…

【测试】博客系统的测试报告

项目背景 个人博客系统采用了 SSM 框架与 Redis 缓存技术的组合 &#xff0c;为用户提供了一个功能丰富、性能优越的博客平台。 在技术架构上 &#xff0c;SSM 框架确保了系统的稳定性和可扩展性。Spring 负责管理项目的各种组件 &#xff0c;Spring MVC 实现了清晰的请求处理…

【Linux系统】POSIX信号量 线程池

PISIX信号量 概念 POSIX信号量和SystemV信号量作用相同&#xff0c;都是用于同步操作&#xff0c;达到无冲突的访问共享资源目的。 但POSIX可以用于线程间同步。 引入环形队列的概念 环形队列&#xff1a;当队列为空||为满时 head end&#xff0c;我们发现这样无法区分为空…

Springboot2.6.13整合flowable6.8.1

背景 项目上需要使用到工作流相关内容&#xff0c;比对了好久采用flowable实现&#xff0c;该插件和activiti等很相似&#xff0c;基本上可以直接移植 代码如下 <!-- 父引用用--><parent><groupId>org.springframework.boot</groupId><artifactI…

LLM的训练与推断

LLM的训练与推断 目前比较流行的大模型一般都是自回归模型。在推理时&#xff0c;它类似于RNN&#xff0c;每次计算下一个token的概率。也就是说&#xff0c;如果除去最开始的输入情况下&#xff0c;最终推理长度为n的话&#xff0c;就需要计算n次。但是训练却是并行化的。 在…

你想活出怎样的人生?我只活一次,所以想做自己

你好&#xff0c;我是腾阳。 在这纷繁复杂的世界中&#xff0c;我们每个人都像是一颗颗星星&#xff0c;闪烁着自己的光芒。 然而&#xff0c;在这光芒背后&#xff0c;有多少人真正了解自己&#xff0c;又有多少人敢于追随内心的声音&#xff0c;去追寻那些看似遥不可及的梦…

arduino程序-程序函数2(led电路及相关函数)(基础知识)

arduino程序-程序函数2&#xff08;led电路及相关函数&#xff09;&#xff08;基础知识&#xff09; 1-9 程序函数2&#xff08;led电路及相关函数&#xff09;点亮LED需要Blink程序PinMode(LED_BUTTIN,OUTPUT)DigitalWrite(LED_BUILTIN,HIGH)第一个参数(13/LED_BUILTIN)第二个…

由浅入深的了解进程(1)

进程 1、冯诺依曼体系结构(硬件)2、操作系统(软件)2、1、概念2、2、结构示意图(简略版)3、3、尝试理解操作系统 1、冯诺依曼体系结构(硬件) 大多数常见的计算机&#xff0c;类似笔记本或者是台式电脑&#xff0c;包括不常见的计算机&#xff0c;类似服务器&#xff0c;大多遵循…

安装python插件命令集合

安装python插件pyecharts库 pip install pyecharts -i https://pypi.tuna.tsinghua.edu.cn/simple 安装python插件pandas库 pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple PyCharm 中安装步骤&#xff1a;

Linux安装TrueNAS(网络附加存储)教程 –第1部分

TrueNAS CORE&#xff08;原名FreeNAS&#xff09;是一款流行的存储系统&#xff0c;可帮助您构建自己的高质量存储设置&#xff0c;而无需支付软件费用。您可以将其安装在计算机硬件或虚拟机 (VM) 上&#xff0c;以获得开源存储的好处。 您可以在家中、办公室或数据中心使用T…

微信小程序云开发订单微信支付与小票和标签打印的完整高效流程

一个字“全”&#xff01;&#xff01;&#xff01; 前言一、流程设定1、如何开通云支付流程2、以订单下单为例的支付流程2.1 业务场景介绍2.2 业务场景流程图 二、代码与代码文件组成1、页面JS2、云函数payPre3、支付回调函数pay_cb3.1 准备条件3.2 必要认知3.3 pay_cb 完整函…

day03 3.文件IO 4.文件属性函数

作业 1> 使用文件IO完成&#xff0c;将源文件中的所有内容进行加密&#xff08;大写转小写、小写转大写&#xff09;后写入目标文件中 源文件内容不变 #include <myhead.h>int main(int argc, const char *argv[]) {if(argc ! 3) //判断打开的文件个数{printf(&quo…

【Python学习手册(第四版)】学习笔记10-语句编写的通用规则

个人总结难免疏漏&#xff0c;请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 本文较简单&#xff0c;5-10分钟即可阅读完成。介绍Python基本过程语句并讨论整体语法模型通用规则&#xff08;冒号、省略、终止、缩进、其他特殊情况&#xff0…

JavaFX布局-StackPane

JavaFX布局-StackPane 常用属性alignmentpadding 实现方式Java实现fxml实现 所有子节点堆叠在一起&#xff0c;通常最后一个添加的子节点会显示在最上面 常用属性 alignment 对齐方式 stackPane.setAlignment(Pos.CENTER_RIGHT); public enum Pos {/*** Represents positioni…

LeYOLO,一种用于目标检测的新型可扩展且高效的CNN架构

摘要 在目标检测中&#xff0c;深度神经网络的计算效率至关重要&#xff0c;尤其是随着新型模型越来越注重速度而非有效计算量&#xff08;FLOP&#xff09;。这一发展趋势在某种程度上忽视了嵌入式和面向移动设备的AI目标检测应用。在本文中&#xff0c;我们基于FLOP关注于高…

马斯克的Memphis AI超级计算中心:全球最强AI训练集群的诞生

引言 近期&#xff0c;马斯克宣布其最新的Memphis AI超级计算中心正式启动&#xff0c;这一新闻引发了科技界的广泛关注。该中心配备了10万块液冷H100 GPU&#xff0c;成为全球最强大的AI训练集群。本文将深入探讨Memphis AI超级计算中心的建设过程、技术细节、以及其对未来人…