首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras/Tensorflow对RNN层的输入

Keras/Tensorflow对RNN层的输入
EN

Stack Overflow用户
提问于 2019-03-10 00:02:30
回答 2查看 323关注 0票数 0

我正试图在Keras建立一个RNN。我不太明白所需的输入格式。我可以建立密集的网络没有问题,但我认为RNN层期望输入维x批x时间步长?有人能证实这一点吗?

下面是我想更新的代码:

原始代码:

代码语言:javascript
复制
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层和一些稍微不同的尺寸进行了修改:

代码语言:javascript
复制
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:张量(“gru_1/strided_slice:0”,shape=(3,10),dtype=float32)必须来自与张量相同的图(“strided_slice_1:0”,shape=(,3),dtype=float32)。

如果删除上面的None,就会得到:

ValueError:输入0与gru_1层不兼容:预期的ndim=3,找到ndim=2

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-10 17:02:23

您会得到一个错误,因为您在创建输入张量之后清除了会话。这就是为什么输入张量不是来自与网络其他部分相同的图形。要解决这个问题,只需省略行clear_session()

代码的另一个问题是:第二个GRU层需要一个序列输入,因此您应该在第一个GRU层中使用return_sequences=True。您可能希望省略参数return_state=True,因为这使得该层返回一个张量元组(输出和状态),而不是仅返回一个输出张量。

总之,下面的代码应该这样做:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2019-03-10 19:06:51

这里的问题是RNN层期望三维张量输入的形式: num样本,时间步骤,特征。

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

代码语言:javascript
复制
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个特征。

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

最后,如果您真的想要将数据输入到网络中,那么它的形状也应该与我们刚才讨论的内容相匹配。您可以通过使用numpy整形来做到这一点:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55083201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档