우선 plt.plot()에 대해서 이해를 하고 가자.
plt.plot() 함수는 Matplotlib 라이브러리를 사용하여 그래프를 그릴 때 사용하는 함수입니다.
이 함수는 주어진 데이터를 그래프로 시각화하는 데 사용됩니다.
(주로 선 그래프를 그릴 때 사용되지만 다양한 스타일의 그래프를 그릴 수 있습니다.)
plt.plot() 함수의 기본적인 사용법은 다음과 같습니다
plt.plot(x,y,'format') ( format -> ex) 'r'[점으로 그래프 표시], 'r--'[점선으로 그래프 표시])
여기서 x는 x 축에 대한 데이터, y는 y 축에 대한 데이터이고, 'format'은 그래프의 스타일을 지정하는 문자열입니다.
예를 들어, 'r--'는 빨간색 점선을 의미합니다.
plt.plot() 함수를 호출하면 그래프가 생성되며, 생성된 그래프는 plt.show() 함수를 호출하여 화면에 출력됩니다.
아래의 코드 예시를 보며, 자세히 알아 보자
import numpy as np
import tensorflow as tf
import tensorflow.keras.datasets as ds
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import SGD
(x_train,y_train),(x_test,y_test) = ds.mnist.load_data()
x_train = x_train.reshape(60000,784)
x_test = x_test.reshape(10000,784)
x_train = x_train.astype(np.float32)/255.0
x_test = x_test.astype(np.float32)/255.0
y_train = tf.keras.utils.to_categorical(y_train,10)
y_test = tf.keras.utils.to_categorical(y_test,10)
model_SGD = Sequential()
model_SGD.add(Dense(units=512,activation='tanh',input_shape=(784,)))
model_SGD.add(Dense(units=10,activation='softmax'))
model_SGD.compile(loss='mse',optimizer=SGD(learning_rate=0.01),metrics=['accuracy'])
history_sgd = model_SGD.fit(x_train,y_train,batch_size=128,epochs=50,validation_data=(x_test,y_test),verbose=1)
res = model_SGD.evaluate(x_test,y_test,verbose=0)
print("SGE 정확률=",res[1]*100)
from tensorflow.keras.optimizers import Adam
model_Adam = Sequential()
model_Adam.add(Dense(units=512, activation='tanh',input_shape=(784,)))
model_Adam.add(Dense(units=10,activation='softmax'))
model_Adam.compile(loss='MSE',optimizer=Adam(learning_rate=0.001),metrics=['accuracy'])
history_adam = model_Adam.fit(x_train,y_train,batch_size=128,epochs=50,validation_data=(x_test,y_test), verbose=2)
res = model_Adam.evaluate(x_test,y_test,verbose=0)[1]*100
print("Adam 정확률=",res)
import matplotlib.pyplot as plt
plt.plot(history_sgd.history['accuracy'],'r--') # 각 Epoch에 대응하는 Accuracy 값을 Plot(여기서는 [점선] 그래프)형태로 포현
plt.plot(history_sgd.history['val_accuracy'],'r') #각 Epoch에 대응하는 Val_Accuracy 값을 Plot(여기서는 점 그래프) 형태로 표현
plt.plot(history_adam.history['accuracy'],'b--')
plt.plot(history_adam.history['val_accuracy'],'b')
plt.title('sgd vs adam')
plt.ylim((0.7,1.0)) # ylim : y limitation
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.legend(['train_sgd','val_sgd','train_adam','val_adam']) # plt.legend() 함수는 그래프의 범례(legend)를 추가하는 함수입니다.
# [범례]는 [각 선 또는 점에 대한 설명을 제공]하여 그래프를 이해하고 해석하는 데 도움이 됩니다.
# 여기서 "legend"는 [설명]을 의미하는 단어입니다.
# plt.legend() 함수는 [그래프에 어떤 데이터가 표시되었는지] 설명하는 텍스트를 추가합니다.
plt.grid()
plt.show()
plt.plot() 부분을 보면, 이상한 점을 발견하게 될 것이다.
분명 위에서 plt.plot()의 기본적인 사용법은 plt.plot(x,y,'formt')이라고 하였는데,
plt.plot(history_sgd.history['accuracy'],'r--') 코드에서는 어쩐지 y 값만을 명시하고 있다.
그렇다면 x에 대한 값은 어떻게 되는 것일까??
결론부터 말을 하자면, x 값이 생략되면 Matplotlib에서는 자동으로 x 값을 생성하기 때문입니다.
이 경우에는 history_sgd.history['accuracy']의 INDEX 값이 x 축으로 사용됩니다.
따라서 첫 번째 값은 인덱스 0, 두 번째 값은 인덱스 1이 되는 식으로 x 값이 자동으로 생성됩니다.
이는 일반적으로 그래프에서 데이터의 순서를 의미하며, 특별히 명시하지 않아도 되는 경우가 많습니다.
plt.ylim((0.7,1.0))
ylim()은 y limitation의 약자이며, 그래프에서 y축의 최소값과 y축의 최대값을 정해주는 역할이다.
말보다는 아래의 두 그림을 비교해 보면 어떤 의미인지 알 것이다.
ylim(0.7,1.0)이 적용된 그래프의 경우에는 y축이 0.7부터 시작하지만, 적용되지 않은 그래프는 0.0부터 시작된다.
plt.legend(['train_sgd','val_sgd','train_adam','val_adam'])
legend : 범례, 전설의 의미로서, 여기서는 [범례]의 뜻으로 해석된다. (범례는 [설명]이라고 생각하면 된다.)
plt.plot(history_sgd.history['accuracy'],'r--') # 1
plt.plot(history_sgd.history['val_accuracy'],'r') # 2
plt.plot(history_adam.history['accuracy'],'b--') # 3
plt.plot(history_adam.history['val_accuracy'],'b') # 4
// 생략
plt.legend(['train_sgd','val_sgd','train_adam','val_adam']
plt.legend(['train_sgd','val_sgd','train_adam','val_adam']는 위 #1 ~ #4에 해당하는 그래프에 대한 범례, 즉 설명하는 코드이
다.
왼쪽부터 순서대로 #1부터 #4까지 Mapping된다.
아래의 그림을 보고 참조를 하자.
'프로그래밍 언어 (プログラミング言語) > 파이썬' 카테고리의 다른 글
__getitem__()(Feat. 시퀀스(Sequence) 객체, 매핑(Mapping) 객체) (0) | 2024.04.08 |
---|---|
컴퓨터 비전과 딥러닝 P255(Matplotlib 관련 코드 설명) (0) | 2024.02.16 |
아나콘다(anadonda)를 사용하는 이유! (1) | 2023.12.21 |
List vs Array(Numpy) (0) | 2023.11.16 |