def op(self, concat, c, forget_bias): batches = concat.shape[0] vec_len = concat.shape[1]/4 assert c.shape[0] == concat.shape[0] assert c.shape[1] == vec_len assert c.dtype == concat.dtype pos = position_in([batches, vec_len]) cur_batch = pos[0] cur_elem = pos[1] i = concat[cur_batch, cur_elem] j = concat[cur_batch, cur_elem + vec_len] f = concat[cur_batch, cur_elem + 2*vec_len] o = concat[cur_batch, cur_elem + 3*vec_len] c_cur = c[cur_batch, cur_elem] new_c = output_like(c) new_h = output_like(c) new_c_cur = c_cur*sig(f + forget_bias) + sig(i) * tanh(j) new_c[pos] = new_c_cur new_h[pos] = tanh(new_c_cur) * sig(o) return new_c, new_h
def sum_sq(input0, input1, input2): pos = position_in(input0.shape) out0 = output_like(input0) a = input0[pos] b = input1[pos] c = input2[pos] d = a * a + b * b + c * c out0[pos] = d return out0
def sum_sq(input0, input1, input2): pos = position_in(input0.shape) out0 = output_like(input0) a = input0[pos] b = input1[pos] c = input2[pos] d = a*a + b*b + c*c out0[pos] = d return out0
def multi_op(input0, input1, input2): pos = position_in(input0.shape) output0 = output_like(input0) output1 = output_like(input0) output2 = output_like(input0) a = input0[pos] b = input1[pos] c = input2[pos] d = a + b output0[pos] = d output1[pos] = d * c output2[pos] = d + c return output0, output1, output2
def op(self, input0, input1, input2): pos = position_in(input0.shape) output0 = output_like(input0) output1 = output_like(input0) output2 = output_like(input0) a = input0[pos] b = input1[pos] c = input2[pos] d = a + b output0[pos] = d output1[pos] = d*c output2[pos] = d+c return output0, output1, output2
def op(self, concat, c, forget_bias, d_concat, d_c): batches = concat.shape[0] vec_len = concat.shape[1]/4 assert c.shape[0] == concat.shape[0] assert c.shape[1] == vec_len assert c.dtype == concat.dtype assert d_concat.tensor_type == concat.tensor_type assert d_c.tensor_type == c.tensor_type pos = position_in([batches, vec_len]) cur_batch = pos[0] cur_elem = pos[1] i = concat[cur_batch, cur_elem] j = concat[cur_batch, cur_elem + vec_len] f = concat[cur_batch, cur_elem + 2*vec_len] o = concat[cur_batch, cur_elem + 3*vec_len] c_cur = c[cur_batch, cur_elem] new_c_cur = c_cur*sig(f + forget_bias) + sig(i) * tanh(j) d_new_c = output_like(c) d_new_h = output_like(c) d_i = d_concat[cur_batch, cur_elem] d_j = d_concat[cur_batch, cur_elem + vec_len] d_f = d_concat[cur_batch, cur_elem + 2*vec_len] d_o = d_concat[cur_batch, cur_elem + 3*vec_len] d_c_cur = d_c[cur_batch, cur_elem] d_new_c_cur = c_cur*sig_grad(f+forget_bias)*d_f + \ sig(f+forget_bias)*d_c_cur + \ tanh(j)*sig_grad(i)*d_i + \ sig(i)*tanh_grad(j)*d_j d_new_h_cur = sig(o)*tanh_grad(new_c_cur)*d_new_c_cur + \ tanh(new_c_cur)*sig_grad(o)*d_o d_new_c[pos] = d_new_c_cur d_new_h[pos] = d_new_h_cur return d_new_c, d_new_h
def add(x, y): pos = position_in(x.shape) out = output_like(x) out[pos] = x[pos] + y[pos] return out
def op(self, x, y): pos = position_in(x.shape) out = output_like(x) out[pos] = x[pos] + y[pos] return out
def add_inputs(op_input0, op_input1): output = output_like(op_input0) pos = position_in(op_input0.shape) output[pos] = op_input0[pos] + op_input1[pos] return output