我有一个训练有素的keras模型,该模型接受大小(batchSize,2)的输入。这样效果很好,效果很好。
我的主要问题是要有一个模型,该模型接受一个输入,该向量的大小为(batchSize,2,16),并将其在模型中切成16个大小为(batchSize,2)的向量,并将输出连接在一起。
我已将此代码用于 p>
y = layers.Input(shape=(2,16,))
model_x= load_model('saved_model')
for i in range(16):
x_input = Lambda(lambda x: x[:, :, i])(y)
if i == 0:
x_output = model_x(x_input)
else:
x_output = layers.concatenate([x_output,
model_x(x_input)])
x_output = Lambda(lambda x: x[:, :tf.cast(N, tf.int32)])(x_output)
final_model = Model(y, x_output)
尽管保存的模型为我提供了良好的性能,但是此代码不能很好地训练并且没有提供预期的性能。 我该怎么做才能获得更好的结果?
答案 0 :(得分:1)
对于您的最终模型的不良表现,我无话可说,因为这可能是由于各种原因造成的,而从您的问题的内容中并不能很明显地看出这一点。但是要回答您的原始问题:是的,您可以使用for
循环,因为实际上是在创建层/张量并将它们彼此连接(即,构建模型图)。所以这是一件有效的事情。问题可能出在其他地方,例如错误的索引编制,错误的损失函数等。
此外,您可以用一种更简单的方法来构建最终模型。您已经有一个训练有素的模型,该模型获取形状为(batch_size, 2)
的输入并给出形状为(batch_size, 8)
的输出。现在,您要构建一个使用形状为(batch_size, 2, 16)
的输入的模型,将已经训练好的模型应用于16个(batch_size, 2)
段中的每一个,然后将结果连接起来。您可以使用TimeDistributed
包装器轻松做到这一点:
# load your already trained model
model_x = load_model('saved_model')
inp = layers.Input(shape=(2,16))
# this makes the input shape as `(16,2)`
x = layers.Permute((2,1))(inp)
# this would apply `model_x` on each of the 16 segments; the output shape would be (None, 16, 8)
x = layers.TimeDistributed(model_x)(x)
# flatten to make it have a shape of (None, 128)
out = layers.Flatten()(x)
final_model = Model(inp, out)