Keras:在训练示例中共享一层权重(不是层与层之间)

2024-03-29 06:15:40 发布

您现在位置:Python中文网/ 问答频道 /正文

问题如下。我有一个词汇量大小为25K的分类预测任务。在其中一个任务(输入词汇10K,输出维度即嵌入50),我想引入一个可训练的权重矩阵,用于输入嵌入(形状1,50)和权重(形状(50,128))(无偏差),得到的向量得分与其他特征一起作为预测任务的输入。在

关键是,我认为每个输入的可训练权重矩阵都是不同的,如果我简单地加进去的话。我希望这个权重矩阵在所有输入中都是通用的。在

我应该澄清-这里的输入是指培训示例。所以所有的例子都会学习一些特定于例子的嵌入,然后乘以一个共享的权重矩阵。在

每过这么多个时代,我打算做一次批量更新来学习这些常见的权重(或者使用其他目标变量来进行多个输出预测)

LSTM?这是我应该调查的吗?在


Tags: 示例目标分类矩阵特征批量向量词汇
2条回答

如果我正确地理解了这个问题,你可以在另一个模型中重用层甚至模型。在

以致密层为例。假设你有10个输入

import tensorflow as tf
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
# defining 10 inputs in a List with (X,) shape
inputs = [Input(shape = (X,),name='input_{}'.format(k)) for k in 
range(10)]
# defining a common Dense layer
D = Dense(64, name='one_layer_to_rule_them_all')
nets = [D(inp) for inp in inputs]
model = Model(inputs = inputs, outputs = nets)
model.compile(optimizer='adam', loss='categorical_crossentropy')

如果输入具有不同的形状,此代码将无法工作。对D的第一次调用定义了它的属性。在本例中,输出直接设置为网络。但当然,你可以连接,堆叠,或任何你想要的。在

现在,如果你有一些可训练的模型,你可以用它来代替D:

^{pr2}$

该模型的权重在所有输入之间共享。在

除了嵌入层,层应用于批处理中的所有示例。在

以一个非常简单的网络为例:

inp = Input(shape=(4,))
h1 = Dense(2, activation='relu', use_bias=False)(inp)
out = Dense(1)(h1)
model = Model(inp, out)

这是一个有1个输入层,1个隐藏层和一个输出层的简单网络。如果我们以隐藏层为例,这个层有一个形状为(4,2,)的权重矩阵。每次迭代时,输入数据(即形状矩阵)(批处理大小,4)乘以隐藏层权重(前馈阶段)。因此,h1的激活依赖于所有的样品。损失也按批次计算。输出层有一个形状(批处理大小,1)。假设在正向阶段,所有批处理样本都会影响权重值,背景和渐变更新也是如此。在

在处理文本时,问题通常被指定为从一系列单词中预测特定的标签。这被建模为(批处理大小、序列长度、单词索引)的形状。让我们举一个非常基本的例子:

^{pr2}$

您可以将其复制并粘贴到colab并查看摘要。在

这个例子所做的是:

  1. 将一系列单词索引转换成一系列单词嵌入向量。在
  2. 对所有批次(以及序列中的所有元素)应用一个名为h1的密集层;该层减少了嵌入向量的维数。它不是一个典型的网络元素来处理文本(孤立地)。但这似乎符合你的问题。在
  3. 在每个例子中,使用递归层将序列缩减为单个向量。在
  4. 从“句子”向量预测单个标签。在

相关问题 更多 >