繁体   English   中英

Keras / Tensorflow输入到RNN层

[英]Keras/Tensorflow Input to RNN layers

我正在尝试在Keras中建立RNN。 我不太了解所需的输入格式。 我可以建立密集网络,没问题,但是我认为RNN层期望输入尺寸x批处理x时间步长? 有人可以验证吗?

这是我要更新的代码:

原始代码:

def get_generative(G_in, dense_dim=200, out_dim=50, lr=1e-3):
   x = Dense(dense_dim)(G_in)
   x = Activation('tanh')(x)
   G_out = Dense(out_dim, activation='tanh')(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=[10])
G, G_out = get_generative(G_in)
G.summary()

修改了GRU图层和一些稍微不同的尺寸:

def get_generative(G_in, dense_dim=10, out_dim=37, lr=1e-3):
   clear_session()
   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=(None,3))
G, G_out = get_generative(G_in)
G.summary()

我在此代码中看到的错误是:ValueError:Tensor(“ gru_1 / strided_slice:0”,shape =(3,10),dtype = float32)必须与Tensor(“ strided_slice_1:0”)来自同一图, shape =(?, 3),dtype = float32)。

如果删除上面的“ None”,则会得到:ValueError:输入0与gru_1层不兼容:预期ndim = 3,找到ndim = 2

任何解释在这里都会有所帮助。

因为创建输入张量后清除了会话,所以会出现错误。 这就是为什么输入张量与网络的其余部分来自不同的图的原因。 要解决此问题,只需省去clear_session()

您的代码还有另一个问题:第二个GRU层需要一个序列输入,因此您应该在第一个GRU层中使用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

这里的问题是RNN层需要以下形式的3D张量输入:[数量样本​​,时间步长,特征]。

因此,我们可以将上面的代码修改为:

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()

因此,我们要说的是,我们希望输入任意数量的样本,每个样本具有1个时间步长和3个特征。

安娜是正确的,clear_session()不应在生成器函数中。

最后,如果您确实想将数据输入到网络中,则其形状也应与我们刚刚讨论的形状匹配。 您可以使用numpy reshape来做到这一点:

X = np.reshape(X, (X.shape[0], 1, X.shape[1]))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM