38.1 reshape 함수 구현
넘파이에서 np.reshape(x, shape) 형태로 쓰며 x를 shape 인수로 지정한 형상으로 변환해줍니다.
안에 텐서의 원소 수만 같고 겉에 싸여진 대괄호가 추가되거나 빠지는 것이죠
계산을 원소별로 하지 않는 함수는 텐서의 형상을 고려해야하는데 그러면 역전파 구현이 좀더 명확해집니다.
변수의 데이터 쉐입과 기울기의 쉐입이 일치하는지 확인해야하는데
x가 Variable 인스턴스일 때 x.data.shape == x.grad.shape를 만족할 수 있도록 역전파를 구현합니다.

위의 그림처럼 역전파는 출력 족에서 기울기를 전달하는데 [a,b,c,d,e,f] 쉐입으로는 (,6)인 형상을 [[a,b,c],[d,e,f]]로 즉 (2,3)의 쉐잎으로 변환해서 주고 있습니다.
해당 내용을 코드로 구현하면 아래와 같습니다.
class Reshape(Function):
def __init__(self, shape):
self.shape = shape
def forward(self, x):
self.x_shape = x.shape
y = x.reshape(self.shape)
return y
def backward(self, gy):
return reshape(gy, self.x_shape)
Reshape 클래스를 초기화할 때 변형 목표가 되는 형상을 shape 인수로 받아서 순전파 때는 reshape 함수를 사용해 형상을 변환하고 x의 입력 형상을 기억해줍니다. 역전파때는 gy를 기억해놨던 x.shape으로 맞춰서 변경해줍니다.
def reshape(x, shape):
if x.shape == shape:
return as_variable(x)
return Reshape(shape)(x)
x.shape이 shape과 같으면 그대로 리턴해주고 아니면 리쉐입해줍니다.


만들어진 reshape 함수를 사용한 코드입니다.

위의 그림은 데이터가 어떻게 흐르는지 보여주는 계산 그래프입니다.
38.2 Variable에서 reshape 사용하기
넘파이의 reshape 함수는 튜플, 리스트, 인스를 그대로 받을 수 있고 심지어 가변 인수도 받을수 있습니다.
해당 부분을 DeZero에서도 사용할 수 있게 수정하겠습니다.
def reshape(self, *shape):
if len(shape) == 1 and isinstance(shape[0], (tuple, list)):
shape = shape[0]
return dezero.functions.reshape(self, shape)
Variable 클래스 안에 reshape함수를 넣어주고 *shape을 통해 가변 인수를 받을 수 있도록 해줍니다.
38.3 행렬의 전치
행렬을 전치해주면 아래의 그림처럼 형상이 변합니다.

이렇게 전치를 구현할 것이고 transpose라는 이름의 DeZero 함수로 구현합니다.
class Transpose(Function):
def __init__(self, axes=None):
self.axes = axes
def forward(self, x):
y = x.transpose(self.axes)
return y
def backward(self, gy):
if self.axes is None:
return transpose(gy)
axes_len = len(self.axes)
inv_axes = tuple(np.argsort([ax % axes_len for ax in self.axes]))
return transpose(gy, inv_axes)


Variable에서도 사용할 수 있도록 z코드 추가해줍니다.

데코레이터 붙여서 인스턴스 변수로 사용할 수 있게해줍니다.
x = Variable(np.random.rand(2,3))
y = x.transpose()
y = x.T # 이런식으로 사용 가능해집니다.
'Study 공부할레나' 카테고리의 다른 글
| [스터디/밑시딥3] 제 4고지 신경망 만들기_41. 행렬의 곱 (1) | 2023.10.09 |
|---|---|
| [스터디/밑시딥3] 제 4고지 신경망 만들기_40. 브로드캐스트 함수 (1) | 2023.10.09 |
| [스터디/밑시딥3] 제 4고지 신경망 만들기_37. 텐서를 다루다 (1) | 2023.10.08 |
| [스터디/밑시딥3] 제 4고지 신경망 만들기_39. 합계 함수 (0) | 2023.09.19 |
| [스터디/밑시딥3] 제 3고지 고차미분계산_36. 고차 미분 이외의 용도 (0) | 2023.09.11 |