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]))
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:])
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
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)
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:])
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]))