앞서
model.add(layers.Dense(input_dim=28*28, units=512, activation='relu', kernel_initailizer='he_uniform'))
이런 코드를 쓰면서 input_dim 값을 넣어 주었다.
input_dim 은, 입력 차원을 나타낸다.
즉, Dense 레이어에 입력되는 데이터의 차원을 설정하는 역할을 한다.
앞에 Flatten()을 쓰게 되면, input_dim을 쓰지 않아도 된다.
원래는
train_data = train_data.reshape(60000, 784) / 255.0
test_data = test_data.reshape(10000, 784) / 255.0
위의 코드로 flatten 하는 작업, 즉 펼쳐주는 작업을 직접 해왔다.
Flatten() 을 사용하게되면, 위의 reshape 하는 과정을 생략해도 된다.
utils.categorical()은 정수로된 클래스 레이블을 one-hot 인코딩으로 변환하는 데 사용됨
Flatten() 사용 방법은 다음과 같다.
model.add(layers.Flatten())
# 28x28 -> 1x784
(train_data, train_label), (test_data, test_label) = datasets.mnist.load_data()
# 아래 코드에서 reshape 적용을 생략 가능
# train_data = train_data.reshape(60000, 784) / 255.0
# test_data = test_data.reshape(10000, 784) / 255.0
train_data = train_data / 255.0
test_data = test_data / 255.0
train_label = utils.to_categorical(train_label)
test_label = utils.to_categorical(test_label)
model = models.Sequential()
model.add(layers.Flatten()) # 28x28 -> 1x784
# tf.nn 활용 가능
# model.add(layers.Dense(input_dim=28*28, units=512, activation='relu', kernel_initializer='he_uniform'))
model.add(layers.Dense(units=512, activation=tf.nn.relu, kernel_initializer='he_uniform'))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(units=10, activation=tf.nn.softmax))
model.compile(optimizer='adam',
loss=losses.categorical_crossentropy,
metrics=['accuracy'])
model.fit(train_data, train_label, batch_size=100, epochs=10)
result = model.evaluate(test_data, test_label, batch_size=100)
print('loss (cross-entropy) :', result[0])
print('test accuracy :', result[1])