예제 #1
0
def linear_logits(args, bias, bias_start=0.0, scope=None, mask=None, wd=0.0, input_keep_prob=1.0, is_train=None):
    with tf.variable_scope(scope or "Linear_Logits"):
        logits = linear(args, 1, bias, bias_start=bias_start, squeeze=True, scope='first',
                        wd=wd, input_keep_prob=input_keep_prob, is_train=is_train)
        if mask is not None:
            logits = exp_mask(logits, mask)
        return logits
예제 #2
0
def double_linear_logits(args,
                         size,
                         bias,
                         bias_start=0.0,
                         scope=None,
                         mask=None,
                         wd=0.0,
                         input_keep_prob=1.0,
                         is_train=None):
    with tf.variable_scope(scope or "Double_Linear_Logits"):
        first = tf.tanh(
            linear(args,
                   size,
                   bias,
                   bias_start=bias_start,
                   scope='first',
                   wd=wd,
                   input_keep_prob=input_keep_prob,
                   is_train=is_train))
        second = linear(first,
                        1,
                        False,
                        bias_start=bias_start,
                        squeeze=True,
                        scope='second',
                        wd=wd,
                        input_keep_prob=input_keep_prob,
                        is_train=is_train)
        if mask is not None:
            second = exp_mask(second, mask)
        return second
예제 #3
0
def bilinear_logits(args, size, bias, bias_start=0.0, scope=None, mask=None, wd=0.0, input_keep_prob=1.0, is_train=None):
    with tf.variable_scope(scope or 'bilinear'):
        proj = linear([args[0]], size, False, bias_start=bias_start, scope="proj", 
                    wd=wd, input_keep_prob=input_keep_prob, is_train=is_train)
        args[1] = dropout(args[1], input_keep_prob, is_train)
        logits = tf.matmul(proj, args[1], transpose_b=True)
        if mask is not None:
            logits = exp_mask(logits, mask)
        return logits
예제 #4
0
def sum_logits(args, mask=None, name=None):
    with tf.name_scope(name or "sum_logits"):
        if args is None or (nest.is_sequence(args) and not args):
            raise ValueError("`args` must be specified")
        if not nest.is_sequence(args):
            args = [args]
        rank = len(args[0].get_shape())
        logits = sum(tf.reduce_sum(arg, rank-1) for arg in args)
        if mask is not None:
            logits = exp_mask(logits, mask)
        return logits
예제 #5
0
def softmax(logits, mask=None, scope=None, rescale=False, dim=None):
    with tf.name_scope(scope or "Softmax"):
        if mask is not None:
            logits = exp_mask(logits, mask)
        if rescale:
            assert dim is not None
            logits = tf.divide(logits, tf.ones_like(logits, dtype=tf.float32) * tf.sqrt(dim))
        flat_logits = flatten(logits, 1)
        flat_out = tf.nn.softmax(flat_logits)
        out = reconstruct(flat_out, logits, 1)
        return out
예제 #6
0
 def calc_multi_perspective_similarity_fn(h, u, u_f, h_mask, u_mask, num_perspectives=2, keep_rate=1.0, scope=None):
     with tf.variable_scope(scope or 'multi_perspective'):
         N, JX, JQ = tf.shape(h)[0], tf.shape(h)[1], tf.shape(u)[1]
         d = h.get_shape().as_list()[-1]
         l = num_perspectives
         h_u_mask = tf.logical_and(tf.tile(tf.expand_dims(h_mask, -1), [1, 1, JQ]), 
                                     tf.tile(tf.expand_dims(u_mask, 1), [1, JX, 1])) # [N, JX, JQ]
         h1 = match_fn(h, tf.expand_dims(u_f, 1), num_perspectives=num_perspectives, scope='h1')
         h1 = tf.reshape(h1, [N, JX, l])
         h2 = match_fn(h, u, num_perspectives=num_perspectives, scope='h2') # [N, JX, JQ, l]
         h2 = tf.reduce_max(exp_mask(h2, tf.tile(tf.expand_dims(h_u_mask, 3), [1, 1, 1, l])), 2) # [N, JX, l]
         h_u_similarity = calc_similarity_fn(h, u, logit_type='dot', scope='h_u_similarity') # [N, JX, JQ]
         aug_u = tf.tile(tf.expand_dims(u, 1), [1, JX, 1, 1]) # [N, JX, JQ, d]
         u_mean = softsel(aug_u, h_u_similarity, mask=h_u_mask, scope='u_mean') # [N, JX, d]
         h3 = match_fn(tf.reshape(h, [-1, 1, d]), tf.reshape(u_mean, [-1, 1, d]), num_perspectives=num_perspectives, scope='h3')
         h3 = tf.reshape(h3, [N, JX, l])
         max_h_u_similarity = tf.argmax(h_u_similarity, axis=2) # [N, JX, 1]
         max_h_u_similarity = tf.one_hot(max_h_u_similarity, JQ, dtype='float') # [N, JX, JQ]
         u_max_mean = tf.reduce_sum(tf.tile(tf.expand_dims(max_h_u_similarity, 3), [1, 1, 1, d]) * aug_u, 2) # [N, JX, d]
         h4 = match_fn(tf.reshape(h, [-1, 1, d]), tf.reshape(u_mean, [-1, 1, d]), num_perspectives=num_perspectives, scope='h4')
         h4 = tf.reshape(h4, [N, JX, l])
         out = tf.concat([h1, h2, h3, h4], 2) # [N, JX, 4*l]
         return out