from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.convolutional import Convolution2D
from keras.layers.normalization import BatchNormalization
from keras import backend as K
from keras.layers import Input
from keras.datasets import mnist, cifar10
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
X_train = X_train.reshape(X_train.shape[0], 3, 32, 32).astype('float32')
X_train = (X_train - np.mean(X_train))/np.std(X_train)
inputs = Input(shape=(3,32,32))
bn1 = BatchNormalization(axis=1)(inputs)
act1 = Activation('relu')(bn1)
conv1 = Convolution2D(32, 3, 3, border_mode='same')(act1)
func1 = K.function([inputs], [conv1]) #conv1대신 act1 등 입력가능
val1 = func1([X_train[0:1]])[0] # [0]을 붙인 것은 val1이 list로 나오기 때문
# test용 입력을 만드는 방법
inp = np.random.randn(2,3,32,32)
rez = model.predict(inp[0:1])
rez.shape
# layers의 shape 출력
model.summay()
(Ref.)
[1] Keras FAQ.
[SSD - object detection 학습 절차]
답글삭제학습을 시작할 때 랜덤 가중치로 인해 loss가 아주 크게 나오는 것을 적당하게 작은 값으로 낮추어야 한다. 이를 위해 준비된 data 셋(계산량 과도를 피하기 위해 너무 data수가 많지 않게 함)에 대해 base_lr는 비교적 크게(3e-4)해서 학습한다.
학습이 잘 되지 않으면 transfer learning에서 freeze시킬 전반부 층의 수를 늘린다(14층->20층).
loss가 적절한 크기로 줄면(loss=1.2~3정도, val_loss=1.7 내외), 다른 data set를 이용하여 재학습한다.
이때 base_lr=3e-6정도로 줄여서 안정된 학습이 되도록 한다. 보통 loss=1.0, val_loss=0.75내외 정도에서 성공적인 결과를 보였다.