다항 분류 모형
keras.utils.set_random_seed(812)
model = keras.models.Sequential([
keras.layers.Rescaling(1/255),
keras.layers.Flatten(),
keras.layers.Dense(16, activation='relu'),
keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer=keras.optimizers.SGD(learning_rate=0.001),
loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5, batch_size=32)
예측
y_prob = model.predict(x_test)
y_prob.shape
소프트맥스 함수 softmax
- 이항분류에서는 로지스틱 함수로 -∞ ~ +∞의 값을 0~1 범위로 변환
- 다항 분류에서는 소프트맥스 함수를 사용
- 여러 개의 입력을 받아, 같은 개수를 출력
- 모든 출력의 합은 1, 각 출력의 범위는 0~1
keras.activations.softmax(np.array([-1, 0.5, 2.0])) == [0.039, 0.175, 0.796]
yj=∑iexp(xi)exp(xj)
- 시그모이드는 소프트맥스의 특수한 경우
- 둘 중에 하나로 예측할 때: sigmoid
- 셋 이상 중에 하나로 예측할 때: softmax
x = 1.0
keras.activations.sigmoid(x)
keras.activations.softmax(np.array([0.0, 1.0]))
exp(x)+exp(0)exp(x)=1+exp(−x)1
소프트맥스 함수가 없는 모형
keras.utils.set_random_seed(812)
model = keras.models.Sequential([
keras.layers.Rescaling(1/255),
keras.layers.Flatten(),
keras.layers.Dense(16, activation='relu'),
keras.layers.Dense(10)
])
model.compile(optimizer=keras.optimizers.SGD(learning_rate=0.001),
loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5, batch_size=32)
로짓 계산
logits = model.predict(x_test)
logits.shape
logits[0]
keras.activations.softmax(logits[0])