import numpy as np
from sklearn.preprocessing import MinMaxScaler, RobustScaler
from tensorflow.keras.utils import to_categorical
from keras.datasets import cifar100
from keras.models import Sequential, Model
from keras.layers import Dense, Dropout, Input
import datetime
import time
from sklearn.metrics import accuracy_score
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint

date = datetime.datetime.now()
date = date.strftime("%m%d_%H%M")

#1. 데이터
(x_train, y_train), (x_test, y_test)= cifar100.load_data()
# print(np.unique(y_train, return_counts=True))

print(x_train.shape, x_test.shape)   #(50000, 32, 32, 3) (10000, 32, 32, 3)

# x_train = x_train.reshape()

x_train = x_train.reshape(50000, 32*32*3)/255.
x_test = x_test.reshape(10000, 32*32*3)/255.

y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

#2. 모델구성
start_time = time.time()
model = Sequential()
model.add(Dense(512, input_shape=(32*32*3,)))
model.add(Dropout(0.5))
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(128, activation='relu'))
model.add(Dense(100, activation='softmax'))

#3. 컴파일, 훈련

model.compile(loss = 'categorical_crossentropy', optimizer='adam', metrics=['acc'])
es = EarlyStopping(monitor='val_acc',
                   mode='auto',
                   restore_best_weights=True,
                   verbose=1,
                   patience=40)

hist = model.fit(x_train,y_train,
                 epochs=3000,
                 batch_size=256,
                 verbose=1,
                 callbacks=[es],
                 validation_split=0.2,
                 )

end_time = time.time()

#4. 평가, 예측

result = model.evaluate(x_test, y_test)
print('result :', result)

y_pred=model.predict(x_test)
y_pred=np.argmax(y_pred, axis=1)
y_true=np.argmax(y_test, axis=1)
acc = accuracy_score(y_pred, y_true)
print('acc :', acc)
print('걸린시간 :', round(end_time - start_time, 2))