用于在对偶空间中训练和修剪全连接层的工具。
项目描述
光谱工具
Spectrumtools 是一个用于频谱训练和分析全连接前馈神经网络的软件包。
根据我们的测试,它很好地集成在 Tensorflow 2.3 中
安装
激活要安装软件包的环境。
$ pip install spectraltools
用法
光谱层
该包包含可以导入的光谱全连接层,如下所示:
from spectraltools import Spectral
它是完全连接层的倒数空间中的表示。
该层可以在 Tensorflow 模型中使用,并具有三个主要属性:
from spectraltools import Spectral
Spectral(
units=300,
activation=None,
is_base_trainable=True,
is_diag_start_trainable=False,
is_diag_end_trainable=True,
use_bias=False
)
它实现了操作: output = activation(dot(input, spectral_kernel) + bias)
where
spectral_kernel = dot(base, diag_in) - dot(diag_out, base)
.
是表示层的邻接矩阵的特征值,基是其特征向量的非平凡分量diag_in
。是层创建的偏置向量(仅适用于is )。diag_out
bias
use_bias
True
属性说明
如果is_base_trainable=True
邻接矩阵的特征向量将被训练。这些是input_dim x output_dim
可训练的参数。
is_diag_start_trainable 训练矩阵的第一个 input_dim 特征值,is_diag_end_trainable 训练最后一个 output_dim 特征值。因此,可训练参数的总数为input_dim x output_dim + input_dim + output_dim
。如果仅训练特征值,则自由参数的数量会下降,但学习仍然会发生。达到了次优损失最小值,但不太可能发生过度拟合。如果还训练了特征向量,则从训练的角度来看,该层与 Dense 相同。
光谱修剪
无论模型和拓扑如何,修剪功能都应该起作用。可以这样调用:
from spectraltools import spectral_pruning
pruned_model = spectral_pruning(model,
percentile)
模型:Sequential
或Functional
模型,采用一个或多个光谱层,需要修剪。百分位数:模型应尝试修剪的节点的百分位数 (1-100)。可修剪节点是具有可训练特征值的节点。
例子:
from tensorflow.keras.layers import Dense, Input
from spectraltools import Spectral
inputs = Input(shape=(784,))
x = Dense(100,
activation='relu')(inputs)
x = Spectral(80,
is_diag_start_trainable=True,
is_diag_end_trainable=True,
activation='relu')(x)
在这种情况下,可修剪节点将是 100 ( is_diag_start_trainable=True
) 和 80 ( is_diag_end_trainable=True
)
如果 2 个光谱层彼此相邻,则前面的“结束”特征值和后面的“开始”都被考虑在内。如果可以,该函数会删除每个光谱层中某个百分比的节点。目前,它仅在跟随 Spectral 层或跟随 Dense 或 Spectral 层时进行修剪。根据经验和启发式证明是网络内节点相关性的指标的特征值分布来删除节点。如果两个或多个 Spectral 层在同一层上入站,则它们的特征值以及它们的节点将不会被修剪。
光谱预训练
该函数旨在通过仅对网络中每个光谱层内的特征值进行预训练的随机初始化来找到必须有效的子网络。目前其他层的所有参数都不会被修改,因此每个trainable=True
权重都会被训练。
该函数仅根据传递的 fit_dictionary 训练每个光谱层的特征值。之后,越来越多的节点被修剪,直到准确率或损失下降(或上升)一个 max_delta 百分比。
from spectraltools import spectral_pretrain
pruned_model = spectral_pretrain(model,
fit_dictionary,
eval_dictionary,
max_delta,
compare_with='acc' )
model
:要修剪的未经训练的模型。
fit_dictionary
:带有要传递给fit
模型方法的参数的字典。
eval_dictionary
:带有要传递给fit
模型方法的参数的字典。
max_delta
:给定指标的最大变化,在该处打破修剪过程。
compare_with
: 要使用的指标:'loss'
或'acc'
.
光谱蒸馏
该功能实现了一个两步训练程序。在步骤 1) 中,完成了仅使用特征值的预训练。之后,根据特征值大小标准删除网络的固定百分位数(就节点而言)。
然后,步骤 2) 包括对剩余网络的完整训练,即也使用特征向量。同样,此时,其他层的所有参数都不会被修改,因此每个trainable=True
权重都会被训练。
from spectraltools import spectral_distiller
pruned_model = spectral_distiller(model,
fit_dictionary,
percentile=85)
model
:要修剪的未经训练的模型。
fit_dictionary
:带有要传递给fit
模型方法的参数的字典。
percentile
:在仅特征值训练之后和剩余网络的完整训练之前要删除的节点百分比。
贡献
有兴趣贡献吗?查看贡献指南。请注意,该项目发布时附有行为准则。通过参与本项目,您同意遵守其条款。
执照
spectraltools
由 Lorenzo Giambagli 创建。它是根据 MIT 许可条款获得许可的。
学分
spectraltools
是使用 [ cookiecutter
] ( https://cookiecutter.readthedocs.io/en/latest/ ) 和py-pkgs-cookiecutter
模板创建的。