Esempio n. 1
0
eps = 1e-6

loss_type = 'CrossEntropy'
lr = 0.01

dropout_hidden = 0
dropout_input = 0
batch_size = 50
momentum = 0

gru = GRU(input_size,
          if_embedding,
          embedding_size,
          hidden_size,
          output_size,
          num_layers=num_layers,
          dropout_input=dropout_input,
          dropout_hidden=dropout_hidden,
          batch_size=batch_size,
          use_cuda=use_cuda,
          cuda_id=cuda_id)

print(loss_type + ':')
for i in range(1, 21):
    model_name = 'GRU4REC_CrossEntropy_Adagrad_0.01_epoch%d' % i
    print(model_name)
    model_file = r'./models/' + model_name
    gru.load_state_dict(torch.load(model_file))

    model = GRU4REC(input_size,
                    if_embedding,
Esempio n. 2
0
    def __init__(self,
                 input_size,
                 hidden_size,
                 output_size,
                 num_layers=1,
                 optimizer_type='Adagrad',
                 lr=.01,
                 weight_decay=0,
                 momentum=0,
                 eps=1e-6,
                 loss_type='TOP1',
                 clip_grad=-1,
                 dropout_input=.0,
                 dropout_hidden=.5,
                 batch_size=50,
                 use_cuda=True,
                 time_sort=False,
                 pretrained=None,
                 n_sample=2048,
                 sample_alpha=0.75,
                 sample_store=10000000,
                 bpreg=1.0):
        """ The GRU4REC model

        Args:
            input_size (int): dimension of the gru input variables
            hidden_size (int): dimension of the gru hidden units
            output_size (int): dimension of the gru output variables
            num_layers (int): the number of layers in the GRU
            optimizer_type (str): optimizer type for GRU weights
            lr (float): learning rate for the optimizer
            weight_decay (float): weight decay for the optimizer
            momentum (float): momentum for the optimizer
            eps (float): eps for the optimizer
            loss_type (str): type of the loss function to use
            clip_grad (float): clip the gradient norm at clip_grad. No clipping if clip_grad = -1
            dropout_input (float): dropout probability for the input layer
            dropout_hidden (float): dropout probability for the hidden layer
            batch_size (int): mini-batch size
            use_cuda (bool): whether you want to use cuda or not
            time_sort (bool): whether to ensure the the order of sessions is chronological (default: False)
            pretrained (modules.layer.GRU): pretrained GRU layer, if it exists (default: None)
        """

        # Initialize the GRU Layer
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.output_size = output_size
        self.batch_size = batch_size
        self.use_cuda = use_cuda
        self.device = torch.device('cuda' if use_cuda else 'cpu')
        ###修改###
        self.n_sample = n_sample
        self.sample_alpha = sample_alpha
        self.sample_store = sample_store
        self.bpreg = bpreg
        ###修改###
        if pretrained is None:
            self.gru = GRU(input_size,
                           hidden_size,
                           output_size,
                           num_layers,
                           dropout_input=dropout_input,
                           dropout_hidden=dropout_hidden,
                           batch_size=batch_size,
                           use_cuda=use_cuda)
        else:
            self.gru = pretrained

        # Initialize the optimizer
        self.optimizer_type = optimizer_type
        self.weight_decay = weight_decay
        self.momentum = momentum
        self.lr = lr
        self.eps = eps
        self.optimizer = Optimizer(self.gru.parameters(),
                                   optimizer_type=optimizer_type,
                                   lr=lr,
                                   weight_decay=weight_decay,
                                   momentum=momentum,
                                   eps=eps)

        # Initialize the loss function
        self.loss_type = loss_type
        self.loss_fn = LossFunction(loss_type, use_cuda)

        # gradient clipping(optional)
        self.clip_grad = clip_grad

        # etc
        self.time_sort = time_sort
Esempio n. 3
0
model_name = 'GRU4REC_TOP1_Adagrad_0.01_epoch5'
model_file = PATH_MODEL / model_name

loss_type = 'TOP1'
lr = 0.01

dropout_hidden = .5
dropout_input = 0
batch_size = 50
momentum = 0

gru = GRU(input_size,
          hidden_size,
          output_size,
          num_layers=num_layers,
          dropout_input=dropout_input,
          dropout_hidden=dropout_hidden,
          batch_size=batch_size,
          use_cuda=use_cuda)

gru.load_state_dict(torch.load(model_file))

model = GRU4REC(input_size,
                hidden_size,
                output_size,
                num_layers=num_layers,
                dropout_input=dropout_input,
                dropout_hidden=dropout_hidden,
                batch_size=batch_size,
                use_cuda=use_cuda,
                loss_type=loss_type,
Esempio n. 4
0
def main():
    parser = argparse.ArgumentParser()

    # Model filename
    parser.add_argument('model_file', type=str)

    # Size of the recommendation list
    parser.add_argument('--k', default=20, type=int)

    # parse the nn arguments

    parser.add_argument('--hidden_size', default=100, type=int)
    parser.add_argument('--num_layers', default=1, type=int)
    parser.add_argument('--batch_size', default=50, type=int)
    parser.add_argument('--dropout_input', default=0, type=float)
    parser.add_argument('--dropout_hidden', default=.5, type=float)

    # parse the optimizer arguments
    parser.add_argument('--optimizer_type', default='Adagrad', type=str)
    parser.add_argument('--lr', default=.01, type=float)
    parser.add_argument('--weight_decay', default=0, type=float)
    parser.add_argument('--momentum', default=0, type=float)
    parser.add_argument('--eps', default=1e-6, type=float)

    # parse the loss type
    parser.add_argument('--loss_type', default='TOP1', type=str)

    # etc
    parser.add_argument('--n_epochs', default=2, type=int)
    parser.add_argument('--time_sort', default=False, type=bool)
    parser.add_argument('--n_samples', default=-1, type=int)

    # Get the arguments
    args = parser.parse_args()

    # PATH_DATA = Path('./data/rsc15/processed')
    PATH_DATA = Path('/content/data')  # on colab
    PATH_MODEL = Path('./models')
    train = 'rsc15_train_tr.txt'
    test = 'rsc15_test.txt'
    PATH_TRAIN = PATH_DATA / train
    PATH_TEST = PATH_DATA / test

    df_train = pd.read_csv(PATH_TRAIN,
                           sep='\t',
                           names=['SessionId', 'ItemId', 'TimeStamp'])
    df_test = pd.read_csv(PATH_TEST,
                          sep='\t',
                          names=['SessionId', 'ItemId', 'TimeStamp'])

    # sampling, if needed
    n_samples = args.n_samples
    if n_samples != -1:
        df_train = df_train[:n_samples]
        df_test = df_test[:n_samples]

    session_key = 'SessionId'
    item_key = 'ItemId'
    time_key = 'TimeStamp'

    use_cuda = True
    input_size = df_train[item_key].nunique()
    hidden_size = args.hidden_size
    num_layers = args.num_layers
    output_size = input_size
    batch_size = args.batch_size
    dropout_input = args.dropout_input
    dropout_hidden = args.dropout_hidden

    loss_type = args.loss_type

    optimizer_type = args.optimizer_type
    lr = args.lr
    weight_decay = args.weight_decay
    momentum = args.momentum
    eps = args.eps

    n_epochs = args.n_epochs
    time_sort = args.time_sort

    MODEL_FILE = PATH_MODEL / args.model_file

    gru = GRU(input_size,
              hidden_size,
              output_size,
              num_layers=num_layers,
              dropout_input=dropout_input,
              dropout_hidden=dropout_hidden,
              batch_size=batch_size,
              use_cuda=use_cuda)

    gru.load_state_dict(torch.load(MODEL_FILE))

    model = GRU4REC(input_size,
                    hidden_size,
                    output_size,
                    num_layers=num_layers,
                    dropout_input=dropout_input,
                    dropout_hidden=dropout_hidden,
                    batch_size=batch_size,
                    use_cuda=use_cuda,
                    loss_type=loss_type,
                    optimizer_type=optimizer_type,
                    lr=lr,
                    momentum=momentum,
                    time_sort=time_sort,
                    pretrained=gru)

    model.init_data(df_train,
                    df_test,
                    session_key=session_key,
                    time_key=time_key,
                    item_key=item_key)

    k = args.k
    recall, mrr = model.test(k=k, batch_size=batch_size)
    result = f'Recall@{k}:{recall:.7f},MRR@{k}:{mrr:.7f}'
    print(result)
Esempio n. 5
0
    def __init__(self,
                 input_size,
                 if_embedding,
                 embedding_size,
                 hidden_size,
                 output_size,
                 num_layers=1,
                 optimizer_type='Adagrad',
                 lr=.01,
                 weight_decay=0,
                 momentum=0,
                 eps=1e-6,
                 loss_type='TOP1',
                 clip_grad=-1,
                 dropout_input=.0,
                 dropout_hidden=.5,
                 batch_size=50,
                 use_cuda=True,
                 cuda_id=1,
                 compress=False,
                 time_sort=False,
                 pretrained=None):
        """ The GRU4REC model

        Args:
            input_size (int): dimension of the gru input variables
            hidden_size (int): dimension of the gru hidden units
            output_size (int): dimension of the gru output variables
            num_layers (int): the number of layers in the GRU
            optimizer_type (str): optimizer type for GRU weights
            lr (float): learning rate for the optimizer
            weight_decay (float): weight decay for the optimizer
            momentum (float): momentum for the optimizer
            eps (float): eps for the optimizer
            loss_type (str): type of the loss function to use
            clip_grad (float): clip the gradient norm at clip_grad. No clipping if clip_grad = -1
            dropout_input (float): dropout probability for the input layer
            dropout_hidden (float): dropout probability for the hidden layer
            batch_size (int): mini-batch size
            use_cuda (bool): whether you want to use cuda or not
            time_sort (bool): whether to ensure the the order of sessions is chronological (default: False)
            pretrained (modules.layer.GRU): pretrained GRU layer, if it exists (default: None)
        """

        # Initialize the GRU Layer
        self.input_size = input_size
        self.if_embedding = if_embedding
        self.embedding_size = embedding_size
        self.hidden_size = hidden_size
        self.output_size = output_size
        self.batch_size = batch_size
        self.use_cuda = use_cuda
        self.cuda_id = cuda_id
        self.device = torch.device(
            'cuda:%d' % cuda_id if use_cuda else 'cpu'
        )  # must specify cuda_id or it will be torch.cuda.current_device()
        print(self.device)
        if pretrained is None:
            self.gru = GRU(input_size,
                           if_embedding,
                           embedding_size,
                           hidden_size,
                           output_size,
                           num_layers,
                           dropout_input=dropout_input,
                           dropout_hidden=dropout_hidden,
                           batch_size=batch_size,
                           use_cuda=use_cuda,
                           cuda_id=cuda_id)
        else:
            self.gru = pretrained

        # Initialize the optimizer
        self.optimizer_type = optimizer_type
        self.weight_decay = weight_decay
        self.momentum = momentum
        self.lr = lr
        self.eps = eps

        self.compress = compress
        self.compression_scheduler = None
        if self.compress:
            # Create a CompressionScheduler and configure it from a YAML schedule file
            source = self.compress
            self.compression_scheduler = distiller.config.file_config(
                self.gru, None, self.compress)

        self.optimizer = Optimizer(self.gru.parameters(),
                                   optimizer_type=optimizer_type,
                                   lr=lr,
                                   weight_decay=weight_decay,
                                   momentum=momentum,
                                   eps=eps)

        # Initialize the loss function
        self.loss_type = loss_type
        self.loss_fn = LossFunction(loss_type, use_cuda, cuda_id)

        # gradient clipping(optional)
        self.clip_grad = clip_grad

        # etc
        self.time_sort = time_sort