gpt4 book ai didi

python - 当形状不匹配时,如何在 keras 中使用双向 RNN 和 Conv1D?

转载 作者:行者123 更新时间:2023-12-01 02:24:24 25 4
gpt4 key购买 nike

我是 Deep-Learning 的新手所以我正在阅读Deep Learning with Keras by Antonio Gulli并学到很多东西。我想开始使用一些概念。我想尝试实现一个具有一维卷积层的神经网络,该网络输入到双向循环层(如下面的论文)。我遇到的所有教程或代码片段都没有实现与此类似的远程任何内容(例如图像识别)或使用旧版本的 keras具有不同的功能和用途。

<小时/>

我想做的是 this paper 的变体:

(1) 将DNA序列转换为one-hot encoding载体;

(2) 使用一维卷积神经网络;

(3) 具有最大池化;

(4) 将输出发送到bidirectional RNN ;

(5)对输入进行分类;

<小时/>

我不知道如何使 Bidirectional RNN 上的形状匹配。我连普通的RNN都买不到到这个阶段去工作。 如何重组传入层以与双向 RNN 一起使用?

注意:原始代码来自https://github.com/uci-cbcl/DanQ/blob/master/DanQ_train.py但我简化了输出层,只进行二元分类。此处理在 https://github.com/fchollet/keras/issues/3322 中进行了(某种程度上)描述。但我无法让它与更新的 keras 一起使用。原始代码(和第二个链接)适用于非常大的数据集,因此我生成一些假数据来说明这个概念。他们还使用旧版本的 keras从那时起,关键功能发生了变化。

# Imports
import tensorflow as tf
import numpy as np
from tensorflow.python.keras._impl.keras.layers.core import *
from tensorflow.python.keras._impl.keras.layers import Conv1D, MaxPooling1D, SimpleRNN, Bidirectional, Input
from tensorflow.python.keras._impl.keras.models import Model, Sequential

# Set up TensorFlow backend
K = tf.keras.backend
K.set_session(tf.Session())
np.random.seed(0) # For keras?

# Constants
NUMBER_OF_POSITIONS = 40
NUMBER_OF_CLASSES = 2
NUMBER_OF_SAMPLES_IN_EACH_CLASS = 25

# Generate sequences
https://pastebin.com/GvfLQte2

# Build model
# ===========
# Input Layer
input_layer = Input(shape=(NUMBER_OF_POSITIONS,4))
# Hidden Layers
y = Conv1D(100, 10, strides=1, activation="relu", )(input_layer)
y = MaxPooling1D(pool_size=5, strides=5)(y)
y = Flatten()(y)
y = Bidirectional(SimpleRNN(100, return_sequences = True, activation="tanh", ))(y)
y = Flatten()(y)
y = Dense(100, activation='relu')(y)
# Output layer
output_layer = Dense(NUMBER_OF_CLASSES, activation="softmax")(y)

model = Model(input_layer, output_layer)
model.compile(optimizer="adam", loss="categorical_crossentropy", )
model.summary()


# ~/anaconda/lib/python3.6/site-packages/tensorflow/python/keras/_impl/keras/layers/recurrent.py in build(self, input_shape)
# 1049 input_shape = tensor_shape.TensorShape(input_shape).as_list()
# 1050 batch_size = input_shape[0] if self.stateful else None
# -> 1051 self.input_dim = input_shape[2]
# 1052 self.input_spec[0] = InputSpec(shape=(batch_size, None, self.input_dim))
# 1053

# IndexError: list index out of range

最佳答案

您根本不需要重构任何内容即可将 Conv1D 层的输出放入 LSTM 层。

所以,问题就在于 Flatten 层的存在,它破坏了形状。

这些是 Conv1D 和 LSTM 使用的形状:

  • Conv1D:(批处理、长度、 channel )
  • LSTM:(批处理、时间步长、特征)

长度与时间步数相同, channel 与特征相同。

使用双向包装器也不会改变任何事情。它只会复制您的输出特征。

<小时/>

分类。

如果您要将整个序列作为一个整体进行分类,则最后一个 LSTM 必须使用 return_sequences=False。 (或者你可以在之后使用一些扁平+密集代替)

如果您要对序列的每个步骤进行分类,则所有 LSTM 都应具有 return_sequences=True。您不应该展平它们之后的数据。

关于python - 当形状不匹配时,如何在 keras 中使用双向 RNN 和 Conv1D?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47543113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com