我目前正在创建一个基于LSTM的时间序列预测网络,并想尝试使用Keras的Bidirectional
包装器,看看它是否能提高我的准确性。
然而,添加包装器会导致我的输出层失去kernel
属性,这是个问题,因为我的优化器试图访问它,导致在编译时崩溃。
也就是说,当我这样做时:
model = Sequential()model.add(LSTM( 100, batch_input_shape=(batch_size, look_back, features),))model.add(Dense(1))print(hasattr(model.layers[-1], 'kernel'))
True
但当像这样包装LSTM时:
model = Sequential()model.add(Bidirectional(LSTM( 100, batch_input_shape=(batch_size, look_back, features),)))model.add(Dense(1))print(hasattr(model.layers[-1], 'kernel'))
False
回答:
解决方案是让你的网络预测一些东西,然后使用你的自定义优化器进行编译:
model = Sequential()model.add(Bidirectional(LSTM( 100, batch_input_shape=(batch_size, look_back, features),)))model.add(Dense(1))model.predict(np.zeros((batch_size, look_back, features)))print(hasattr(model.layers[-1], 'kernel'))model.compile(optimizer=CustomOptimizer(), loss='mse')
True