【问题标题】:Building RNN with Tensorflow. How do I preprocess my dataset correctly to match the RNN's input and output shape?使用 Tensorflow 构建 RNN。如何正确预处理我的数据集以匹配 RNN 的输入和输出形状?
【发布时间】:2020-12-23 07:01:04
【问题描述】:

我正在做一个关于从音频中检测鼓声的项目。我目前已经对我的训练数据进行了预处理,并尝试在 tensorflow 中组合一个 SimpleRNN 神经网络,但无法让两者一起工作。

在每个时间步中,我的输入由形状为 (84) 的一维张量组成,输出应为形状为 (3) 的张量。

目前我的代码如下所示:

train_epochs = 10
batch_num = 10
learning_Rate = 0.001

''' I also tried using tf.dataset but couldn't get it to work
train_dataset = dataset.batch(batch_num, drop_remainder=True)
test_dataset = dataset.take(10000).batch(batch_num, drop_remainder=True)
print(train_dataset.element_spec)
'''
x_data = x_data[:70000]
y_data = y_data[:70000]
x_data.resize((70000, 84))
y_data.resize((70000, 3))
print(x_data.shape, y_data.shape) 

model = keras.Sequential()
model.add(keras.Input(shape=(None,84)))
model.add(layers.SimpleRNN(200,activation='relu', dropout=0.2))
model.add(layers.Dense(3, activation='sigmoid'))

model.compile(
    optimizer=keras.optimizers.RMSprop(learning_rate=learning_Rate),
    loss=keras.losses.BinaryCrossentropy(),
    #metrics F measure
    metrics=['acc',f1_m,precision_m, recall_m]
)
model.summary()

history = model.fit(
    x_data,y_data,
    epochs=train_epochs,
    batch_size=batch_num,
    # We pass some validation for
    # monitoring validation loss and metrics
    # at the end of each epoch
    validation_data=(x_data, y_data)
)

print("Evaluate on test data")
results = model.evaluate(test_dataset)
print("test loss, test acc:", results)

当我执行它时,它给了我错误消息:

 ValueError: Input 0 of layer sequential_35 is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: (10, 84)

如果我将 x_data 和 y_data 更改为形状 (7000,10, 84) (7000,10, 3),则错误消息变为

 ValueError: logits and labels must have the same shape ((10, 3) vs (10, 10, 3))

我该如何解决这个问题?我对深度学习非常陌生,因此非常感谢有关如何处理该项目的任何建议。

【问题讨论】:

    标签: python tensorflow machine-learning keras recurrent-neural-network


    【解决方案1】:

    simpleRNN 的输入应该是 3D:

    x_data.resize((70000, 84, 1))
    

    【讨论】:

    • 我试过了还是不行,错误变成“输入层simple_rnn_3的输入0与层不兼容:预期ndim=3,发现ndim=2。收到完整形状:(无, 84)" 当我添加 simpleRNN 层时。
    • 它没有为我修复错误,我仍然得到“输入 0 层 simple_rnn_3 与层不兼容:预期 ndim=3,发现 ndim=2。收到完整形状:(无, 84)"
    • 感谢您的帮助。我发现对我有用的是我使用“x_data.resize((700, batch_num, 84))”以及“model.add(layers.SimpleRNN(200,activation='relu', dropout=0.2, return_sequences= True))" 为我的模型。
    最近更新 更多