Beispiel #1
0
    def predict_graph_onrecall_ori(self, is_negsample=False, reuse=False):

        if reuse:
            tf.get_variable_scope().reuse_variables()
        model_para = self.model_para
        self.input_predict = tf.placeholder(
            'int32', [model_para['batch_size'], model_para['seq_len']],
            name='input_predict')
        self.input_recall = tf.placeholder(
            'int32', [model_para['batch_size'], model_para['seq_len']],
            name='input_recall')  # candidate items

        label_seq, dilate_input = self.model_graph(self.input_predict,
                                                   train=False)

        if is_negsample:
            logits_2D = dilate_input[:, -1:, :]
            recall_mat = tf.nn.embedding_lookup(self.softmax_w,
                                                self.input_recall)
            logits_2D = tf.matmul(logits_2D,
                                  tf.transpose(recall_mat, [0, 2, 1]))
            logits_2D = tf.reshape(logits_2D,
                                   [-1, tf.shape(self.input_recall)[1]])
            recall_bias = tf.nn.embedding_lookup(self.softmax_b,
                                                 self.input_recall)
            logits_2D = tf.add(logits_2D, recall_bias)

        else:
            # logits = ops.conv1d(tf.nn.relu(dilate_input), model_para['item_size'], name='logits')
            logits = ops_compress.conv1d(tf.nn.relu(dilate_input[:, -1:, :]),
                                         model_para['item_size'],
                                         name='logits')
            logits_2D = tf.reshape(logits, [-1, model_para['item_size']])

        probs_flat = tf.nn.softmax(logits_2D, name='softmax')

        self.g_probs = probs_flat
        # newly added for weishi, since each input is one user (i.e., a batch), in fact we just need to rank the first batch, the below code is to select top-5
        # self.top_k= tf.nn.top_k(self.g_probs[:,-1], k=model_para['top_k'],name='top-k')

        # be carefule with the top-k values since the index represents the orders of your recalled items but not the original order.
        self.top_k = tf.nn.top_k(self.g_probs,
                                 k=model_para['top_k'],
                                 name='top-k')
Beispiel #2
0
    def train_graph(self):  #, is_negsample=False):
        model_para = self.model_para
        self.itemseq_input = tf.placeholder(
            'int32', [model_para['batch_size'], model_para['seq_len']],
            name='itemseq_input')
        label_seq, dilate_input = self.model_graph(self.itemseq_input,
                                                   train=True)

        # dilate_input : [batch_size, seq_len, dilated_channels]

        if model_para['SoftmaxType'] == "neg":
            print("using neg")
            logits_2D = tf.reshape(dilate_input,
                                   [-1, model_para['dilated_channels']])
            self.softmax_w = tf.get_variable(
                "softmax_w",
                [model_para['item_size'], model_para['dilated_channels']],
                tf.float32, tf.random_normal_initializer(0.0, 0.01))
            self.softmax_b = tf.get_variable("softmax_b",
                                             [model_para['item_size']],
                                             tf.float32,
                                             tf.constant_initializer(0.1))
            label_flat = tf.reshape(
                label_seq, [-1, 1])  # 1 is the number of positive example
            num_sampled = int(
                0.2 * model_para['item_size'])  #sample 20% as negatives
            # tf.nn.nce_loss
            loss = tf.nn.sampled_softmax_loss(self.softmax_w, self.softmax_b,
                                              label_flat, logits_2D,
                                              num_sampled,
                                              model_para['item_size'])
        elif model_para['SoftmaxType'] == "FullSoftmax_conv":
            print("using FullSoftmax_conv")
            if model_para['dilated_channels'] != model_para['out_embed_size']:
                self.softmax_pro_w = tf.get_variable(
                    "softmax_pro_w",
                    [model_para['dilated_channels'], model_para['embed_size']],
                    tf.float32, tf.random_normal_initializer(0.0, 0.01))
                dilate_input = tf.tensordot(dilate_input,
                                            self.softmax_pro_w,
                                            axes=1)

            logits = ops_compress.conv1d(tf.nn.relu(dilate_input),
                                         model_para['item_size'],
                                         name='logits')
            logits_2D = tf.reshape(logits, [-1, model_para['item_size']])
            label_flat = tf.reshape(label_seq, [-1])
            loss = tf.nn.sparse_softmax_cross_entropy_with_logits(
                labels=label_flat, logits=logits_2D)
        elif model_para['SoftmaxType'] == "FullSoftmax" or model_para[
                'SoftmaxType'] == "Block_Input_Full":
            print("using FullSoftmax")
            if model_para['dilated_channels'] != model_para['out_embed_size']:
                self.softmax_pro_w = tf.get_variable(
                    "softmax_pro_w", [
                        model_para['dilated_channels'],
                        model_para['out_embed_size']
                    ], tf.float32, tf.random_normal_initializer(0.0, 0.01))
                dilate_input = tf.tensordot(dilate_input,
                                            self.softmax_pro_w,
                                            axes=1)

            self.softmax_w = tf.get_variable(
                "softmax_w",
                [model_para['out_embed_size'], model_para['item_size']],
                tf.float32, tf.random_normal_initializer(0.0, 0.01))
            self.softmax_b = tf.get_variable("softmax_b",
                                             [model_para['item_size']],
                                             tf.float32,
                                             tf.constant_initializer(0.1))

            label_flat = tf.reshape(label_seq, [-1])
            logits_2D = tf.reshape(dilate_input,
                                   [-1, model_para['out_embed_size']])
            logits_2D = tf.matmul(logits_2D, self.softmax_w)
            logits_2D = tf.nn.bias_add(logits_2D, self.softmax_b)
            loss = tf.nn.sparse_softmax_cross_entropy_with_logits(
                labels=label_flat, logits=logits_2D)
        elif model_para['SoftmaxType'] == "FullSoftmax_Tied":
            print("using FullSoftmax_Tied")
            if model_para['dilated_channels'] != model_para['embed_size']:
                self.softmax_pro_w = tf.get_variable(
                    "softmax_pro_w",
                    [model_para['dilated_channels'], model_para['embed_size']],
                    tf.float32, tf.random_normal_initializer(0.0, 0.01))
                dilate_input = tf.tensordot(dilate_input,
                                            self.softmax_pro_w,
                                            axes=1)

            self.softmax_w = tf.transpose(self.allitem_embeddings.embedding)
            # self.softmax_b = tf.get_variable("softmax_b", [model_para['item_size']], tf.float32,
            #                                  tf.constant_initializer(0.1))

            label_flat = tf.reshape(label_seq, [-1])
            logits_2D = tf.reshape(dilate_input,
                                   [-1, model_para['dilated_channels']])
            logits_2D = tf.matmul(logits_2D, self.softmax_w)
            # logits_2D = tf.nn.bias_add(logits_2D, self.softmax_b)
            loss = tf.nn.sparse_softmax_cross_entropy_with_logits(
                labels=label_flat, logits=logits_2D)
        elif model_para['SoftmaxType'] == "Block_for_Softmax":
            print("using Block_for_Softmax")
            logits_2D = tf.reshape(dilate_input,
                                   [-1, model_para['dilated_channels']])
            block = model_para['block']
            assert model_para['dilated_channels'] == model_para[
                'out_embed_size']
            softmax_layer = bs(input_dim=model_para['dilated_channels'],
                               block=block,
                               block_factor=model_para['factor'])
            loss, _ = softmax_layer.loss(logits_2D,
                                         tf.reshape(label_seq, [-1]), "loss")
        elif (model_para['SoftmaxType'] == 'Block_Input_Softmax'
              or model_para['SoftmaxType'] == 'Block_Input_Softmax_Inference'
              ) and model_para['factor'] != 1:
            print("using Block_Input_Softmax")
            logits_2D = tf.reshape(dilate_input,
                                   [-1, model_para['dilated_channels']])
            block = model_para['block']
            assert model_para['dilated_channels'] == model_para[
                'out_embed_size']
            softmax_layer = bs(input_dim=model_para['dilated_channels'],
                               block=block,
                               block_factor=model_para['factor'])
            loss, _ = softmax_layer.loss(logits_2D,
                                         tf.reshape(label_seq, [-1]), "loss")
        elif model_para['SoftmaxType'] == 'LowrankSoftmax' and model_para[
                'factor'] != 1:
            print("using LowrankSoftmax")
            logits_2D = tf.reshape(dilate_input,
                                   [-1, model_para['dilated_channels']])
            block = model_para['block']
            softmax_layer = lowranksoftmax.LowRankSoftmax(
                input_dim=model_para['dilated_channels'],
                block=block,
                block_factor=model_para['factor'])
            loss = softmax_layer.loss(logits_2D, tf.reshape(label_seq, [-1]),
                                      "loss")

        elif model_para[
                'SoftmaxType'] == 'Block_Input_LowrankSoftmax' and model_para[
                    'factor'] != 1:
            print("using Block_Input_LowrankSoftmax")
            logits_2D = tf.reshape(dilate_input,
                                   [-1, model_para['dilated_channels']])
            block = model_para['block']
            softmax_layer = lowranksoftmax.LowRankSoftmax(
                input_dim=model_para['dilated_channels'],
                block=block,
                block_factor=model_para['factor'])
            loss = softmax_layer.loss(logits_2D, tf.reshape(label_seq, [-1]),
                                      "loss")

        self.loss = tf.reduce_mean(loss)
        regularization = 0.001 * tf.reduce_mean(
            [tf.nn.l2_loss(v) for v in tf.trainable_variables()])
        self.loss = self.loss + regularization
Beispiel #3
0
    def predict_graph_onrecall(self, reuse=False):  #is_negsample=False,
        if reuse:
            tf.get_variable_scope().reuse_variables()
        model_para = self.model_para  #
        self.input_predict = tf.placeholder(
            'int32', [model_para['batch_size'], model_para['seq_len']],
            name='input_predict')
        self.input_recall = tf.placeholder(
            'int32', [model_para['batch_size'], model_para['seq_len']],
            name='input_recall')  # candidate items

        label_seq, dilate_input = self.model_graph(self.input_predict,
                                                   train=False)
        # label_flat = tf.reshape(label_seq[:, -1:], [-1]) # [batch_size]

        if model_para['SoftmaxType'] == 'neg_nowork':
            logits_2D = dilate_input[:, -1:, :]
            recall_mat = tf.nn.embedding_lookup(self.softmax_w,
                                                self.input_recall)
            logits_2D = tf.matmul(logits_2D,
                                  tf.transpose(recall_mat, [0, 2, 1]))
            logits_2D = tf.reshape(logits_2D,
                                   [-1, tf.shape(self.input_recall)[1]])
            recall_bias = tf.nn.embedding_lookup(self.softmax_b,
                                                 self.input_recall)
            logits_2D = tf.add(logits_2D, recall_bias)
            probs_flat = tf.nn.softmax(logits_2D, name='softmax')
        elif model_para['SoftmaxType'] == 'neg':
            logits_2D = tf.reshape(dilate_input[:, -1:, :],
                                   [-1, model_para['out_embed_size']])
            logits_2D = tf.matmul(logits_2D, tf.transpose(self.softmax_w))
            logits_2D = tf.nn.bias_add(logits_2D, self.softmax_b)
            probs_flat = tf.nn.softmax(logits_2D)
        elif model_para['SoftmaxType'] == 'FullSoftmax_conv':
            print("recall one valid using FullSoftmax_conv")
            if model_para['dilated_channels'] != model_para['embed_size']:
                dilate_input = tf.tensordot(dilate_input,
                                            self.softmax_pro_w,
                                            axes=1)

            logits = ops_compress.conv1d(tf.nn.relu(dilate_input[:, -1:, :]),
                                         model_para['item_size'],
                                         name='logits')
            logits_2D = tf.reshape(
                logits,
                [-1, model_para['item_size']])  #[batch_size, item_size]
            probs_flat = tf.nn.softmax(logits_2D, name='softmax')
        elif model_para["SoftmaxType"] == "FullSoftmax" or model_para[
                'SoftmaxType'] == "Block_Input_Full" or model_para[
                    'SoftmaxType'] == "FullSoftmax_Tied":
            print("valid using FullSoftmax")
            if model_para['dilated_channels'] != model_para['out_embed_size']:
                dilate_input = tf.tensordot(dilate_input,
                                            self.softmax_pro_w,
                                            axes=1)

            logits_2D = tf.reshape(dilate_input[:, -1:, :],
                                   [-1, model_para['out_embed_size']])
            logits_2D = tf.matmul(logits_2D, self.softmax_w)
            logits_2D = tf.nn.bias_add(logits_2D, self.softmax_b)
            probs_flat = tf.nn.softmax(logits_2D)
        elif model_para["SoftmaxType"] == "Block_for_Softmax":
            print("recall one valid using Block_for_Softmax")
            logits_2D = tf.reshape(dilate_input[:, -1:, :],
                                   [-1, model_para['dilated_channels']
                                    ])  #[batch_size, dilated_channels]
            block = model_para['block']
            softmax_layer = bs(model_para["dilated_channels"],
                               block,
                               block_factor=model_para['factor'])
            # loss, _ = softmax_layer.loss(logits_2D, label_flat, train=False, name="loss")
            probs_flat = softmax_layer.softmax(logits_2D, name='softmax')
        elif model_para["SoftmaxType"] == "Block_Input_Softmax" and model_para[
                'factor'] != 1:
            print("recall one valid using Block_Input_Softmax")
            logits_2D = tf.reshape(dilate_input[:, -1:, :],
                                   [-1, model_para['dilated_channels']])
            block = model_para['block']
            softmax_layer = bs(model_para["dilated_channels"],
                               block,
                               block_factor=model_para['factor'])
            # loss, _ = softmax_layer.loss(logits_2D, label_flat, train=False, name="loss")
            probs_flat = softmax_layer.softmax(logits_2D, name='softmax')
        elif model_para["SoftmaxType"] == "LowrankSoftmax":
            print("recall one valid using LowrankSoftmax")
            logits_2D = tf.reshape(dilate_input[:, -1:, :],
                                   [-1, model_para['dilated_channels']])
            block = model_para['block']
            softmax_layer = lowranksoftmax.LowRankSoftmax(
                input_dim=model_para['dilated_channels'],
                block=block,
                block_factor=model_para['factor'])
            # loss, _ = softmax_layer.loss(logits_2D, label_flat, train=False, name="loss")
            probs_flat = softmax_layer.softmax(
                logits_2D, name='softmax')  # [batch_size, item_size]
        elif model_para["SoftmaxType"] == "Block_Input_LowrankSoftmax":
            print("recall one valid using Block_Input_LowrankSoftmax")
            logits_2D = tf.reshape(dilate_input[:, -1:, :],
                                   [-1, model_para['dilated_channels']])
            block = model_para['block']
            softmax_layer = lowranksoftmax.LowRankSoftmax(
                input_dim=model_para['dilated_channels'],
                block=block,
                block_factor=model_para['factor'])
            # loss, _ = softmax_layer.loss(logits_2D, label_flat, train=False, name="loss")
            probs_flat = softmax_layer.softmax(
                logits_2D, name='softmax')  # [batch_size, item_size]
        elif model_para[
                "SoftmaxType"] == "Block_Input_Softmax_Inference" and model_para[
                    'factor'] != 1:
            print("recall one valid using Block_Input_Softmax")
            logits_2D = tf.reshape(dilate_input[:, -1:, :],
                                   [-1, model_para['dilated_channels']])
            block = model_para['block']
            softmax_layer = bs(model_para["dilated_channels"],
                               block=block,
                               block_factor=model_para['factor'])
            # loss, _ = softmax_layer.loss(logits_2D, label_flat, train=False, name="loss")
            probs_flat = softmax_layer.softmax_inference_top(
                logits_2D, name='softmax', top_v=model_para['top_k'])

        # self.loss_test = tf.reduce_mean(loss)

        self.g_probs = probs_flat