deep_cross_layer

5 篇文章 0 订阅

在这里插入图片描述

#coding=utf-8
import tensorflow as tf
from tensorflow.keras.layers import Dense, ReLU, Layer

class DeepCrossLater(Layer):
    def __init__(self,dim_stack, name=None):
        """
        :param hidden_unit: A list. Neural network hidden units.
        :param dim_stack: A scalar. The dimension of inputs unit.
        """
        super(DeepCrossLater, self).__init__()
        # self.layer1 = Dense(units=hidden_unit, activation='relu')
        # self.layer2 = Dense(units=dim_stack, activation=None)
        self.relu = ReLU()
        self.cross_num = 3
        self.cross_weight = []
        self.bais_weight = []


        self.onehot_embedding = self.add_weight(shape=(10, 5),
                                                initializer=tf.initializers.glorot_normal())


        for i in range(3):
            self.cross_weight.append(
                self.add_weight(shape=(dim_stack, 1),
                                initializer=tf.initializers.glorot_normal(),
                                name="{}/cross_net_{}_weight".format(name,i)))


        for i in range(3):
            self.cross_weight.append(
                self.bais_weight.append(self.add_weight(shape=(dim_stack, 1),
                                                  initializer=tf.initializers.glorot_normal(),
                                                  name="{}/cross_net_{}_bias".format(name, i))))

    def call(self, inputs, **kwargs):

        x0 = tf.nn.embedding_lookup(self.onehot_embedding, inputs)

        ######################## 实现方法一
        xl = x0
        for i in range(3):
            xl = tf.matmul(x0, xl, transpose_a=True)  ## batch_size, (5, 1)*(1, 5)*(5, 1)
            xl = tf.matmul(xl, self.cross_weight[i])
            xl = xl + self.bais_weight[i] + tf.transpose(x0, [0, 2, 1])
            xl = tf.transpose(xl, [0, 2, 1])

        print("method1 xl:", xl)


        ######################## 实现方法二
        xl = tf.transpose(x0, [0, 2, 1])
        for i in range(3):
            xl = tf.matmul(x0, xl, transpose_a=True, transpose_b=True)  ## batch_size, (5, 1)*(1, 5)*(5, 1)
            xl = tf.matmul(xl, self.cross_weight[i])
            xl = xl + self.bais_weight[i] + tf.transpose(x0, [0, 2, 1])
        xl = tf.transpose(xl, [0, 2, 1])
        print("method3 xl:", xl)

        ######################## 实现方法三

        xl = x0
        x0 = tf.transpose(x0, [0, 2, 1])  ## (2, 5, 1)
        for i in range(3):
            # i = 0
            xl = tf.matmul(x0, xl)  ## batch_size, (2, 5, 1)*(2, 1, 5) = (2, 5, 5)
            xl = tf.matmul(xl, self.cross_weight[i])  ## (2, 5, 5)*(2, 5, 1) = (2, 5 ,1)
            xl = xl + x0 + self.bais_weight[i]
            xl = tf.transpose(xl, [0, 2, 1])

        # xl = tf.transpose(xl, [0, 2, 1])
        print("method2 xl:", xl)
        return xl


if __name__ == '__main__':

    input = tf.constant([[1],
                         [2]], dtype=tf.int32)

    print("input:", input.shape)

    ru_ins = DeepCrossLater(5, "CrossNet")


    res = ru_ins(input)

    print("res:", res)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值