我有一个训练有素的TF模型,其结构如下:
投入:
word_a,单热表示法,语音大小:50000
word_b,单热表示法,语音大小:50
输出:
probs,大小:1x10000
该网络由嵌入矩阵的word_a of size 1x100 (dense_word_a)的嵌入查找组成。word_b被转换成一个相似的向量,使用字符CNN转换成一个大小为1x250的密集向量。两个向量都连接成一个1x350向量,并使用解码器层和乙状结肠,我们将其映射到输出层和带有矢量大小1x10000的乙状结肠。
我需要在客户机上运行这个模型,并为此将其转换为TFLite。但是,我还需要将模型分解为两个子模型,其输入和输出如下:
模式1:
投入:
word_a:单热表示,(1x50000)语音大小:50000
输出:
dense_word_a:由嵌入矩阵(1x100)查找的密集字嵌入
网络:通过嵌入矩阵对word_a进行简单的嵌入查找。
模式2:
投入:
dense_word_a:为从模型1 (1x100)接收的word_a嵌入。
word_b,单热表示法,语音大小:50 (1x50)
输出:
probs,大小:1x10000
在模型1中,输入word_a是占位符,dense_word_a是变量。在模型2中,dense_word_a是占位符,它的值与word_b的嵌入连接在一起。
我的模型中的嵌入不是预先训练的,而是作为模型训练过程本身的一部分来训练的。因此,我需要将模型训练成一个组合模型,但在推理过程中,我想将其分解为上面描述的模型1和模型2。
其思想是在服务器端运行Model 1,并将嵌入值传递给客户端,这样它就可以使用word_b进行推理,而不必在客户机上有一个5MB的嵌入矩阵。因此,我不受Model 1大小的限制,但是由于Model 2在客户机上运行,所以我需要它很小。
,这是我尝试过的:
dense_word_a和probs。然后,我将模型转换为TFLite。在推理过程中,我能够看到dense_word_a输出作为1x100向量。这看起来挺好的。我也得到了输出的probs,为了生成Model 2,我只需删除dense_word_a变量并将其转换为占位符(使用tf.placeholder),删除word_a的占位符并再次冻结图形。
但是,我无法匹配probs值。整个模型生成的probs向量与模型2生成的probs值向量不匹配。
我怎样才能把模型分解成子模型,并与结果相匹配?
发布于 2019-06-22 01:41:21
我认为你所描述的应该是有效的。
重现你所看到的问题很容易吗?如果您能够隔离可重复的步骤,并且您认为存在一个bug,您可以在github上注册一个bug吗?谢谢!
https://stackoverflow.com/questions/56629986
复制相似问题