Keras
reference
use notebook (config ssh and keys)
jupyter-notebook
start from mnist
- input: 图像一般为4维[batch size,img cols,img rows,filters or channels],需要归一化以[0,1]
from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# y_train[60000,] -->> y_train[60000,10]
y_train=keras.utils.to_categorical(y_train,num_classes=10)
y_test=keras.utils.to_categorical(y_test,num_classes=10)
# x_train[60000,28,28] -->> x_train[60000,28,28,1]
x_train=x_train.reshape([x_train.shape[0],28,28,1])
x_test=x_test.reshape([x_test.shape[0],28,28,1])
# int -->> float32
x_train=x_train.astype('float32')
x_test=x_test.astype('float32')
# 0~255 -->> 0~1
x_train/=255
x_test/=255
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
log=keras.callbacks.TensorBoard(log_dir='./logs')
model.fit(x_train, y_train, batch_size=32, epochs=10,
validation_split=0.3,callbacks=[log])
# 输出模型统计
model.summary()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_26 (Conv2D) (None, 26, 26, 32) 320
_________________________________________________________________
conv2d_27 (Conv2D) (None, 24, 24, 32) 9248
_________________________________________________________________
max_pooling2d_13 (MaxPooling (None, 12, 12, 32) 0
_________________________________________________________________
conv2d_28 (Conv2D) (None, 10, 10, 32) 9248
_________________________________________________________________
max_pooling2d_14 (MaxPooling (None, 5, 5, 32) 0
_________________________________________________________________
dropout_18 (Dropout) (None, 5, 5, 32) 0
_________________________________________________________________
flatten_10 (Flatten) (None, 800) 0
_________________________________________________________________
dense_17 (Dense) (None, 256) 205056
_________________________________________________________________
dropout_19 (Dropout) (None, 256) 0
_________________________________________________________________
dense_18 (Dense) (None, 10) 2570
=================================================================
Total params: 226,442
Trainable params: 226,442
Non-trainable params: 0
# 测试集结果
score = model.evaluate(x_test, y_test, batch_size=32)
# score[0] 为Loss, 当model.compile(metrics=['accuracy']时,score[1]为accuracy
print('accuracy is ',score[1])
model.save('mnist-mpl.h5')
from keras.models import load_model
model=load_model('mnist-mpl.h5')
model.compile(loss='categorical_crossentropy',
optimizer=RMSprop(),
metrics=['accuracy'])
score = model.evaluate(X_test, Y_test, verbose=0)
print('Test score:', score[0])
print('Test accuracy:', score[1])
# 自定义loss函数后,训练得到的模型直接Load会找不到对应的loss函数,应该通过load_weights的方式进行加载
- checkpoint: 采用keras 在训练时的回调
tensorboard_log=keras.callbacks.TensorBoard(log_dir='./logs')
# std_log=keras.callbacks.ProgbarLogger(count_mode='samples')
checkpoint=keras.callbacks.ModelCheckpoint(filepath='./checkpoints/weights.{epoch:02d}-{val_loss:.2f}.hdf5',
monitor='val_loss',verbose=0, save_best_only=False, save_weights_only=False, mode='auto', period=1)
train_gen=dataset.batch_gen(batch_size=32,years=[2012])
validate_gen=dataset.batch_gen(batch_size=32,years=[2012])
self.model.fit_generator(generator=train_gen,samples_per_epoch=32*100,epochs=10,
validation_data=validate_gen,validation_steps=32*100,callbacks=[tensorboard_log,checkpoint],verbose=1)