Beispiel #1
0
    def build_graph(self, batch):
        enc_data = batch.data
        self.reset()

        bsize, enc_length = enc_data.shape

        outputs = []

        # Build Fwd Encode Graph
        self.feh0.value = np.zeros([bsize, self.half_dim])
        self.fec0.value = np.zeros([bsize, self.half_dim])

        fh = self.feh0
        fc = self.fec0
        for idx in range(enc_length):
            in_i = self.input()
            in_i.value = enc_data[:, idx]  # Get value from batch
            x = Embed(in_i, self.feembed)
            fh, fc = self.fenc_lstm_cell(x, fh, fc)

        # Build Bwd Encode Graph
        self.beh0.value = np.zeros([bsize, self.half_dim])
        self.bec0.value = np.zeros([bsize, self.half_dim])

        bh = self.beh0
        bc = self.bec0
        for idx in range(enc_length):
            in_i = self.input()
            in_i.value = enc_data[:,
                                  enc_length - 1 - idx]  # Get value from batch
            x = Embed(in_i, self.beembed)
            bh, bc = self.benc_lstm_cell(x, bh, bc)

        # Build Decode Graph
        h = Concat(fh, bh)
        c = Concat(fc, bc)

        self.encoded_h = h
        self.encoded_c = c

        # Build Decode Graph

        decode_in = self.input()
        decode_in.value = np.zeros([bsize])
        decode_embed = Embed(decode_in, self.dembed)
        x = decode_embed
        for idx in range(self.predict_len):
            h, c = self.dec_lstm_cell(x, h, c)
            out_i = ArgMax(SoftMax(Dot(h, self.dv2c)))
            outputs.append(out_i)
            x = Embed(out_i, self.dembed)
        self.output(Collect(outputs))
        self.expect(np.zeros([bsize, self.predict_len]))
Beispiel #2
0
    def build_graph(self, batch):
        enc_data = batch.data[0]
        dec_data = batch.data[1]
        self.reset()

        bsize, enc_length = enc_data.shape
        dec_length = dec_data.shape[1]

        outputs = []

        # Build Fwd Encode Graph
        self.feh0.value = np.zeros([bsize, self.half_dim])
        self.fec0.value = np.zeros([bsize, self.half_dim])

        fh = self.feh0
        fc = self.fec0
        for idx in range(enc_length):
            in_i = self.input()
            in_i.value = enc_data[:, idx]  # Get value from batch
            x = Embed(in_i, self.feembed)
            fh, fc = self.fenc_lstm_cell(x, fh, fc)

        # Build Bwd Encode Graph
        self.beh0.value = np.zeros([bsize, self.half_dim])
        self.bec0.value = np.zeros([bsize, self.half_dim])

        bh = self.beh0
        bc = self.bec0
        for idx in range(enc_length):
            in_i = self.input()
            in_i.value = enc_data[:,
                                  enc_length - 1 - idx]  # Get value from batch
            x = Embed(in_i, self.beembed)
            bh, bc = self.benc_lstm_cell(x, bh, bc)

        # Build Decode Graph
        h = Concat(fh, bh)
        c = Concat(fc, bc)

        self.encoded_h = h
        self.encoded_c = c

        for idx in range(dec_length - 1):
            in_i = self.input()
            in_i.value = dec_data[:, idx]
            x = Embed(in_i, self.dembed)
            h, c = self.dec_lstm_cell(x, h, c)
            out_i = SoftMax(Dot(h, self.dv2c))
            outputs.append(out_i)

        self.output(Collect(outputs))
        self.expect(dec_data[:, 1:])
Beispiel #3
0
    def dec_lstm_cell(self, x, h, c):
        concat = Concat(h, x)

        # Forget Gate
        f_gate = Sigmoid(Add(Dot(concat, self.dwf), self.dbf))
        # Input Gate
        i_gate = Sigmoid(Add(Dot(concat, self.dwi), self.dbi))
        # Temp Vars
        c_temp = Tanh(Add(Dot(concat, self.dwc), self.dbc))
        o_temp = Sigmoid(Add(Dot(concat, self.dwo), self.dbo))

        # Output
        c_next = Add(Mul(f_gate, c), Mul(i_gate, c_temp))
        h_next = Mul(o_temp, Tanh(c_next))
        return h_next, c_next
Beispiel #4
0
    def __init__(self, wf, bf, wi, bi, wc, bc, wo, bo, x, h, c):
        self.wf = wf
        self.bf = bf
        self.wi = wi
        self.bi = bi
        self.wc = wc
        self.bc = bc
        self.wo = wo
        self.bo = bo
        self.x = x
        self.h = h
        self.c = c

        concat = Concat(x, h)
        fgate = Sigmoid(Add(Dot(concat, wf), bf))
        igate = Sigmoid(Add(Dot(concat, wi), bi))
        cgate = Mul(Tanh(Add(Dot(concat, wc), bc)), igate)
        ogate = Sigmoid(Add(Dot(concat, wo), bo))

        self.cout = Add(Mul(c, fgate), cgate)
        self.hout = Mul(Tanh(self.cout), ogate)
Beispiel #5
0
    def build_graph(self, batch):
        enc_data = batch.data
        dec_data = batch.expect
        self.reset()
        bsize = 1
        enc_length = enc_data.shape[1]
        dec_length = dec_data.shape[0]

        outputs = []

        hcollect = []
        ccollect = []

        self.feh0.value = np.zeros([bsize, self.half_dim])
        self.fec0.value = np.zeros([bsize, self.half_dim])

        self.beh0.value = np.zeros([bsize, self.half_dim])
        self.bec0.value = np.zeros([bsize, self.half_dim])

        for line_idx in range(self.num_line):
            # Build Fwd Encode Graph

            fh = self.feh0
            fc = self.fec0
            for idx in range(enc_length):
                in_i = self.input()
                in_i.value = enc_data[line_idx,
                                      idx].reshape(1)  # Get value from batch
                x = Embed(in_i, self.feembed)
                fh, fc = self.fenc_lstm_cell(x, fh, fc)

            # Build Bwd Encode Graph
            bh = self.beh0
            bc = self.bec0
            for idx in range(enc_length):
                in_i = self.input()
                in_i.value = enc_data[line_idx, enc_length - 1 - idx].reshape(
                    1)  # Get value from batch
                x = Embed(in_i, self.beembed)
                bh, bc = self.benc_lstm_cell(x, bh, bc)

            h = Concat(fh, bh)
            c = Concat(fc, bc)
            hcollect.append(h)
            ccollect.append(c)

        # Build Decode Graph
        h = Average(Collect(hcollect))
        c = Average(Collect(ccollect))

        self.encoded_h = h
        self.encoded_c = c

        for idx in range(dec_length - 1):
            in_i = self.input()
            in_i.value = dec_data[idx].reshape(1)
            x = Embed(in_i, self.dembed)
            h, c = self.dec_lstm_cell(x, h, c)
            out_i = SoftMax(Dot(h, self.dv2c))
            outputs.append(out_i)

        self.output(Collect(outputs))
        self.expect(dec_data[1:])
Beispiel #6
0
    def build_graph(self, batch):
        enc_data = batch.data
        self.reset()

        bsize, enc_length = enc_data.shape

        outputs = []

        fwd_encode_result = [None] * enc_length
        bwd_encode_result = [None] * enc_length

        # Build Fwd Encode Graph
        self.feh0.value = np.zeros([bsize, self.half_dim])
        self.fec0.value = np.zeros([bsize, self.half_dim])

        fh = self.feh0
        fc = self.fec0
        for idx in range(enc_length):
            in_i = self.input()
            in_i.value = enc_data[:, idx]  # Get value from batch
            x = Embed(in_i, self.feembed)
            fh, fc = self.fenc_lstm_cell(x, fh, fc)
            fwd_encode_result[idx] = fh

        # Build Bwd Encode Graph
        self.beh0.value = np.zeros([bsize, self.half_dim])
        self.bec0.value = np.zeros([bsize, self.half_dim])

        bh = self.beh0
        bc = self.bec0
        for idx in range(enc_length):
            in_i = self.input()
            in_i.value = enc_data[:,
                                  enc_length - 1 - idx]  # Get value from batch
            x = Embed(in_i, self.beembed)
            bh, bc = self.benc_lstm_cell(x, bh, bc)
            bwd_encode_result[enc_length - 1 - idx] = bh

        # Build Decode Graph
        h = Concat(fh, bh)
        # c = Concat(fc, bc)

        self.encoded_h = h
        # self.encoded_c = c

        encode_result = []
        for idx in range(enc_length):
            encode_result.append(
                Concat(fwd_encode_result[idx], bwd_encode_result[idx]))
        encode_state = Collect(encode_result)

        init = self.input()
        init.value = np.zeros([bsize])
        x = Embed(init, self.dembed)
        for idx in range(self.predict_len):
            c = Attention(encode_state, h)

            h, c = self.dec_lstm_cell(x, h, c)
            out_i = ArgMax(SoftMax(Dot(h, self.dv2c)))
            outputs.append(out_i)
            x = Embed(out_i, self.dembed)
        self.output(Collect(outputs))
        self.expect(np.zeros([bsize, self.predict_len]))