TensorFlow LSTM预测相同的值

梅森·崔(Mason Choi)

我想做的是向我的LSTM模型输入数字列表,然后让我的LSTM模型输出自己的数字列表。我的项目是一个程序,它获取在线MIDI文件,将其转换为数字列表,从LSTM获取新的数字列表,将这些新数字更改为MIDI,然后收听文件。我遇到问题的地方是从LSTM模型中获得新的数字列表。

这是我目前拥有的主要代码:

from midi_to_text import data_parse
from split_sequence import split_sequence
import py_midicsv as pm
import math
from numpy import asarray
from tensorflow.keras import Sequential
from tensorflow.keras.layers import *
import tensorflow as tf


raw_midi = pm.midi_to_csv('OnlineMidi.mid')
data = data_parse(raw_midi)

n_steps = 1
X, y = split_sequence(data, n_steps)
X = X.reshape((X.shape[0], X.shape[1], 1))
X = tf.cast(X, dtype='float32')

model = Sequential()
model.add(LSTM(256, activation='sigmoid', return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(128, activation='sigmoid', return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(128))
model.add(Dropout(0.2))
model.add(Dense(1, activation='linear'))
model.compile(optimizer='adam', loss='mse', metrics=['mae'])

model.fit(X, y, epochs=100, batch_size=32, verbose=2)

notes = [64]
song_length = 10

for i in range(song_length):
    prediction = model.predict(asarray(notes).reshape((-1, 1, 1)))
    prediction[0][0] = (prediction[0][0] * 384) - (prediction[0][0] * 13) + 13
    # Turns float from 0 to 1 back into integer
    notes.append(prediction[0][0])

print(notes)

这是我用于创建训练集和标签的功能:

from numpy import asarray


def split_sequence(data, n_steps):
    new_data, expected_values = list(), list()
    for i in range(len(data)):
        if n_steps + i <= len(data) - 1:
            new_data.append(data[i:n_steps + i])
            expected_values.append(data[n_steps + i])
        else:
            break

    for i in new_data:
        i[0] = (i[0] - 13) / (384 - 13)

    for i in range(len(expected_values)):
        expected_values[i] = (expected_values[i] - 13) / (384 - 13)
    # Turns values into float between 0 and 1
    return asarray(new_data), asarray(expected_values)

这是n_steps = 1时的x训练数据:

[[64], [76], [64], [75], [64], [76], [64], [75], [64], [76], [64], [71], [64], [74], [64], [72], [69], [64], [45], [64], [52], [64], [57], [64], [60], [64]]

这是n_steps = 1时的标签:

[76, 64, 75, 64, 76, 64, 75, 64, 76, 64, 71, 64, 74, 64, 72, 69, 64, 45, 64, 52, 64, 57, 64, 60, 64, 64, 64, 69, 71, 64, 40, 64, 52, 64, 56, 64, 64, 64,]

这是我的数据:

[64, 76, 64, 75, 64, 76, 64, 75, 64, 76, 64, 71, 64, 74, 64, 72, 69, 64, 45, 64, 52, 64, 57, 64, 60, 64, 64, 64]

这是我的模型当前正在输出的内容,从种子64开始的9个预测的列表:

[64, 62.63686, 62.636864, 62.636864, 62.636864, 62.636864, 62.636864, 62.636864, 62.636864, 62.636864, 62.636864]

我不明白的是为什么这些预测都基本相同。当在主代码的最后一个for循环中打印预测时,我得到一个带有x个列表的列表的输出,其中x是输入数据的数量。这是这些预测之一的示例:

[[62.500393]
 [62.500393]
 [62.500393]
 [62.500393]
 [62.500393]
 [62.500393]
 [62.500393]
 [62.500393]
 [62.500393]
 [62.500393]]

这就是为什么在for循环中,我只是将列表中第一个列表的值用作预测。回顾一下,我有一个程序,该程序需要一个数字列表,我想让一个LSTM模型输出一个以种子64开头的预测数字列表。我遇到的问题是由于某种原因,我的模型是每次输出基本相同的预测,因此在此预测过程中我需要帮助。

**更新:**我尝试将model.fit()和model.predict()放入for循环中,然后循环10次以查看发生了什么。好消息:每个预测都与上一个不同,这很好。坏消息:这非常慢,我不确定这是否是实现此目标的最佳方法。有什么建议可以使这些值更接近预期值,或者该方法是否还不错?这似乎效率很低,因为我只对10个输出音符进行了10次训练(实际上是5个,其他5个值是每个音符的持续时间)。

这是我使用此for循环的新输出:

[64, 56.53626, 58.395187, 61.333992, 59.08212, 58.66997, 55.86058, 59.819744, 54.183216, 55.231224, 53.8824]

这是我的新代码,只是有一个for循环而已:

from midi_to_text import data_parse
from split_sequence import split_sequence
import py_midicsv as pm
import math
from numpy import asarray
from tensorflow.keras import Sequential
from tensorflow.keras.layers import *
import tensorflow as tf


raw_midi = pm.midi_to_csv('OnlineMidi.mid')
data = data_parse(raw_midi)

n_steps = 1
X, y = split_sequence(data, n_steps)
print(X)
print(y)
X = X.reshape((X.shape[0], X.shape[1], 1))
X = tf.cast(X, dtype='float32')

notes = [64]

model = Sequential()
model.add(LSTM(256, activation='linear', return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(128, activation='linear', return_sequences=True))
model.add(LSTM(128))
model.add(Dropout(0.2))
model.add(Dense(1, activation='linear'))
model.compile(optimizer='adam', loss='mse', metrics=['mae'])

for i in range(10):
    model.fit(X, y, epochs=5, batch_size=2, verbose=2)

    prediction = model.predict(asarray(notes).reshape((-1, 1, 1)))
    prediction[0][0] = (prediction[0][0] * 384) - (prediction[0][0] * 13) + 13
    notes.append(prediction[0][0])

print(notes)

自定义midi_to_text数据解析器:

def data_parse(raw_midi):
    temp = []
    final = []
    to_remove = []
    shift_unit = 20

    for i in range(len(raw_midi)):
        temp.append(raw_midi[i].split(', '))

    for i in range(len(temp)):
        if temp[i][2] != 'Note_on_c':
            to_remove.append(temp[i])
    
    for i in to_remove:
        temp.remove(i)
    
    for i in temp:
        i.remove(i[0])
        i.remove(i[1])
        i.remove(i[1])
        i.remove(i[2])

    for i in range(len(temp)):
        if i == len(temp) - 1:
            temp[i][0] = '64'
        else:
            temp[i][0] = str(int(temp[i + 1][0]) - int(temp[i][0]))
            
    to_remove.clear()
    
    for i in range(len(temp)):
        if i == len(temp) - 1:
            break
        if temp[i + 1][0] == '0':
            temp[i].append(temp[i + 1][1])
            to_remove.append(temp[i + 1])
    
    for i in to_remove:
        temp.remove(i)

    for i in temp:
        for _ in i:
            final.append(int(_))

    return final

谢谢!!

梅森·崔(Mason Choi)

我的结论是,尽管效率极低,但仅将model.fit和预测放入for循环中以预测未来的1步或一次生成1条信息。这意味着,是的,您确实需要多次拟合模型,并将模型先前生成的数据提供给模型,但这是我可以牺牲的。这种方法确实有效,只需要一些时间,并且是我发现的唯一主要解决方案。感谢所有做出答复的人,所有步骤对我来说都很清楚,希望这个问题对其他人有所帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Tensorflow预测总是相同的结果

来自分类Dev

Tensorflow,预测值的概率(ROI)

来自分类Dev

LSTM 多特征预测:赋予数据的形状(Tensorflow)

来自分类Dev

Tensorflow 回归正在预测错误的值

来自分类Dev

Tensorflow预训练的CNN:预测图像的相同类别

来自分类Dev

Tensorflow收敛但预测错误

来自分类Dev

Tensorflow:获得预测

来自分类Dev

为什么我的 TensorFlow NN 模型的预测值有上限?

来自分类Dev

TensorFlow LSTM生成模型

来自分类常见问题

使用TensorFlow模型进行预测

来自分类Dev

Tensorflow和Keras预测阈值

来自分类Dev

Tensorflow DNNClassifier返回错误的预测

来自分类Dev

使用 TensorFlow 预测新数据

来自分类Dev

用于回归的tensorflow深层神经网络总是可以在一批中预测相同的结果

来自分类Dev

Tensorflow中的LSTM反向传播

来自分类Dev

Tensorflow网格LSTM RNN TypeError

来自分类Dev

Tensorflow中的动态LSTM模型

来自分类Dev

了解Tensorflow LSTM输入形状

来自分类Dev

Sklearn svm预测相同的值

来自分类Dev

Tensorflow 2.2.0错误:使用双向LSTM层时,[预测必须> 0] [条件x> = y不按元素进行:]

来自分类Dev

如何在 Tensorflow 中拆分 LSTM 的训练数据和测试数据以进行时间序列预测

来自分类Dev

Tensorflow如何正确将用于预测的输入值传递给神经网络

来自分类Dev

TensorFlow JS-在模型旁边保存最小/最大值并在预测数据旁边重新加载

来自分类Dev

如何在 Tensorflow Object Detection API 中获得预测值的百分比?

来自分类Dev

在 Tensorflow 中使用 RNN 预测未来时间序列中的值

来自分类Dev

Keras / Tensorflow预测:数组形状错误

来自分类Dev

使用Tensorflow做出预测遗失参数

来自分类Dev

Tensorflow 2图像批量预测返回结果

来自分类Dev

使用TensorFlow MNIST进行专家预测

Related 相关文章

  1. 1

    Tensorflow预测总是相同的结果

  2. 2

    Tensorflow,预测值的概率(ROI)

  3. 3

    LSTM 多特征预测:赋予数据的形状(Tensorflow)

  4. 4

    Tensorflow 回归正在预测错误的值

  5. 5

    Tensorflow预训练的CNN:预测图像的相同类别

  6. 6

    Tensorflow收敛但预测错误

  7. 7

    Tensorflow:获得预测

  8. 8

    为什么我的 TensorFlow NN 模型的预测值有上限?

  9. 9

    TensorFlow LSTM生成模型

  10. 10

    使用TensorFlow模型进行预测

  11. 11

    Tensorflow和Keras预测阈值

  12. 12

    Tensorflow DNNClassifier返回错误的预测

  13. 13

    使用 TensorFlow 预测新数据

  14. 14

    用于回归的tensorflow深层神经网络总是可以在一批中预测相同的结果

  15. 15

    Tensorflow中的LSTM反向传播

  16. 16

    Tensorflow网格LSTM RNN TypeError

  17. 17

    Tensorflow中的动态LSTM模型

  18. 18

    了解Tensorflow LSTM输入形状

  19. 19

    Sklearn svm预测相同的值

  20. 20

    Tensorflow 2.2.0错误:使用双向LSTM层时,[预测必须> 0] [条件x> = y不按元素进行:]

  21. 21

    如何在 Tensorflow 中拆分 LSTM 的训练数据和测试数据以进行时间序列预测

  22. 22

    Tensorflow如何正确将用于预测的输入值传递给神经网络

  23. 23

    TensorFlow JS-在模型旁边保存最小/最大值并在预测数据旁边重新加载

  24. 24

    如何在 Tensorflow Object Detection API 中获得预测值的百分比?

  25. 25

    在 Tensorflow 中使用 RNN 预测未来时间序列中的值

  26. 26

    Keras / Tensorflow预测:数组形状错误

  27. 27

    使用Tensorflow做出预测遗失参数

  28. 28

    Tensorflow 2图像批量预测返回结果

  29. 29

    使用TensorFlow MNIST进行专家预测

热门标签

归档