keras搬砖系列-重新认识keras
对事物学习后应该有一个新的认知,决定重看这些概念发现确实有不一样的理解。
keras是采用计算图模型,也就是说每次我们把框架搭好后,需要我们自己实际注入数据才可以运行。
keras调用GPU
采用tf为后端的时候,当机器上有GPU的时候,代码会自己调用GPU采取并行计算。
对于keras可以采用多GPU进行并行计算。在keras的keras.utils.multi_gpu_model中。
from keras.utils import multi_gpu_model
parallel_model = multi_gpu_model(model,gpus=8)
parallel_model.compile(loss='categorical_crossentropy',optimizer='rmsprop')
parallel_model.fit(x,y,epochs=20,batch_size=256)
keras设备并行
设备并行是在不同设备上运行同一个模型的不同部分,当模型含有多个并行结构的时候,则可以进行并行
input_a = keras.Input(shape=(140,256))
input_b = keras.Input(shape=(140,256))
with tf.device_scope('/gpu:0'):
encoded_a = shared_lstm(tweet_a)
with tf.device_scope('/cpu:0'):
merged_vector = keras.layers.concatenate([encoded_a,encoded_b],axis=-1)
保存keras模型
可以使用model.save(filepath)
该文件包含了:模型的结构,以便重构该模型。模型的权重,训练配置(损失函数,优化器),优化器的状态,以便从上次中断的地方开始
使用keras.model.load_model(filepath)来重新实例化你的模型,如果文件中还存储了训练配置的话,该函数还会同时完成模型的编译。
from keras.model import load_model
model.save('my_model.h5')
model = load_model('my_model.h5')
如果只是希望保持模型的结构,不包含权重或者配置信息,可以使用:
json_string = model.to_json()
yaml_string = model.to_yaml()
from keras.model import model_from_json
from keras.model import model_from_yaml
model = model_from_json(json_string)
如果需要保存模型的权重,可通过下面的代码进行HDF5进行保存。
必须装了HDF5和其他Python的h5py库
model.save_weights('my_model_weights.h5')
如果你需要加载权重到不同的网络结构中,你可以通过层的名字来加载模型
model.load_weights('my_model_weights.h5',by_name=True)
例子:
'''
原模型为:
model = Sequential()
model.add(Dense(2,input_dim=3,name='dense_1'))
model.add(Dense(3,name='dense_2'))
.....
model.save_weights(fname)
'''
model = Sequential()
model.add(Dense(2,3,name='dense_1'))
model.add(Dense(10,name='new_dense'))
model.load_weights(fname,by_name=True)
如何用keras处理超过机器内存的数据集
可以使用train_on_batch(x,y)和test_on_batch(x,y)来进行处理
可以编写一个每次产生一个batch样本的生成器函数,并调用model.fit_generator(data_generator,samples_per_epoch,nb_epoch)
如何获取中间层的输出
一种简单的方法就是创建一个新的Model,使得它的输出是你想要的那个输出
from keras.models import Model
model = ....
layer_name = 'my_layer'
intermediate_layer_model = Model(input=model.input,output=model.get_layer(layer_name).output)
intermediate_output = intermediate_layer_model.predict(data)
当验证集的loss不再下降的时候,如何中断训练?
EarlyStopping来提前终止训练
from keras.callbacks import EarlyStopping
early_stopping = EarlyStopping(monitor='val_loss',patience=2)
model.fit(x,y,validation_split=0.2,callbacks=[early_stopping])
训练数据会在训练的时候进行打乱shuffle默认值为true。验证集通过validation_split来进行分割,假设validation_split=0.1则后一半设置为验证集。
如何在每个epoch后记录训练/测试的loss和正确率
hist = model.fit(x,y,validation_split=0.2)
print(hist.history)
通过.pop去除一层