(Python) 초보입니다..! python class문에 대해서 문의드립니다!

조회수 2226회

안녕하세요, 저는 python을 시작한지 얼마 안된 학생입니다!

class문으로 작성 된 코드를 보던 중, 서로 다른 class문에 정의된 method를

다른 class에서 어떻게 불러오는지 궁금해서 질문드립니다!

아래의 code문에서 <이곳!> 이라고 표시되어 있는 곳인데요,

<질문!> 첫번째 class에서 쓰인 HiddenLayer 는 두번째 class의 이름인데요! 그렇다고 하면 그냥 저렇게 HiddenLayer에서 어떤값이 반환되길래 첫번째 class에서 값으로 쓰 일 수 있는지 궁금합니다..!

<질문!> 첫번째 class 안에서 보면,
layer_input = self.hidden_layers[i].forward(input=layer_input) 라는 문장이 있는데요, forward라는 메서드는 해당 class안에 없는데(두번째 class에 있는 것 같습니다.) self.hidden_layers.forward로 불러오는게 가능한가요? 설명좀 부탁드립니다 ㅠㅠ

<첫번째 클래스>

#First class
class Dropout(object):
    def __init__(self, input, label,\
                 n_in, hidden_layer_sizes, n_out,\
                 rng=None, activation=ReLU):

        self.x = input
        self.y = label

        self.hidden_layers = []
        self.n_layers = len(hidden_layer_sizes)

        if rng is None:
            rng = numpy.random.RandomState(1234)

        assert self.n_layers > 0


        # construct multi-layer 
        for i in xrange(self.n_layers):

            # layer_size
            if i == 0:
                input_size = n_in
            else:
                input_size = hidden_layer_sizes[i-1]

            # layer_input
            if i == 0:
                layer_input = self.x

            else:
                layer_input = self.hidden_layers[-1].output()

            # construct hidden_layer
 <이곳!>    hidden_layer = HiddenLayer(input=layer_input,
                                       n_in=input_size,
                                       n_out=hidden_layer_sizes[i],
                                       rng=rng,
                                       activation=activation)

           self.hidden_layers.append(hidden_layer)

           ............생략


 <이곳!>   layer_input = self.hidden_layers[i].forward(input=layer_input) 

<두번째 클래스>

class HiddenLayer(object):
    def __init__(self, input, n_in, n_out,\
                 W=None, b=None, rng=None, activation=tanh):

        if rng is None:
            rng = numpy.random.RandomState(1234)

        if W is None:
            a = 1. / n_in
            W = numpy.array(rng.uniform(  # initialize W uniformly
                low=-a,
                high=a,
                size=(n_in, n_out)))

        if b is None:
            b = numpy.zeros(n_out)  # initialize bias 0

        self.rng = rng
        self.x = input

        self.W = W
        self.b = b

        if activation == tanh:
            self.dactivation = dtanh

        elif activation == sigmoid:
            self.dactivation = dsigmoid

        elif activation == ReLU:
            self.dactivation = dReLU

        else:
            raise ValueError('activation function not supported.')


        self.activation = activation

.......................생략
    def forward(self, input=None):
        return self.output(input=input)

.......................생략


자세한 내용은 출처를 남겨놓겠습니다! 출처 : https://gist.github.com/yusugomori/cf7bce19b8e16d57488a/6ffcc0270bece06cbc200b54e606b6dc3f4eb905

1 답변

  • 텐서플로우 코드를 보고 계신건가요? 공부하는 모습이 멋지십니다.

    작성자님이 말씀하신 첫 번째 클래스는 Dropout이고 두 번재 클래스는 HiddenLayer입니다.

    질문하신 내용에 답변하기 위해서는 클래스와 인스턴스의 개념에 대해 알아야 합니다. 클래스는 일종의 설계도이며, 인스턴스는 제품이라고 생각하시면 편할 것 같습니다. 설계도는 말 그대로 해당 클래스가 어떤 멤버변수와 메소드를 가지고 있는지 정의해놓은 것입니다. 클래스의 멤버변수 및 메소드를 실제로 사용하기 위해서는 인스턴스는 생성해야 합니다. 첫 번째 질문이 인스턴스의 개념입니다. Dropout클래스에서 HiddenLayer 클래스변수를 내부적으로 가지고 있는 것이죠.

    다시 말해, Dropout 클래스의 멤버변수로 HiddeLayer타입의 변수가 있다는 뜻이지요. 아래 그림과 같이 정리할 수 있습니다.

    이미지

    또 모르시는 게 있으면 질문주세요.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)