层
- trainable属性可以设置层的weights和bias是否可以被更新
- 自定义层
- 编写自己的layer时,一定要注意考虑batch_size
- 尽量为每个层命名,这样在fine tuning的时候你会很方便的调整每个层
CNN
- Keras的Conv2D层的filter shape通常会写(width, height),实际上的shape是(width, height, channels), 因此输出的feature map个数是filter的个数
RNN
-
容易混淆的stateful参数,RNN都是自带state的,如果你有一个很长的序列(例如长度为1000), 你把它分为10个batch,每个batch长度为100,当stateful参数为False时,每个batch开始时,都会重置state,意味着第二个batch跟第一个batch没有任何关联,因此当不同的batch之间有关联时,需要指定stateful为True,同时需要指定batch_size的大小
-
return_sequences, 通常所理解的rnn是sequence to sequence的,但是可能经常会见到这样的代码:
model.add(LSTM(10)) model.add(Dense(1))
默认情况下,RNN层的return_sequences为False,只会输出序列中的最后一项,如果设为True,则会返回整个sequence
模型
- 多个子模型输出
model = Sequential() model1 = Sequential() model2 = Sequential() final_model = keras.models.Model(model.input,[model1.output, model2.output]) final_model.compile(loss=[model1_loss, model2_loss], metrics=['mse','mae'])
loss是一一对应的,metrics中所有的方式会对每一个输出模型评估一遍
- 如果数据集不平衡,可以使用class weights,假设0标签有100个,1标签只有10个,需要指定class_weights为10:1(根据实际需求作调整)
class_weights = {0: 1, 1: 10} model.fit(x.,y, class_weight = class_weights)
当输出层含有多个标签时,可以指定不同的输出使用不同的weights
class_weights = {'output_a':{0:10, 1:1}, 'output_b':{0:1, 1:10}} # output_a和output_b都是输出层的对应的layer name
backend
- reshape 包含batch_size的tensor时,需要使用tensorflow指定batch:
shape = K.shape(x) pool_shape = tf.stack([shape[0], ...]) # Here you can mix integers and symbolic elements of `shape` input_reshaped = K.reshape(x, pool_shape)
- K.transpose的axis无法指定,固定为(1,0),如果想修改多维变量的axis,可以使用K.permute_dismensions
tranposed = K.permute_dimensions(x, (0,2,3,1))
metrics
-
Keras2.0之后移除了很多比较有用的metrics,例如precision和recall等,旧版本的keras保留了很多metrics,在这里。
-
使用自定义metrics后,load_model需要指定metrics
model = keras.models.load_model('xxx.hdf5', custom_objects:{'metric_name':custom_metric})
测试
- 如果你想直接打印出某些结果,可以使用下面的代码
sess = tf.Session() with sess.as_default(): a = K.variable(np.array(...)) print(K.eval(a))
Tips
- 使用callback保存checkpoint,filepath中的val开头的变量需要在model.fit里指定validation_data时才可以使用
checkpoint = keras.callbacks.ModelCheckpoint(filepath = '...{epoch:02d}-{acc:.5f}-{loss:.5f}-{val_acc:.5f}-{val_loss:.5f}.hdf5') model.fit(x,y, validation_data=(x_val, y_val), callbacks=[checkpoint])
- 使用tensorflow做后端时,使用callback里的tensorboard,有助于调参
tensorboard = keras.callbacks.TensorBoard(log_dir = folder_path)
之后在model.fit的callbacks参数中添加上tensorboard
-
下载数据 使用keras的一些示例代码时,通常会有下载数据集或者模型的操作,自动下载非常慢,这个时候可以根据它提供的下载链接下好以后,放在 ~/.keras/的文件夹里,dataset对应 ~/.keras/datasets,model对应~/.keras/models。下载的时候要注意名字,正常情况下都无需修改名字,个别数据集会在自动下载时重命名,只需要自动下载时去对应的文件夹里看一眼正在下载的文件名,改过去即可
- 使用model.summary()
这个函数让你对model的结构一览无余,做最早的调试
model = Sequential() model.add(Dense(512, input_dim = 10)) print(model.summary())
Layer (type) Output Shape Param # ================================================================= dense_6 (Dense) (None, 512) 5632 ================================================================= Total params: 5,632 Trainable params: 5,632 Non-trainable params: 0 _________________________________________________________________ None