Keras使用心得记录

  • 创建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}

        参考: https://github.com/keras-team/keras/issues/8612

猜你喜欢

转载自blog.csdn.net/ygfrancois/article/details/84942803