keras學習記錄——訓練resnet模型對cifar10分類
目錄
keras學習記錄——訓練resnet模型對cifar10分類
前言
一、資料準備
二、構建網路
三、網路訓練
四、訓練結果
總結
前言
最近在對resnet中的add操作做量化處理,所以先將resnet對cifar10分類訓練記錄下來,
提示:以下是本篇文章正文內容,下面案例可供參考
一、資料準備
- 直接呼叫keras中的資料庫:
from keras.datasets import cifar10 (data_train, label_train), (data_test, label_test) = cifar10.load_data() data_train = (data_train-127.5) / 128 data_test = (data_test - 127.5) /128如果需要將便簽轉變為one-hot編碼,可以使用如下:
label_train = keras.utils.to_categorical(label_train,10) label_test = keras.utils.to_categorical(label_test, 10) -
如果呼叫時太慢,可以下載cifar-10-python.tar.gz,網上有很多資源,這里就不放鏈接了,之后將cifar10.load_data()函式中下述路徑改為本地路徑即可,
origin = 'https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz'
二、構建網路
- resnet_block
代碼如下:
def resnet_block(input, num_filters=16, kernel_size=3, strides=1, activation='relu'):
# x = Conv2D(num_filters, kernel_size=kernel_size,strides=strides,padding='same')(input)
x = Conv2D(num_filters, kernel_size=kernel_size, strides=strides, padding='same',
kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(input)
x = BatchNormalization()(x)
x = Activation('relu')(x)
x = Conv2D(num_filters, kernel_size=kernel_size, strides=1,padding='same')(x)
x = BatchNormalization()(x)
if strides==1:
shortcut = input
else:
shortcut = Conv2D(num_filters, kernel_size=kernel_size,strides=strides,padding='same')(input)
# x = myAdd(activation='relu')([x, shortcut])
x = keras.layers.add([x, shortcut])
x = Activation('relu')(x)
return x
結構如下:

2. resnet
代碼如下:
def resnet(input_shape):
inputs = Input(shape=input_shape)
# 1
x = Conv2D(16, activation='relu', kernel_size=3, strides=1,padding='same')(inputs)
x = BatchNormalization()(x)
print('layer1,xshape:', x.shape)
# 2-7
for i in range(6):
x = resnet(x, num_filters=16, kernel_size=3, strides=1, activation='relu')
# out: 32*32*16
# 8-13
for i in range(6):
if i == 0:
x = resnet(x, num_filters=32, kernel_size=3, strides=2, activation='relu')
else:
x = resnet(x, num_filters=32, kernel_size=3, strides=1, activation='relu')
# out: 16*16*32
# 14-19
for i in range(6):
if i == 0:
x = resnet(x, num_filters=64, kernel_size=3, strides=2, activation='relu')
else:
x = resnet(x, num_filters=64, kernel_size=3, strides=1, activation='relu')
# out: 8*8*64
x = AveragePooling2D(pool_size=2)(x)
# out: 4*4*64
y = Flatten()(x)
# out:1024
outputs = Dense(10, kernel_initializer='he_normal')(y)
# outputs = myDense(10, kernel_initializer='glorot_normal', use_batchnormal = False)(y)
outputs = Activation('softmax')(outputs)
model = Model(inputs=inputs, outputs=outputs)
return model
三、網路訓練
代碼如下:
model = resnet((32,32,3))
model.compile(loss='sparse_categorical_crossentropy', optimizer=Adam(), metrics=['accuracy'])
model.summary()
plot_model(model, to_file='./model.png', show_shapes=True)
# checkpoint = ModelCheckpoint(filepath='saved_models/'+config['mode']+'-'+str(config['epoch'])+'-'+str(config['batch_size'])+'-{val_accuracy:.4f}'+'.h5',monitor='val_accuracy',
# verbose=1,save_best_only=True)
csv_logger = CSVLogger('saved_models/'+config['mode']+'-'+str(config['epoch'])+'-'+str(config['batch_size'])+'.log', append=False)
lr_reducer = ReduceLROnPlateau(monitor='val_accuracy', factor=0.2, patience=5,
mode='max', min_lr=1e-3)
# model.fit(data_train, label_train,batch_size=64,epochs=1, validation_data=(data_test,label_test), verbose=1, callbacks=callbacks)
aug = ImageDataGenerator(width_shift_range=0.2,height_shift_range=0.2,horizontal_flip=True,zoom_range=0.2)
aug.fit(data_train)
gen = aug.flow(data_train, label_train, batch_size=config['batch_size'])
model.fit_generator(generator=gen,epochs=config['epoch'],validation_data=(data_test,label_test),
callbacks=[lr_reducer, csv_logger], verbose=1)
四、訓練結果
由于時間關系,并未將網路訓練完全,

總結
學習到了關于keras中訓練的小技巧,如:earlystop等,并且學會了如何構建殘差神經網路,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/188094.html
標籤:其他
