Exemple #1
0
    def __init__(self, config, output_dim=2, **kwargs):
        super(Model, self).__init__(**kwargs)
        self.config = config

        self.context_embedder = ContextEmbedder(config)

        act = config.rec_activation() if hasattr(config,
                                                 'rec_activation') else None
        self.rec = SegregatedBidirectional(
            LSTM(dim=config.hidden_state_dim, activation=act,
                 name='recurrent'))

        self.fwd_fork = Fork([
            name
            for name in self.rec.prototype.apply.sequences if name != 'mask'
        ],
                             prototype=Linear(),
                             name='fwd_fork')
        self.bkwd_fork = Fork([
            name
            for name in self.rec.prototype.apply.sequences if name != 'mask'
        ],
                              prototype=Linear(),
                              name='bkwd_fork')

        rto_in = config.hidden_state_dim * 2 + sum(
            x[2] for x in config.dim_embeddings)
        self.rec_to_output = MLP(
            activations=[Rectifier()
                         for _ in config.dim_hidden] + [Identity()],
            dims=[rto_in] + config.dim_hidden + [output_dim])

        self.softmax = Softmax()

        self.sequences = ['latitude', 'latitude_mask', 'longitude']
        self.inputs = self.sequences + self.context_embedder.inputs

        self.children = [
            self.context_embedder, self.fwd_fork, self.bkwd_fork, self.rec,
            self.rec_to_output, self.softmax
        ]

        self.classes = theano.shared(numpy.array(config.tgtcls,
                                                 dtype=theano.config.floatX),
                                     name='classes')
    def __init__(self, config, output_dim=2, **kwargs):
        super(Model, self).__init__(**kwargs)
        self.config = config

        self.context_embedder = ContextEmbedder(config)

        act = config.rec_activation() if hasattr(config, "rec_activation") else None
        self.rec = SegregatedBidirectional(LSTM(dim=config.hidden_state_dim, activation=act, name="recurrent"))

        self.fwd_fork = Fork(
            [name for name in self.rec.prototype.apply.sequences if name != "mask"], prototype=Linear(), name="fwd_fork"
        )
        self.bkwd_fork = Fork(
            [name for name in self.rec.prototype.apply.sequences if name != "mask"],
            prototype=Linear(),
            name="bkwd_fork",
        )

        rto_in = config.hidden_state_dim * 2 + sum(x[2] for x in config.dim_embeddings)
        self.rec_to_output = MLP(
            activations=[Rectifier() for _ in config.dim_hidden] + [Identity()],
            dims=[rto_in] + config.dim_hidden + [output_dim],
        )

        self.softmax = Softmax()

        self.sequences = ["latitude", "latitude_mask", "longitude"]
        self.inputs = self.sequences + self.context_embedder.inputs

        self.children = [
            self.context_embedder,
            self.fwd_fork,
            self.bkwd_fork,
            self.rec,
            self.rec_to_output,
            self.softmax,
        ]

        self.classes = theano.shared(numpy.array(config.tgtcls, dtype=theano.config.floatX), name="classes")
Exemple #3
0
class Model(Initializable):
    @lazy()
    def __init__(self, config, output_dim=2, **kwargs):
        super(Model, self).__init__(**kwargs)
        self.config = config

        self.context_embedder = ContextEmbedder(config)

        act = config.rec_activation() if hasattr(config,
                                                 'rec_activation') else None
        self.rec = SegregatedBidirectional(
            LSTM(dim=config.hidden_state_dim, activation=act,
                 name='recurrent'))

        self.fwd_fork = Fork([
            name
            for name in self.rec.prototype.apply.sequences if name != 'mask'
        ],
                             prototype=Linear(),
                             name='fwd_fork')
        self.bkwd_fork = Fork([
            name
            for name in self.rec.prototype.apply.sequences if name != 'mask'
        ],
                              prototype=Linear(),
                              name='bkwd_fork')

        rto_in = config.hidden_state_dim * 2 + sum(
            x[2] for x in config.dim_embeddings)
        self.rec_to_output = MLP(
            activations=[Rectifier()
                         for _ in config.dim_hidden] + [Identity()],
            dims=[rto_in] + config.dim_hidden + [output_dim])

        self.softmax = Softmax()

        self.sequences = ['latitude', 'latitude_mask', 'longitude']
        self.inputs = self.sequences + self.context_embedder.inputs

        self.children = [
            self.context_embedder, self.fwd_fork, self.bkwd_fork, self.rec,
            self.rec_to_output, self.softmax
        ]

        self.classes = theano.shared(numpy.array(config.tgtcls,
                                                 dtype=theano.config.floatX),
                                     name='classes')

    def _push_allocation_config(self):
        for i, fork in enumerate([self.fwd_fork, self.bkwd_fork]):
            fork.input_dim = 2 * self.config.window_size
            fork.output_dims = [
                self.rec.children[i].get_dim(name)
                for name in fork.output_names
            ]

    def _push_initialization_config(self):
        for brick in [
                self.fwd_fork, self.bkwd_fork, self.rec, self.rec_to_output
        ]:
            brick.weights_init = self.config.weights_init
            brick.biases_init = self.config.biases_init

    def process_outputs(self, outputs):
        return tensor.dot(self.softmax.apply(outputs), self.classes)

    @application(outputs=['destination'])
    def predict(self, latitude, longitude, latitude_mask, **kwargs):
        latitude = (latitude.dimshuffle(1, 0, 2) -
                    data.train_gps_mean[0]) / data.train_gps_std[0]
        longitude = (longitude.dimshuffle(1, 0, 2) -
                     data.train_gps_mean[1]) / data.train_gps_std[1]
        latitude_mask = latitude_mask.T

        rec_in = tensor.concatenate((latitude, longitude), axis=2)

        last_id = tensor.cast(latitude_mask.sum(axis=0) - 1, dtype='int64')

        path = self.rec.apply(
            merge(self.fwd_fork.apply(rec_in, as_dict=True),
                  {'mask': latitude_mask}),
            merge(self.bkwd_fork.apply(rec_in, as_dict=True),
                  {'mask': latitude_mask}))[0]

        path_representation = (path[0][:, -self.config.hidden_state_dim:],
                               path[last_id - 1,
                                    tensor.arange(latitude_mask.shape[1])]
                               [:, :self.config.hidden_state_dim])

        embeddings = tuple(
            self.context_embedder.apply(
                **{k: kwargs[k]
                   for k in self.context_embedder.inputs}))

        inputs = tensor.concatenate(path_representation + embeddings, axis=1)
        outputs = self.rec_to_output.apply(inputs)

        return self.process_outputs(outputs)

    @predict.property('inputs')
    def predict_inputs(self):
        return self.inputs

    @application(outputs=['cost'])
    def cost(self, **kwargs):
        y_hat = self.predict(**kwargs)
        y = tensor.concatenate((kwargs['destination_latitude'][:, None],
                                kwargs['destination_longitude'][:, None]),
                               axis=1)

        return error.erdist(y_hat, y).mean()

    @cost.property('inputs')
    def cost_inputs(self):
        return self.inputs + ['destination_latitude', 'destination_longitude']
class Model(Initializable):
    @lazy()
    def __init__(self, config, output_dim=2, **kwargs):
        super(Model, self).__init__(**kwargs)
        self.config = config

        self.context_embedder = ContextEmbedder(config)

        act = config.rec_activation() if hasattr(config, "rec_activation") else None
        self.rec = SegregatedBidirectional(LSTM(dim=config.hidden_state_dim, activation=act, name="recurrent"))

        self.fwd_fork = Fork(
            [name for name in self.rec.prototype.apply.sequences if name != "mask"], prototype=Linear(), name="fwd_fork"
        )
        self.bkwd_fork = Fork(
            [name for name in self.rec.prototype.apply.sequences if name != "mask"],
            prototype=Linear(),
            name="bkwd_fork",
        )

        rto_in = config.hidden_state_dim * 2 + sum(x[2] for x in config.dim_embeddings)
        self.rec_to_output = MLP(
            activations=[Rectifier() for _ in config.dim_hidden] + [Identity()],
            dims=[rto_in] + config.dim_hidden + [output_dim],
        )

        self.softmax = Softmax()

        self.sequences = ["latitude", "latitude_mask", "longitude"]
        self.inputs = self.sequences + self.context_embedder.inputs

        self.children = [
            self.context_embedder,
            self.fwd_fork,
            self.bkwd_fork,
            self.rec,
            self.rec_to_output,
            self.softmax,
        ]

        self.classes = theano.shared(numpy.array(config.tgtcls, dtype=theano.config.floatX), name="classes")

    def _push_allocation_config(self):
        for i, fork in enumerate([self.fwd_fork, self.bkwd_fork]):
            fork.input_dim = 2 * self.config.window_size
            fork.output_dims = [self.rec.children[i].get_dim(name) for name in fork.output_names]

    def _push_initialization_config(self):
        for brick in [self.fwd_fork, self.bkwd_fork, self.rec, self.rec_to_output]:
            brick.weights_init = self.config.weights_init
            brick.biases_init = self.config.biases_init

    def process_outputs(self, outputs):
        return tensor.dot(self.softmax.apply(outputs), self.classes)

    @application(outputs=["destination"])
    def predict(self, latitude, longitude, latitude_mask, **kwargs):
        latitude = (latitude.dimshuffle(1, 0, 2) - data.train_gps_mean[0]) / data.train_gps_std[0]
        longitude = (longitude.dimshuffle(1, 0, 2) - data.train_gps_mean[1]) / data.train_gps_std[1]
        latitude_mask = latitude_mask.T

        rec_in = tensor.concatenate((latitude, longitude), axis=2)

        last_id = tensor.cast(latitude_mask.sum(axis=0) - 1, dtype="int64")

        path = self.rec.apply(
            merge(self.fwd_fork.apply(rec_in, as_dict=True), {"mask": latitude_mask}),
            merge(self.bkwd_fork.apply(rec_in, as_dict=True), {"mask": latitude_mask}),
        )[0]

        path_representation = (
            path[0][:, -self.config.hidden_state_dim :],
            path[last_id - 1, tensor.arange(latitude_mask.shape[1])][:, : self.config.hidden_state_dim],
        )

        embeddings = tuple(self.context_embedder.apply(**{k: kwargs[k] for k in self.context_embedder.inputs}))

        inputs = tensor.concatenate(path_representation + embeddings, axis=1)
        outputs = self.rec_to_output.apply(inputs)

        return self.process_outputs(outputs)

    @predict.property("inputs")
    def predict_inputs(self):
        return self.inputs

    @application(outputs=["cost"])
    def cost(self, **kwargs):
        y_hat = self.predict(**kwargs)
        y = tensor.concatenate(
            (kwargs["destination_latitude"][:, None], kwargs["destination_longitude"][:, None]), axis=1
        )

        return error.erdist(y_hat, y).mean()

    @cost.property("inputs")
    def cost_inputs(self):
        return self.inputs + ["destination_latitude", "destination_longitude"]