假设我想培训GRU,因为我需要stateful=true
,必须事先知道批量大小。
使用功能API我会有一个输入如下:
input_1 = Input(batch_shape=(batch_size, None, features))
但是当我评估模型时,我不想分批传递我的测试数据(batch_size = 1;一个观察的预测),具有固定的时间步长。我的 目前的解决方案是加载已保存的模型并使用以下命令重建它:
input_1 = Input(shape=(None, num_input_dim))
要做到这一点,虽然我需要一个遍历模型的每一层然后的方法 之后设置权重。
input_1 = Input(shape=(None, num_input_dim))
x1 = input_1
weights = []
for l in range(0, len(layers)):
if isinstance(layers[l], keras.layers.GRU):
x1 = GRU(layers[l].output_shape[-1], return_sequences=True)(x1)
weights.append(layers[l].get_weights())
elif isinstance(layers[l], keras.layers.Dense):
x1 = Dense(layers[l].output_shape[-1], activation='tanh')(x1)
weights.append(layers[l].get_weights())
else:
continue
(这只是一个例子,我发现这个解决方案非常不优雅。)
必须有更好的方法来重新定义输入形状。有人可以帮助我 请。
答案 0 :(得分:1)
由于您未使用stateful=True
模型进行评估,因此您需要重新定义模型。
您可以创建一个函数来创建模型,将选项作为输入:
def createModel(stateful, weights=None):
#input
if (stateful==True):
batch = batch_size
else:
batch = None
#You don't need fixed timesteps, even if the model is stateful
input_1 = Input(batch_shape=(batch_size, None, num_input_dim))
#layer creation as you did with your first model
...
out = LSTM(...., stateful=stateful)(someInput)
...
model = Model(input_1,out)
if weights is not None:
model.set_weights(weights)
return model
工作顺序:
#create the training model
trainModel = createModel(True,None)
#train
...
#create the other model
newModel = createModel(False,trainModel.get_weights())