美文网首页
keras 模型代码片段

keras 模型代码片段

作者: FreeTheWorld | 来源:发表于2022-03-29 17:43 被阅读0次

    记录常用的一些模型code,备忘。

    1 双塔模型内部实现 batch in sample

    class SampleInBatch(tf.keras.layers.Layer):
        def __init__(self, name):
            super(SampleInBatch, self).__init__(name=name)
            self.batch_indices = [i for i in range(GLOBAL_BATCH_SIZE)]
    
        def call(self, inputs, training=None):
            if training is None:
                training = backend.learning_phase()
    
            if training:
                # 注意原始向量对齐
                usr_vec, item_vec = inputs
                indices1, indices2 = tf.random.shuffle(self.batch_indices), tf.random.shuffle(self.batch_indices)
                item_vec = tf.concat([item_vec,
                                     tf.gather(item_vec, axis=0, indices=indices1),
                                     tf.gather(item_vec, axis=0, indices=indices2)], axis=0)
    
                usr_vec = tf.tile(usr_vec, [3, 1]) 
                return usr_vec, item_vec
            return inputs
    

    要点

    • 向量 shape [batch_size , emb] 扩展为 [batch_size*3 , emb] 相当于进行了两次随机负采样
    • 在每个batch 内部随机采样 batch_in_sample,扩充样本随机性,注意对label也要进行扩充,label=0
    • batch in sample 只在训练时使用,预测时不使用,通过backend.learning_phase() 获取训练状态

    2 Deep Cross NetWork 实现

    class Cross(tf.keras.layers.Layer):
        def __init__(self, projection_dim=None):
            super(Cross, self).__init__()
            # projection_dim用来降低模型参数量,同时又不影响效果,将权重矩阵分解为两个小矩阵
            self._projection_dim = projection_dim
    
        def build(self, input_shape):
            last_dim = input_shape[-1]
    
            if self._projection_dim is None:
                self._dense = tf.keras.layers.Dense(last_dim, use_bias=True)
            else:
                self._dense_u = tf.keras.layers.Dense(self._projection_dim, use_bias=False)
                self._dense_v = tf.keras.layers.Dense(last_dim, use_bias=True)
            self.built = True
    
        def call(self, x0, x=None):
            if x is None:
                x = x0
            if self._projection_dim is None:
                prod_output = self._dense(x)
            else:
                prod_output = self._dense_v(self._dense_u(x))
    
            return x0 * prod_output + x
    
    
    def cross_module(inputs):
        x0 = layers.concatenate(inputs)
        x1 = Cross()(x0, x0)
        x2 = Cross()(x0, x1)
        return x2
    
    

    参考:
    https://github.com/tensorflow/recommenders/blob/v0.6.0/tensorflow_recommenders/layers/feature_interaction/dcn.py#L23-L194
    https://arxiv.org/pdf/2008.13535.pdf

    (待更...)

    相关文章

      网友评论

          本文标题:keras 模型代码片段

          本文链接:https://www.haomeiwen.com/subject/kecsdrtx.html