-
创建model(Squential形式):
model.Squential()
model.add(Dense(num_pixels, input_dim=num_pixels, init='normal', activation='relu'))
model.add(Dense(num_classes, init='normal', activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
-
保存model:
model.save('test_model.h5')
-
基于已有模型继续训练,直接load,然后调用train:
model = load_model('test_model.h5')
-
Squential形式的model是简化版functional形式,只能用于layer与layer间的串联,不能完成多输入和多输出的任务, Squential是functional的子集.
-
fit_generator与fit相比,可以节省内存,fit会将所有的数据一次性读进来,fit_generator需要使用对应的data_generator.
fit里可以直接定义validation_split=0.2来完成验证集的划分, fit_generator通过定义validation_data和validation_steps两个参数来设置验证集(参考:https://stackoverflow.com/questions/45943675/meaning-of-validation-steps-in-keras-sequential-fit-generator-parameter-list)
validation_data=data_val_gen,
validation_steps=TotalvalidationSamples / ValidationBatchSize
验证会进行在当前epoch结束后进行, validation_steps设置了验证使用的validation data steps数量(batch数量), 如validation batch size(没必要和train batch相等)=64, validation_steps=100,(steps相当于batch数, 应<=TotalvalidationSamples / ValidationBatchSize) 则会从validation data中取6400个数据用于验证(如果一次step后validation data set剩下的data足够下一次step,会继续从剩下的data set中选取, 如果不够会重新循环).
建议使用整个验证集用于验证,否则每次验证的结果没有太大可比性(使用的验证数据不同),这种情况可以跳过validation_steps参数, 默认使用所有data来做validation. 如果验证数据集很大,全部使用验证会很耗时, 可以设置固定大小的validation_steps=10,则在10个验证batch后,计算损失平均值给出结果.
-
存训练好的模型可以调用callback函数里的ModelCheckpoint:
save_fname = os.path.join(save_dir, '%s-e%s.h5' % (dt.datetime.now().strftime('%d%m%Y-%H%M%S'), str(epochs))) # 将时间和epoch id存到模型名称中
callbacks = [ModelCheckpoint(filepath=save_fname, monitor='loss', save_best_only=True)]
-
load_model时包含自己定义的layer时需要在load_model()函数里添加参数:
custom_objects={'AttentionLayer': AttentionLayer}