코드 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 클래스 객체가 만들어질 때 전달됩니다.
② 출력 클래스가 두 개이면 출력 뉴런을 한 개 갖고 시그모이드 함수를 사용하지만, 그렇지 않다면 출력 뉴런을 두 개 갖고 소프트맥스 함수를 사용합니다. 여기에서는 소프트맥스 함수가 사용되었습니다.