2017-12-01 6 views
0

y=Wx+b을 계산하기 위해 chainer.functions.linear을 사용합니다.일괄 처리의 모든 예제에 대해 서로 다른 가중치를 지원하는 일괄 처리 선형 링크를 구현하는 방법은 무엇입니까?

필자의 경우, 한 차원 더 선형 링크를 구현해야합니다.

입력 예는 (c, x)이고 원하는 출력은 y = W_c x + b입니다. 바이어스를 무시하고 그것을 y = W_c x으로합시다.
기수는 {c}으로 미리 알려져 있습니다 (일반적으로 샘플 클래스).

이론적으로 W 매개 변수는 3-d 텐서 (C, y_dims, x_dims)으로 구현 될 수 있습니다. 하지만 또 뭐야? 일괄 처리를 반복하고 W_c 모양의 (y_dims, x_dims)을 추출해야하고 (1, x_dims) 모양의 예일 경우 functions.linear 만 호출하면됩니까?

답변

0

글쎄, 나 자신이 한 가지 해결책을 찾았다.

다음과 같이 데이터 형태의하자,

  • W: (C, y_dims, x_dims)
  • x: (batch, x_dims)
  • c: (batch, 1)

우선 일괄 모든 X에 대한 가중치 행렬을 얻을 수 있습니다

W_c = chainer.functions.get_item(W, chainer.as_variable(c).data) 
y = chainer.functions.batch_matmul(W_c, chainer.expand_dims(x, 2)) // in shape (batch, y_dims, 1) 

여기에서 중요한 기능은 numpy.ndarraycupy.ndarray이지만 이 아닌chainer.Variable을 모두 허용하는 get_item입니다. numpy.take처럼 작동하지만 차별화되어 많은 작업을 절약 할 수 있습니다.