Я не понимаю, почему вы используете tf.map_fn
, вы можете избегать его везде...
Вот несколько советов (которые могут сделать код быстрее, а могут и нет).
Трансляция
Вам действительно нужно привести значения к float? Если (по крайней мере) x[0]
является вложением, это уже число с плавающей запятой, верно? (Не уверен в природе «контекста»)
Строки 37 и 38:
text = x[0]
context = x[1]
Почему функции сопоставления, которые уже поддерживаются в keras?
Например, зачем это делать (L42):
weighted_attentive_context = tf.map_fn(self._compute_attentive_context, (text, context), dtype=K.floatx())
Когда ты сможешь это сделать?
weighted_attentive_context = self._compute_attentive_context(text,context)
С:
def _comput_attentive_context(self,text,context):
Предложение для _compute_attentive_context
:
def _compute_attentive_context(self, text, context):
#computes the context-score for every vector like equation 2
temp = tf.matmul(text, self.We)
scores = tf.matmul(temp, K.transpose(context))
#why not?
scores_softmax = K.softmax(scores)
#computes the context featur_map like equation 4
res = tf.matmul(scores_softmax, context)
#why not?
res = self._weight_for_output(res)
return res
А почему бы не использовать K.conv1D
вместо всех этих сложных повторов, конкатенаций и т. д.?
def _conv(self, x):
return K.conv1D(x, self.W1, padding='same')
#if you have special reasons for what you're doing, please share them in the comments,
#please also share the exact shapes of the inputs and desired outputs
#here, you should make self.W1 with shape (filterLength, em_dim, desired_output_dim)
Предложение для call
:
def call(self, x, mask=None):
#x is a list of two tensors
text = x[0]
context = x[1]
#applies bilinear energy funtion (text * We * context)
#and weights the computed feature map like in equation 6 (W2 * ci)
weighted_attentive_context = self._compute_attentive_context(text, context)
#does the actual convolution, this is still kind of hacky
conv = K.conv1D(text,self.W1,padding='same')
added = conv + weighted_attentive_context
batch = K.bias_add(added, self.bias)
return batch
Пакетное умножение матриц
Для этих умножений вы можете использовать K.dot()
, следуя этому:
- Если партия x весит:
K.dot(x, self.W)
- Если вес x партия:
K.permute_dimensions(K.dot(self.W,x),(1,0,2))
Учитывая, что у вас есть эти формы:
- Если вес партии x -> x: (партия, слова, наложение) | W: (наб., любая)
- Если веса x партия -> W: (любые, слова) | x: (партия, слова, вставка)
Результаты будут:
- Если партия х весит: (слова, любые) ‹- это кажется логичным выбором
- Если вес x партия: (любая, наб)
05.02.2018
tf.map_fn
, они вам нигде не нужны. 05.02.2018