Keras库学习记-one 多层感知器

定义模型

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(层中神经元个数)、init(初始化方法)、activation(激活函数)

init为将网络权重初始化为均匀分布的小随机数,默认介于0和0.05之间的随机数。也可选择高斯分布产生小随机数。

activation包括ReLu(现研究表明可得更好性能)、sigmoid、tanh(首选)。

                  二分类的输出层通常采用sigmoid作为激活函数,单层神经网络中使用sgn,多分类使用softmax 。

                  回归问题的输出层不设置激活函数。


编译模型

指定训练模型时所需的一些属性。

model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])

其中loss(评估一组权重的损失函数)、optimizer(搜索网络不同权重的优化器)

loss对于二进制分类问题的对数损失函数被定义为二进制交叉熵('binary_crossentropy')。

optimizer优化器选取梯度下降法('adam'),默认值。


训练模型

model.fit(x=x , y=Y , epochs=150 , batch_size=10)

其中epochs(固定迭代次数)、batch_size(执行神经网络中的权重更新的每个批次中所用实例的个数)


评估模型

scores = model.evaluate(x=x , y=Y)

print('%s: %.2f%%' % (model.metrics_names[1],scores[1]*100))

evaluate()函数用来评估模型的精确度 


深度学习模型调参

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实践\\多层感知器\\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框架

便于在交叉验证的每一个折中执行数据标准化处理。

首先标准化数据集,然后创建和评估基线神经网络模型。

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)


模型增量更新

为了保证模型的时效性,需要定期对模型进行更新,这个时间间隔通常是3~6个月,甚至1~2个月。

在数据量非常大是,若每次采用全部数据取重新训练模型,则时间开销非常大,因此可以采用增量更新模型的方式对模型进行训练。

对于时间序的预测,增量更新相当于默认给最新的数据增加了权重,提高精确度。

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))  


神经网络的检查点

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')

''''''

#自动保存最优模型

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)

从检查点导入模型

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

#导入模型

model = load_model()

scores = model.evaluate(x,Y_labels,verbose=0)

print('%s: %.2f%%' % (model.metrics_names[1],scores[1]*100))


Drop与学习率衰减

drop针对神经网络模型的正则化方法。即在训练过程中,随机地忽略部分神经元。

输入层使用Dropout

dropout率设置为20%,这意味着每个更新周期中20%的输入将被随机排除。

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))) #约束权重最大限度不超过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

学习率衰减

# 学习率线性衰减

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)


# 学习率指数衰减

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)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容