定義模型
Dense類定義完全連接的層
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(unit=12,input_dim=8,activation='relu'))
model.add(Dense(8,activation='relu'))
model.add(Dense(1,activation='sigmoid'))
其中unit(層中神經(jīng)元個(gè)數(shù))聋丝、init(初始化方法)轨帜、activation(激活函數(shù))
init為將網(wǎng)絡(luò)權(quán)重初始化為均勻分布的小隨機(jī)數(shù)唧领,默認(rèn)介于0和0.05之間的隨機(jī)數(shù)。也可選擇高斯分布產(chǎn)生小隨機(jī)數(shù)匙握。
activation包括ReLu(現(xiàn)研究表明可得更好性能)、sigmoid、tanh(首選)押框。
? ? ? ? ? ? ? ? ? 二分類的輸出層通常采用sigmoid作為激活函數(shù),單層神經(jīng)網(wǎng)絡(luò)中使用sgn理逊,多分類使用softmax 橡伞。
? ? ? ? ? ? ? ? ? 回歸問(wèn)題的輸出層不設(shè)置激活函數(shù)。
編譯模型
指定訓(xùn)練模型時(shí)所需的一些屬性晋被。
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
其中loss(評(píng)估一組權(quán)重的損失函數(shù))兑徘、optimizer(搜索網(wǎng)絡(luò)不同權(quán)重的優(yōu)化器)
loss對(duì)于二進(jìn)制分類問(wèn)題的對(duì)數(shù)損失函數(shù)被定義為二進(jìn)制交叉熵('binary_crossentropy')。
optimizer優(yōu)化器選取梯度下降法('adam')羡洛,默認(rèn)值挂脑。
訓(xùn)練模型
model.fit(x=x , y=Y , epochs=150 , batch_size=10)
其中epochs(固定迭代次數(shù))、batch_size(執(zhí)行神經(jīng)網(wǎng)絡(luò)中的權(quán)重更新的每個(gè)批次中所用實(shí)例的個(gè)數(shù))
評(píng)估模型
scores = model.evaluate(x=x , y=Y)
print('%s: %.2f%%' % (model.metrics_names[1],scores[1]*100))
evaluate()函數(shù)用來(lái)評(píng)估模型的精確度?
深度學(xué)習(xí)模型調(diào)參
from sklearn.model_selection import GridSearchCV
from keras.wrappers.scikit_learn import KerasClassifier
def create_model(optimizer='adam',init='glorot_uniform'):
? ? ? model = Sequential()
? ? ? model.add(Dense(12,kernel_initializer=init,input_dim=8,activation='relu'))
? ? ? model.add(Dense(8,kernel_initializer=init,activation='relu'))
? ? ? model.add(Dense(1,kernel_initializer=init,activation='sigmoid'))
? ? ? model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
? ? ? return model
seed = 7
np.random.seed(seed)
dataset = np.loadtxt('C:\\Users\\ThinkPad\\Desktop\\Keras實(shí)踐\\多層感知器\\pima-indians-diabetes.csv',delimiter=',')
x = dataset[:,0:8]
y = dataset[:,8]
model = KerasClassifier(build_fn=create_model,verbose=0)
param_grid = {}
param_grid['optimizer'] = ['rmsprop','adam']
param_grid['init'] = ['glorot_uniform','normal','uniform']
param_grid['epochs'] = [50,100,150,200]
param_grid['batch_size'] = [5,10,20]
grid = GridSearchCV(estimator=model,param_grid=param_grid)
results = grid.fit(x,y)
print('Best: %f using %s' % (results.best_score_, results.best_params_))
means = results.cv_results_['mean_test_scores']
stds = results.cv_results_['std_test_scores']
params = results.cv_results_['params']
for mean,std,param in zip(means,stds,params):
? ? ? ? ?print('%f (%f) with: %r' % (mean,std,param))
Pipeline框架
便于在交叉驗(yàn)證的每一個(gè)折中執(zhí)行數(shù)據(jù)標(biāo)準(zhǔn)化處理欲侮。
首先標(biāo)準(zhǔn)化數(shù)據(jù)集崭闲,然后創(chuàng)建和評(píng)估基線神經(jīng)網(wǎng)絡(luò)模型。
steps = []
steps.append(('standardize',StandardScaler()))
steps.append(('mlp',model))
pipeline = Pipeline(steps)
kfold = KFold(n_splits=10,shuffle=True,random_state=seed)
results = cross_val_score(pipeline,x,y,cv=kfold)
模型增量更新
為了保證模型的時(shí)效性威蕉,需要定期對(duì)模型進(jìn)行更新刁俭,這個(gè)時(shí)間間隔通常是3~6個(gè)月,甚至1~2個(gè)月忘伞。
在數(shù)據(jù)量非常大是薄翅,若每次采用全部數(shù)據(jù)取重新訓(xùn)練模型,則時(shí)間開銷非常大氓奈,因此可以采用增量更新模型的方式對(duì)模型進(jìn)行訓(xùn)練翘魄。
對(duì)于時(shí)間序的預(yù)測(cè),增量更新相當(dāng)于默認(rèn)給最新的數(shù)據(jù)增加了權(quán)重舀奶,提高精確度暑竟。
from sklearn.model_selection import train_test_split
x_train,x_increment,Y_train,Y_increment = train_test_split(x,Y,test_size=0.2,random_state=seed)
······
new_model.compile(loss='categorical_crossentropy',optimizer='rmsprop',metrics=['accuracy'])
Y_increment_labels =to_categorical(Y_increment,num_classes=3)?
new_model.fit(x_increment,Y_increment_labels,epochs=10,batch_size=5,verbose=2)?
scores = new_model.evaluate(x_increment,Y_increment_labels,verbose=0)?
print('Incremrnt %s: %.2f%%' % (model.metrics_names[1],scores[1]*100))??
神經(jīng)網(wǎng)絡(luò)的檢查點(diǎn)
from keras.callbacks import ModelCheckpoint
filepath = 'weights-improvment-{epoch:02d}-{val_acc:.2f}.h5'
checkpoint = ModelCheckpoint(filepath=filepath,monitor='val_acc',verbose=1,save_best_only=False,mode='max')
''''''
#自動(dòng)保存最優(yōu)模型
filepath = 'weights.best.h5'
checkpoint = ModelCheckpoint(filepath=filepath,monitor='val_acc',verbose=1,save_best_only=True,mode='max')
''''''
callback_list = [checkpoint]
model.fit(x,Y_labels,validation_split=0.2,epochs=200,batch_size=5,verbose=0,callbacks=callback_list)
從檢查點(diǎn)導(dǎo)入模型
def load_model(optimizer='rmsprop',init='glorot_uniform'):
????model = Sequential() ????model.add(Dense(units=4,activation='relu',input_dim=4,kernel_initializer=init))?
????model.add(Dense(units=6,activation='relu',kernel_initializer=init)) ????model.add(Dense(units=3,activation='softmax',kernel_initializer=init))?
????filepath = 'weights.best.h5'
? ? model.load_weights(filepath=filepath) ????model.compile(loss='categorical_crossentropy',optimizer=optimizer,metrics=['accuracy'])
?????return model
#導(dǎo)入模型
model = load_model()
scores = model.evaluate(x,Y_labels,verbose=0)
print('%s: %.2f%%' % (model.metrics_names[1],scores[1]*100))
Drop與學(xué)習(xí)率衰減
drop針對(duì)神經(jīng)網(wǎng)絡(luò)模型的正則化方法。即在訓(xùn)練過(guò)程中育勺,隨機(jī)地忽略部分神經(jīng)元但荤。
輸入層使用Dropout
dropout率設(shè)置為20%,這意味著每個(gè)更新周期中20%的輸入將被隨機(jī)排除涧至。
def create_model(optimizer='rmsprop',init='glorot_uniform'):
? ? model = Sequential()
? ? model.add(Dropout(rate=0.2,input_shape=(4,)))
? ? model.add(Dense(units=4,activation='relu',input_dim=4,kernel_initializer=init))
? ? model.add(Dense(units=6,activation='relu',kernel_initializer=init))
? ? model.add(Dense(units=3,activation='softmax',kernel_initializer=init))
? ? sgd = SGD(lr=0.01,momentum=0.8,decay=0.0,nesterov=False)? #定義Dropout
? ? model.compile(loss='categorical_crossentropy',optimizer=optimizer,metrics=['accuracy'])
? ? return model
隱含層使用Dropout
def create_model(init='glorot_uniform'):
? ? model = Sequential()
? ? model.add(Dense(units=4,activation='relu',input_dim=4,kernel_initializer=init,kernel_constraint=maxnorm(3))) #約束權(quán)重最大限度不超過(guò)3
? ? model.add(Dropout(rate=0.2))
? ? model.add(Dense(units=6,activation='relu',input_dim=4,kernel_initializer=init,kernel_constraint=maxnorm(3)))
? ? model.add(Dropout(rate=0.2))
? ? model.add(Dense(units=3,activation='softmax',kernel_initializer=init))
? ? sgd = SGD(lr=0.01,momentum=0.8,decay=0.0,nesterov=False)
? ? model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy'])
? ? return model
學(xué)習(xí)率衰減
# 學(xué)習(xí)率線性衰減
def create_model(init='glorot_uniform'):
? ? model = Sequential()
? ? model.add(Dense(units=4,activation='relu',input_dim=4,kernel_initializer=init))
? ? model.add(Dense(units=6,activation='relu',kernel_initializer=init))
? ? model.add(Dense(units=3,activation='softmax',kernel_initializer=init))
? ? learningRate = 0.1
? ? momentum = 0.9
? ? decay_rate = 0.005
? ? sgd = SGD(lr=learningRate,momentum=momentum,decay=decay_rate,nesterov=False)
? ? model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy'])
? ? return model
epochs = 200
model = KerasClassifier(build_fn = create_model,epochs=epochs,batch_size=5,verbose=1)
model.fit(x,Y)
# 學(xué)習(xí)率指數(shù)衰減
def step_decay(epoch):
? ? init_lrate = 0.1
? ? drop = 0.5
? ? epochs_drop = 10
? ? lrate = init_lrate*pow(drop,floor(1+epoch)/epochs_drop)
? ? return lrate
def create_model(init='glorot_uniform'):
? ? model = Sequential()
? ? model.add(Dense(units=4,activation='relu',input_dim=4,kernel_initializer=init))
? ? model.add(Dense(units=6,activation='relu',kernel_initializer=init))
? ? model.add(Dense(units=3,activation='softmax',kernel_initializer=init))
? ? learningRate = 0.1
? ? momentum = 0.9
? ? decay_rate = 0.0
? ? sgd = SGD(lr=learningRate,momentum=momentum,decay=decay_rate,nesterov=False)
? ? model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy'])
? ? return model
lrate = LearningRateScheduler(step_decay)
epochs = 200
model = KerasClassifier(build_fn = create_model,epochs=epochs,batch_size=5,verbose=1,callbacks=[lrate])
model.fit(x,Y)