矩阵低秩张量分解_张量分解(三):模型压缩
⽬前已经全⾯转向⾃然语⾔处理了,但是⼤实验室还是做张量的,之前还关注⼀部分张量模型压缩的⽂章和实验,奈何我对张量理论了解的不深刻,所以这⾥只是⼀个综述和个⼈见解。
2020.2.24 我回来更新啦。
开始我们的正题。随着深度学习模型的⽇渐增⼤,对部署的压⼒也越来越⼤,模型压缩就是很好的解决⽅案。常见的模型压缩⽅法有蒸馏,TS,量化,剪枝,低秩分解等等。这⾥的张量压缩⽅法就是低秩分解的⼀种。
本⽂使⽤TT分解来对矩阵进⾏分解,参考的paper是《Tensorizing Neural Network》,⾄于张量分解以及TT分解的内容参考这篇博⽂
CSDN-专业IT技术社区-登录b log.csdn
这⾥简单给出TT分解的压缩效果,如下图所⽰。可以看出参数量⼤⼤压缩了。
奔驰vito价格
为了实际演⽰模型压缩效果,我们这⾥采⽤t3f这个库来进⾏实验。官⽅的demo⽂档
Tensor Nets (compressing neural adthedocs.io
为了更好的记录实验结果,我们采⽤了wandb来记录实验数据。
import t3f
from tensorflow.keras.datasets import mnist
from dels import Sequential
from tensorflow.keras.layers import Dense, Activation, Dropout, Flatten
import numpy as np
from tensorflow.keras.utils import to_categorical
from tensorflow.keras import optimizers
import tensorflowpat.v1 as tf
import wandb
from wandb.keras import WandbCallback
tf.disable_v2_behavior()
import tensorflow.keras.backend as K
tf.set_random_seed(0)
np.random.seed(0)
sess = tf.InteractiveSession()
K.set_session(sess)
wandb.init(magic=True, project="tensor_train")
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train / 127.5 - 1.0
x_test = x_test / 127.5 - 1.0
y_train = to_categorical(y_train, num_classes=10)
y_test = to_categorical(y_test, num_classes=10)
model = Sequential()
南阳二手车
model.add(Flatten(input_shape=(28, 28)))
# model.add(Dense(625, activation='relu'))
tt_layer = KerasDense(input_dims=[7, 4, 7, 4], output_dims=[5, 5, 5, 5],
tt_rank=4, activation='relu',
bias_initializer=1e-3)
model.add(tt_layer)
model.add(Dense(10))
model.add(Activation('softmax'))
optimizer = optimizers.Adam(lr=1e-2)
modelpile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=20, batch_size=64, validation_data=(x_test, y_test),callbacks=[WandbCallback()])
训练的结果如上图所⽰,可以看出,TT的压缩后的模型效果更好,主要表现在不容易过拟合。这跟参数量⼤⼤减少有直接的关系。
接下来我们分析压缩模型的性能。直观上我们知道TT压缩的参数量更少,那么是否意味着性能也更好呢?这⾥的性能包括显存占⽤,训练时间最终模型的⼤⼩等等。这⾥为了更⽅便的⽐较。我对上⾯的MLP层进⾏了复制,来使得数据更好的⽐较:
# model.add(Dense(625, activation='relu'))
# model.add(Dense(625, activation='relu'))
# model.add(Dense(625, activation='relu'))
成都苹果4s报价
# model.add(Dense(625, activation='relu'))
# model.add(Dense(625, activation='relu'))
tt_layer = KerasDense(input_dims=[7, 4, 7, 4], output_dims=[5, 5, 5, 5],
tt_rank=4, activation='relu',
bias_initializer=1e-3)
model.add(tt_layer)
广本飞度tt_layer = KerasDense(input_dims=[5, 5, 5, 5], output_dims=[5, 5, 5, 5],
tt_rank=4, activation='relu',
bias_initializer=1e-3)
model.add(tt_layer)
model.add(tt_layer)
model.add(tt_layer)
model.add(tt_layer)
实验结果如下图所⽰。可以看出tt压缩的模型训练时间更长,显存占⽤更多,TT压缩的模型⼤⼩为166.4kb, 没压缩的模型⼤⼩为
24.8MB,这明显跟模型的参数量有关系。
咸阳车辆违章查询
那么是否有⽅法可以折衷呢,⽅法在
龙湾论坛
Tensor Nets (compressing neural adthedocs.io
也有提到,就是先正常训练,然后对模型进⾏分解,最后微调,具体的代码可以⾃⼰试验⼀下。
下⼀部分讲另⼀应⽤,张量补全,依旧要拖更啊~~~~~