특이한 컨볼루션 레이어들이 엄청 많다...
AIVLE 과정에서는 다루지 않고 내가 따로 공부하면서 알게된 것들이 많아서 그것에 대한 정리도 필요할듯....
Convolutional Layer
이미지 구조를 파괴하지 않으며 위치정보 보존하기 위함
(이미지 구조를 유지한 채로 부분에서 특징을 뽑음)
Feature map
Pooling (Subsampling - downsampling)
preprocessing의 목적
padding의 목적
모델의 구조만 보고 정보들을 파악할 수 있어야함
논문 갖고 연습필요
파라미터개수등...찾아서 적기
bounding box
class classification
confidence score
유사한 문제를 해결하기 위해 다른 사람이 생성하고 대규모 데이터 세트에서 훈련된 모델 또는 저장된 네트워크
데이터셋을 해결하려는 문제에 맞춰 재구성하고 이 데이터셋을 사전학습 모델에 학습 시킴
Pre-trained model을 다음과 같은 형태로 사용될 수 있음
Feature extraction
: output layer만 새로운 문제에 맞게 수정하고 그대로 사용
pre-trained model 아키텍쳐 사용
: 아키텍쳐만 채용하고 weight는 initialize
일부 layer만 training하고 나머지 layer는 고정
: 부분적으로 training 하는 방법. 보통 초기 layer (input에 가까운 layer)를 고정하고 상위 layer(output에 가까운 layer)를 training 하는 방법
데이터 로딩 및 구조 변경
data = io.loadmat("notMNIST_small.mat")
X = data['images']
y = data['labels']
resolution = 28
classes = 10
X = np.transpose(X, (2, 0, 1))
y = y.astype('int32')
X = X.astype('float32') / 255.
# shape: (sample, x, y, channel)
X = X.reshape((-1, resolution, resolution, 1))
# y one-hot encoding
from tensorflow.keras.utils import to_categorical
num_classes = len(np.unique(y))
y = to_categorical(y,num_classes)
# splitting data
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2023)
모델 정의
from tensorflow import keras
keras.backend.clear_session()
model = keras.models.Sequential()
model.add(keras.layers.Input(shape=(28,28,1)))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(128,activation='relu'))
model.add(keras.layers.Dense(128,activation='relu'))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Dropout(0.2))
model.add(keras.layers.Dense(64,activation='relu'))
model.add(keras.layers.Dense(64,activation='relu'))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Dropout(0.2))
model.add(keras.layers.Dense(10,activation='softmax')) #output개수가 10개중 확률
model.compile(loss='categorical_crossentropy',
optimizer = 'adam', metrics = ['accuracy'])
model.summary()
early stopping 정의
es = keras.callbacks.EarlyStopping(monitor='val_loss',
min_delta=0,
patience=10,
verbose=1,
restore_best_weights=True)
모델 훈련
model.fit(x_train,y_train, epochs=100, validation_split=0.2, callbacks = [es])