더북(TheBook)

코드 10-53 네트워크 생성

class TEXT_MODEL(tf.keras.Model):
    def __init__(self,
                 vocabulary_size,
                 embedding_dimensions=128,
                 cnn_filters=50,
                 dnn_units=512,
                 model_output_classes=2,
                 dropout_rate=0.1,
                 training=False,
                 name="text_model"):
        super(TEXT_MODEL, self).__init__(name=name) ------ ①

self.embedding = tf.keras.layers.Embedding(vocabulary_size,
                                           embedding_dimensions)
        self.cnn_layer1 = tf.keras.layers.Conv1D(filters=cnn_filters,
                                        kernel_size=2,
                                        padding="valid",
                                        activation="relu")
        self.cnn_layer2 = tf.keras.layers.Conv1D(filters=cnn_filters,
                                        kernel_size=3,
                                        padding="valid",
                                        activation="relu")
        self.cnn_layer3 = tf.keras.layers.Conv1D(filters=cnn_filters,
                                        kernel_size=4,
                                        padding="valid",
                                        activation="relu")
        self.pool = tf.keras.layers.GlobalMaxPool1D() ------ 합성곱 신경망 계층 세 개가 각각 커널 또는 필터 값(2, 3, 4)으로 초기화되었습니다. 이때 원한다면 필터 크기를 변경해 볼 수 있습니다.

        self.dense_1 = tf.keras.layers.Dense(units=dnn_units, activation="relu") ------ 입력과 출력을 모두 연결해 주는 층으로 활성화 함수는 렐루를 사용합니다.
        self.dropout = tf.keras.layers.Dropout(rate=dropout_rate) ------ 10% 비율에 대해 드롭아웃 (deactivation)을 적용합니다.
        if model_output_classes == 2:
            self.last_dense = tf.keras.layers.Dense(units=1,
                                                    activation="sigmoid")
        else:
            self.last_dense = tf.keras.layers.Dense(units=model_output_classes,
                                                    activation="softmax") ------ ②


    def call(self, inputs, training): ------ 함수를 호출하는 것처럼 클래스의 객체도 호출할 수 있게 만들 수 있는데, 이때 필요한 메서드가 __call__입니다.
        l = self.embedding(inputs)-
        l_1 = self.cnn_layer1(l)
        l_1 = self.pool(l_1)
        l_2 = self.cnn_layer2(l) l_2 = self.pool(l_2)
        l_3 = self.cnn_layer3(l)
        l_3 = self.pool(l_3) ------ call() 함수 내에서 각 합성곱 신경망 계층의 출력에 전역 최대 풀링을 적용합니다.

        concatenated = tf.concat([l_1, l_2, l_3], axis=-1) ------ 합성곱층 세 개가 함께 연결(concat)되고 그 출력이 첫 번째 신경망에 공급됩니다.
        concatenated = self.dense_1(concatenated) ------ 두 번째로 연결된 신경망은 클래스 두 개만 포함하므로 출력 감정을 예측하는 데 사용됩니다.
        concatenated = self.dropout(concatenated, training)
        model_output = self.last_dense(concatenated) ------ 모델의 출력층
        return model_output

① 클래스 생성자에서 일부 속성을 기본값으로 초기화합니다. 이 값들은 추후에 TEXT_MODEL 클래스 객체가 만들어질 때 전달됩니다.

② 출력 클래스가 두 개이면 출력 뉴런을 한 개 갖고 시그모이드 함수를 사용하지만, 그렇지 않다면 출력 뉴런을 두 개 갖고 소프트맥스 함수를 사용합니다. 여기에서는 소프트맥스 함수가 사용되었습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.