这里的问题是RNN层期望形式的3D张量输入:[num samples,time steps,features]。
所以我们可以将上面的代码修改为:
def get_generative(G_in, dense_dim=10, out_dim=37, lr=1e-3): x = GRU(dense_dim, activation='tanh',return_state=True)(G_in) G_out = GRU(out_dim, return_state=True)(x) G = Model(G_in, G_out) opt = SGD(lr=lr) G.compile(loss='binary_crossentropy', optimizer=opt) return G, G_out G_in = Input(shape=(1,3)) G, G_out = get_generative(G_in) G.summary()
所以我们所说的是我们期望输入任意数量的样本,每个样本具有3个特征的1个时间步长。
Anna是正确的,clear_session()不应该在生成器函数中。
最后,如果您确实想要将数据输入网络,其形状也应该与我们刚才讨论的相匹配。你可以使用numpy reshape来做到这一点:
X = np.reshape(X, (X.shape[0], 1, X.shape[1]))
您收到错误,因为您在创建输入张量后清除会话。这就是为什么输入张量不是来自与网络其余部分相同的图形的原因。要解决这个问题,请简单地省略 clear_session() 。
clear_session()
您的代码的另一个问题:第二个GRU层需要序列输入,因此您应该使用 return_sequences=True 在第一个GRU层内。你可能想省略这个论点 return_state=True 因为这会使图层返回张量的元组(输出和状态)而不是仅仅一个输出张量。
return_sequences=True
return_state=True
总而言之,以下代码应该这样做:
def get_generative(G_in, dense_dim=10, out_dim=37, lr=1e-3): x = GRU(dense_dim, activation='tanh', return_sequences=True)(G_in) G_out = GRU(out_dim)(x) G = Model(G_in, G_out) opt = SGD(lr=lr) G.compile(loss='binary_crossentropy', optimizer=opt) return G, G_out