from sklearn.model_selection import cross_validate
from sklearn.linear_model import SGDClassifier
sc = SGDClassifier(loss='log', max_iter=5) # max_iter=5 : 5번 에포크
scores = cross_validate(sc, train_X, train_y, n_jobs=-1)
print(np.mean(scores['test_score']))
- 딥러닝 라이브러리
- CPU, GPU를 사용해 인공 신경망 모델을 효율적으로 훈련
from tesorflow as tf
from tesorflow import keras
from sklearn.model_selection import train_test_split
train_X, val_X, train_y, train_y= \
train_test_split(train_X, train_y, test_size=0.2)
#test_size=0.2 : 검증 세트는 20%로
dense = keras.layers.Dense(n,activation='abc',input_shape=(x,y))
"은닉층" 활성화 함수 종류 | 설명 |
---|---|
'시그모이드 함수' | - 하나의 선형 방정식 출력값을 0~1사이로 압축 - 초창기 인공 신경망 은닉층에서 활용 -> 왼쪽&오른쪽 양 끝이 갈수록 누워있어 신속하게 대응 X |
'볼 렐루' | - 은닉층에서의 '시그모이드 함수' 단점 보완 - 입력이 양수일 경우, 활성화 함수가 없는 것 처럼 입력 통과 & 음수일 경우, 0으로 변환 |
#은닉층으로 사용할 것
dense1 = keras.layers.Dense(100, activation='sigmoid' input_shape=(784,))
dense2 = keras.layers.Dense(10,activation='softmax')
# model : 신경망 모델
model = leras.Sequential(dense)
# layer(층)이 2개 이상 일 경우 (은닉층 같이)
# 순서 중요 : 출력층을 가장 마지막에 위치
model = kearas.Sequential([dense1,dense2])
model.summary()
>>>
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_1 (Dense) (None, 100) 78500
dense_2 (Dense) (None, 10) 1010
=================================================================
Total params: 79510 (310.59 KB)
Trainable params: 79510 (310.59 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
model = keras.Sequential([
keras.layers.Dense(100,activation='sigmoid', input_shape =(784,), name = 'hidden'),
keras.layers.Dense(10,activation='softmax',name='output')
],name='패션 MNIST 모델')
model.summary()
>>>
Model: "패션 MNIST 모델"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
hidden (Dense) (None, 100) 78500
output (Dense) (None, 10) 1010
=================================================================
Total params: 79510 (310.59 KB)
Trainable params: 79510 (310.59 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
model = keras.Sequential()
model.add(keras.layers.Dense(100,activation='sigmoid', input_shape=(784,),name='hidden'))
model.add(keras.layers.Dense(10,activation='softmax',name='output'))
model.summary()
>>>
Model: "sequential_2"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
hidden (Dense) (None, 100) 78500
output (Dense) (None, 10) 1010
=================================================================
Total params: 79510 (310.59 KB)
Trainable params: 79510 (310.59 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
train_X= train_X.reshape(-1,n)
을 통해 1차원으로 변환하던 것을 Flatten 메서드로 간편하게 진행model = keras.Sequential()
#input_shape=(n,m) : 데이터 크기 n x m
model.add(keras.layers.Flatten(input_shape=(n,m)))
model.add(keras.layers.Dense(100, activation='relu'))
model.add(keras.layers.Dense(10,activation='softmax'))
model.summary()
>>>
#Flatten 층이 추가로 생김 -> 784개의 입력이 1차원으로 변환하여 은닉층에 전달
Model: "sequential_5"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten (Flatten) (None, 784) 0
dense_5 (Dense) (None, 100) 78500
dense_6 (Dense) (None, 10) 1010
=================================================================
Total params: 79510 (310.59 KB)
Trainable params: 79510 (310.59 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
# 원-핫 인코딩이 준비되지 않았을 경우,
model.compile(loss='sparse_categorial_crossentropy', metrics='accuracy')
# 원-핫 인코딩 준비됐을 경우,
model.compile(loss='categorial_crossentropy', metrics='accuracy')
model.fit(train_X, train_y, epochs=5, verbose=1)
#verbose=1 : default / 에포크마다 진행 막대 & 지표 등 표시
#verbose=0: 에포크마다 진행 막대 & 지표 등 표시 X
#verbose=2 : 에포크마다 지표 표시 (진행 막대 표시 X)
>>>>
Epoch 1/5
1500/1500 [==============================] - 8s 3ms/step - loss: 0.6105 - accuracy: 0.7931
Epoch 2/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.4744 - accuracy: 0.8387
Epoch 3/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.4509 - accuracy: 0.8481
Epoch 4/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.4369 - accuracy: 0.8514
Epoch 5/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.4292 - accuracy: 0.8549
<keras.src.callbacks.History at 0x7c8e7d74d870>
머신러닝에서 일종의 .score
과 동일한 구조
model.evaluate(val_X,val_target)
save_best_only = True
: 가장 낮은 검증 점수를 만드는 모델 저장patience = n
: n번 연속 검증 점수가 향상 되지 않으면 훈련 중지restore_best_weights=True
: 가장 낮은 검증 손실을 낸 모델 파라미터로 되돌림model = model_fn(keras.layers.Dropout(0.3))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')
checkpoint_cb = keras.callbacks.ModelCheckpoint('best-model.h5',save_best_only=True)
early_stopping_cb = keras.callbacks.EarlyStopping(patience=2,restore_best_weights=True)
history=model.fit(train_scaled, train_target, epochs=20,verbose=0, validation_data=(val_scaled, val_target),callbacks=[checkpoint_cb,early_stopping_cb])
추가할 은닉층의 개수
뉴런 개수
활성화 함수
층의 종류
배치 사이즈 매개변수
에포크 매개변수
compile 옵티마이저 설정
sgd=keras.optimizers.SGD(learning_rate=0.1)
sgd = keras.optimizers.SGD(momentum=0.9, nestrov=True)
model.compile(optimizer='sgd', loss='sparse_categorical_crossentropy', metrics='accuracy')
혹은
sgd=keras.optimizers.SGD()
model.compile(optimizer=sgd, loss='sparse_categorical_crossentropy', metrics='accuracy')
adagrad=keras.optimizers.Adagrad()
model.compile(optimizer=adagrad, loss='saprse_categorical_crossentropy', metrics='accuracy')
rmsprop=keras.optimizers.RMSprop()
model.compile(optimizer=rmsprop, loss='saprse_categorical_crossentropy', metrics='accuracy')
model.compile(optimizer='adam', loss='saprse_categorical_crossentropy', metrics='accuracy')
드롭아웃
#30 % 드롭 아웃함
model.add(keras.layers.Dropout(0.3))
교재 '혼자 공부하는 머신러닝 + 딥러닝'