setWeights(weightsArr) {
    super.setWeights(weightsArr)

    const shape_W = this.weights['kernel'].tensor.shape
    this.weights['W_i'] = new Tensor([], [shape_W[0], this.units])
    this.weights['W_f'] = new Tensor([], [shape_W[0], this.units])
    this.weights['W_c'] = new Tensor([], [shape_W[0], this.units])
    this.weights['W_o'] = new Tensor([], [shape_W[0], this.units])
    ops.assign(this.weights['W_i'].tensor, this.weights['kernel'].tensor.hi(shape_W[0], this.units).lo(0, 0))
    ops.assign(
      this.weights['W_f'].tensor,
      this.weights['kernel'].tensor.hi(shape_W[0], 2 * this.units).lo(0, this.units)
    )
    ops.assign(
      this.weights['W_c'].tensor,
      this.weights['kernel'].tensor.hi(shape_W[0], 3 * this.units).lo(0, 2 * this.units)
    )
    ops.assign(
      this.weights['W_o'].tensor,
      this.weights['kernel'].tensor.hi(shape_W[0], 4 * this.units).lo(0, 3 * this.units)
    )

    const shape_U = this.weights['recurrent_kernel'].tensor.shape
    this.weights['U_i'] = new Tensor([], [shape_U[0], this.units])
    this.weights['U_f'] = new Tensor([], [shape_U[0], this.units])
    this.weights['U_c'] = new Tensor([], [shape_U[0], this.units])
    this.weights['U_o'] = new Tensor([], [shape_U[0], this.units])
    ops.assign(this.weights['U_i'].tensor, this.weights['recurrent_kernel'].tensor.hi(shape_U[0], this.units).lo(0, 0))
    ops.assign(
      this.weights['U_f'].tensor,
      this.weights['recurrent_kernel'].tensor.hi(shape_U[0], 2 * this.units).lo(0, this.units)
    )
    ops.assign(
      this.weights['U_c'].tensor,
      this.weights['recurrent_kernel'].tensor.hi(shape_U[0], 3 * this.units).lo(0, 2 * this.units)
    )
    ops.assign(
      this.weights['U_o'].tensor,
      this.weights['recurrent_kernel'].tensor.hi(shape_U[0], 4 * this.units).lo(0, 3 * this.units)
    )

    this.weights['b_i'] = new Tensor([], [this.units])
    this.weights['b_f'] = new Tensor([], [this.units])
    this.weights['b_c'] = new Tensor([], [this.units])
    this.weights['b_o'] = new Tensor([], [this.units])
    if (this.use_bias) {
      ops.assign(this.weights['b_i'].tensor, this.weights['bias'].tensor.hi(this.units).lo(0))
      ops.assign(this.weights['b_f'].tensor, this.weights['bias'].tensor.hi(2 * this.units).lo(this.units))
      ops.assign(this.weights['b_c'].tensor, this.weights['bias'].tensor.hi(3 * this.units).lo(2 * this.units))
      ops.assign(this.weights['b_o'].tensor, this.weights['bias'].tensor.hi(4 * this.units).lo(3 * this.units))
    }

    if (this.gpu) {
      const names = ['W_i', 'W_f', 'W_c', 'W_o', 'U_i', 'U_f', 'U_c', 'U_o', 'b_i', 'b_f', 'b_c', 'b_o']
      names.forEach(name => {
        this.weights[name].createGLTexture({ type: '2d', format: 'float' })
      })
    }
  }
Method for setting layer weights. Extends `super` method.

W weight tensor is split into W_i, W_f, W_c, W_o

U weight tensor is split into U_i, U_f, U_c, U_o

b weight tensor is split into b_i, b_f, b_c, b_o (or create empty bias if this.use_bias is false)

@param {Tensor[]} weightsArr - array of weights which are instances of Tensor