- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尽管我对机器学习并不陌生,但我对神经网络仍然比较陌生,更具体地说是如何实现它们(在 Keras/Python 中)。前馈和卷积架构相当简单,但我在使用 RNN 时遇到了麻烦。
我的 X
数据由可变长度序列组成,该序列中的每个数据点都有 26 个特征。我的 y
数据虽然长度可变,但每对 X
和 y
具有相同的长度,例如:
X_train[0].shape: (226,26)
y_train[0].shape: (226,)
X_train[1].shape: (314,26)
y_train[1].shape: (314,)
X_train[2].shape: (189,26)
y_train[2].shape: (189,)
我的目标是将序列中的每个项目分类为 39 个类别之一。
到目前为止,我通过阅读示例代码可以了解到,我们做了如下的事情:
encoder_inputs = Input(shape=(None, 26))
encoder = GRU(256, return_state=True)
encoder_outputs, state_h = encoder(encoder_inputs)
decoder_inputs = Input(shape=(None, 39))
decoder_gru= GRU(256, return_sequences=True)
decoder_outputs, _ = decoder_gru(decoder_inputs, initial_state=state_h)
decoder_dense = Dense(39, activation='softmax')
decoder_outputs = decoder_dense(decoder_outputs)
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adadelta(),
metrics=['accuracy'])
这对我来说很有意义,因为每个序列都有不同的长度。因此,对于遍历所有序列的 for 循环,我们在第一个 GRU 层的输入形状中使用 None
因为我们不确定序列长度是多少,然后返回隐藏状态 该编码器的state_h
。第二个 GRU 层返回序列,并且初始状态是从编码器返回的状态,然后我们将输出传递到最终的 softmax 激活层。
显然这里有一些缺陷,因为我得到:
decoder_outputs, _ = decoder_gru(decoder_inputs, initial_state=state_h)
File "/usr/local/lib/python3.6/dist-
packages/tensorflow/python/framework/ops.py", line 458, in __iter__
"Tensor objects are only iterable when eager execution is "
TypeError: Tensor objects are only iterable when eager execution is
enabled. To iterate over this tensor use tf.map_fn.
This link指向建议的解决方案,但我不明白为什么您要将编码器状态添加到网络中尽可能多的层的元组中。
我真的在寻求帮助,以便能够成功编写这个 RNN 来完成这项任务,同时也理解。我对 RNN 非常感兴趣,并希望更深入地了解它们,以便将它们应用于其他问题。
作为额外说明,每个序列的形状为 (sequence_length, 26)
,但我将 (1,equence_length, 26)
的维度扩展为 >X
和 (1,sequence_length)
为 y
,然后将它们传递到 for 循环中以进行拟合,并使用 decoder_target_data
比当前输入提前一步:
for idx in range(X_train.shape[0]):
X_train_s = np.expand_dims(X_train[idx], axis=0)
y_train_s = np.expand_dims(y_train[idx], axis=0)
y_train_s1 = np.expand_dims(y_train[idx+1], axis=0)
encoder_input_data = X_train_s
decoder_input_data = y_train_s
decoder_target_data = y_train_s1
model.fit([encoder_input_data, decoder_input_data], decoder_target_data,
epochs=50,
validation_split=0.2)
对于我编写的其他网络(前馈和 CNN),我通过在 Keras 的 Sequential 类之上添加层来指定模型。由于 RNN 固有的复杂性,我认为使用上面的 Keras 输入类并检索隐藏状态(以及 LSTM 的单元状态)等的一般格式是合乎逻辑的,但我也看到它们是使用 Keras 的 Sequential 类构建的。尽管这些是多对一类型的任务,但我也对您如何以这种方式编写它感兴趣。
最佳答案
问题是 decoder_gru
层不返回其状态,因此您不应使用 _
作为状态的返回值(即仅删除 ,_
):
decoder_outputs = decoder_gru(decoder_inputs, initial_state=state_h)
<小时/>
由于输入和输出长度相同,并且输入和输出的元素之间存在一对一的映射,因此您也可以通过以下方式构建模型:
inputs = Input(shape=(None, 26))
gru = GRU(64, return_sequences=True)(inputs)
outputs = Dense(39, activation='softmax')(gru)
model = Model(inputs, outputs)
现在,您可以通过将多个 GRU 层堆叠在一起来使该模型更加复杂(即增加其容量):
inputs = Input(shape=(None, 26))
gru = GRU(256, return_sequences=True)(inputs)
gru = GRU(128, return_sequences=True)(gru)
gru = GRU(64, return_sequences=True)(gru)
outputs = Dense(39, activation='softmax')(gru)
model = Model(inputs, outputs)
此外,您可以使用具有更多表示能力的 LSTM 层,而不是使用 GRU 层(当然这可能会以增加计算成本为代价)。并且不要忘记,当您增加模型的容量时,也会增加过度拟合的机会。因此,您必须牢记这一点并考虑防止过度拟合的解决方案(例如添加正则化)。
旁注:如果您有可用的 GPU,则可以使用 CuDNNGRU
(或 CuDNNLSTM
)层,它已针对 GPU 进行了优化,因此与 GRU
相比,它的运行速度要快得多。
关于python - 如何在 Keras 中正确设置 RNN 以进行序列到序列建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52023702/
我正在阅读 Python 文档以真正深入了解 Python 语言,并遇到了 filter 和 map 函数。我以前使用过过滤器,但从未使用过映射,尽管我在 SO 上的各种 Python 问题中都见过这
当我尝试打印 BST 的级别顺序时,这个问题提示了我。 这是一个 Pre-Order Sequence: 4, 1, 2, 3, 5, 6, 7, 8 In_order Sequence : 1, 2
我的代码在 main(序列测试;)的第一行出现错误,指出它是对 sequence::sequence() 的 undefined reference 。我无法更改 main 中的代码。有谁知道我该如何
这可能很简单,但我在通常的 latex 指南中找不到任何相关内容。在这句话中: {\em hello\/} “\/”的目的是什么? 最佳答案 这就是所谓的斜体校正。其目的是确保斜体文本后有适当的间距。
当我从 Postgresql 表中删除所有记录,然后尝试重置序列以在插入时开始一个编号为 1 的新记录时,我得到不同的结果: SELECT setval('tblname_id_seq', (SELE
在版本10.0.3中,MariaDB引入了一种称为序列的存储引擎。 其ad hoc为操作生成整数序列,然后终止。 该序列包含正整数,以降序或升序排列,并使用起始,结束和递增值。 它不允许在多个查询中
如何在 Groovy 中获取给定数字的序列,例如: def number = 169 // need a method in groovy to find the consecutive number
基本上,如果这是 .NET,它看起来像这样: ISomething { string A { get; } int B { get; } } var somethings = new List
说以下代码部分(同一块): A <= 1 A <= 2 变量 A 总是被赋值为 2 吗?还是会出现竞争条件并分配 1 或 2? 我对非阻塞赋值的理解是,由硬件在 future 分配变量 A,因此它可能
在运行 WiX 设置时,我正在寻找操作列表及其顺序。不知何故,官方网站似乎没有提供任何信息。 基本问题是我想正确安排我的自定义操作。通常我需要使用 regsvr32.exe 注册一个 DLL,而这只能
F#初学者在这里 我想创建一个类型,它是具有至少一个元素的另一种具体类型(事件)的序列。任何其他元素都可以在以后随时添加。通常在 C# 中,我会创建一个具有私有(private) List 和公共(p
作为构建过程和不断发展的数据库的一部分,我试图创建一个脚本,该脚本将删除用户的所有表和序列。我不想重新创建用户,因为这将需要比所允许的更多的权限。 我的脚本创建了一个过程来删除表/序列,执行该过程,然
我想恢复两个向量的第一个日期和相同向量的第二个日期之间的日期序列,.... 这是一个例子: dates1 = as.Date(c('2015-10-01', '2015-03-27', '2015-0
这个问题已经有答案了: sql ORDER BY multiple values in specific order? (12 个回答) 已关闭 9 年前。 我有一个 sql 语句,我想要ORDER
我想恢复两个向量的第一个日期和相同向量的第二个日期之间的日期序列,.... 这是一个例子: dates1 = as.Date(c('2015-10-01', '2015-03-27', '2015-0
在用java编写代码时,我需要用“],[”分割字符串。下面是我的代码。 try (BufferedReader reader = new BufferedReader(new InputStreamR
这个问题已经有答案了: Project Euler Question 14 (Collatz Problem) (8 个回答) 已关闭 9 年前。 我正在尝试查找数字的 Collatz 序列。以下
我有一个例程函数process_letter_location(const char& c, string &word)。 在我的 main 中,我声明了一系列字符串变量,如下所示: string s
我需要找到最长的多米诺骨牌链,给定一组 12 个随机挑选的多米诺骨牌。我已经递归地生成了多米诺骨牌的所有可能性(使用 0 到 12 的面值有 91 种可能性)。多米诺骨牌由一 block “砖 blo
我有这个数据结构 Seq,它继承了类 vector 但有一些额外的功能。使用这个数据结构 Seq 我有这个预定义的数据结构: typedef Seq > MxInt2d; 我现在想要一个包含多个 Mx
我是一名优秀的程序员,十分优秀!