Python keras-tensorflow-LSTM-csv-如何使用fit_生成器

Python keras-tensorflow-LSTM-csv-如何使用fit_生成器,python,tensorflow,keras,generator,lstm,Python,Tensorflow,Keras,Generator,Lstm,Iam正在实施一个简单的RNN LSTM模型,但仍然无法实现。问题本身很简单。我将给模型5个连续的数字,但每次1个数字,然后我希望模型预测第6个数字 例如: 输入数据:1、2、3、4、5每个时间步1位 这个序列的输出应该是6 我有一个csv文件,其中: 第一行是标题 共有6列 第一列仅为ID。不用于训练。 接下来的5列是输入数据x 最后一列是标签y 我想用Keras开发一个模型,让它成功地猜出第六个数字 以下是我的工作: 1首先实现一些我们需要的常量 NR_FEATURES = 5 ITERAT

Iam正在实施一个简单的RNN LSTM模型,但仍然无法实现。问题本身很简单。我将给模型5个连续的数字,但每次1个数字,然后我希望模型预测第6个数字

例如: 输入数据:1、2、3、4、5每个时间步1位 这个序列的输出应该是6

我有一个csv文件,其中:

第一行是标题 共有6列 第一列仅为ID。不用于训练。 接下来的5列是输入数据x 最后一列是标签y 我想用Keras开发一个模型,让它成功地猜出第六个数字

以下是我的工作:

1首先实现一些我们需要的常量

NR_FEATURES = 5
ITERATOR_BATCH_SIZE = 1
NR_EPOCHS = 15
2定义培训时将使用的发电机

def train_data_generator():

    dataset = tf.contrib.data.make_csv_dataset(train_path1, 
                                               batch_size=ITERATOR_BATCH_SIZE, 
                                               num_epochs=NR_EPOCHS, 
                                               shuffle=True)

    iter = dataset.make_one_shot_iterator()
    next = iter.get_next()
    ID = next['ID']
    features = [next['nr1'], next['nr2'], next['nr3'], next['nr4'], next['nr5']]
    features = tf.reshape(features, [NR_FEATURES, 1])
    label = next['next_nr']
    yield (features, label)
input_data = Input(shape=(5, 1), name='input_data')
layer1_out = LSTM(1, return_sequences=False)(input_data)  # only return the last output
lstm_model = Model(inputs=input_data, outputs=layer1_out)

lstm_model.compile(loss='mean_absolute_error', optimizer='adam', metrics=['accuracy'])

lstm_model.fit_generator(train_data_generator(), 
                         steps_per_epoch=(150/ITERATOR_BATCH_SIZE),
                         epochs=NR_EPOCHS, 
                         verbose=1)
3创建模型并开始培训

def train_data_generator():

    dataset = tf.contrib.data.make_csv_dataset(train_path1, 
                                               batch_size=ITERATOR_BATCH_SIZE, 
                                               num_epochs=NR_EPOCHS, 
                                               shuffle=True)

    iter = dataset.make_one_shot_iterator()
    next = iter.get_next()
    ID = next['ID']
    features = [next['nr1'], next['nr2'], next['nr3'], next['nr4'], next['nr5']]
    features = tf.reshape(features, [NR_FEATURES, 1])
    label = next['next_nr']
    yield (features, label)
input_data = Input(shape=(5, 1), name='input_data')
layer1_out = LSTM(1, return_sequences=False)(input_data)  # only return the last output
lstm_model = Model(inputs=input_data, outputs=layer1_out)

lstm_model.compile(loss='mean_absolute_error', optimizer='adam', metrics=['accuracy'])

lstm_model.fit_generator(train_data_generator(), 
                         steps_per_epoch=(150/ITERATOR_BATCH_SIZE),
                         epochs=NR_EPOCHS, 
                         verbose=1)
但它马上就崩溃了

我收到的错误消息是:

Epoch 1/15

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-af9dcbcbe289> in <module>()
      8                          steps_per_epoch=(150/ITERATOR_BATCH_SIZE),
      9                          epochs=NR_EPOCHS,
---> 10                          verbose=1)

~/anaconda3/envs/tensorflow/lib/python3.6/site-packages/keras/legacy/interfaces.py in wrapper(*args, **kwargs)
     89                 warnings.warn('Update your `' + object_name +
     90                               '` call to the Keras 2 API: ' + signature, stacklevel=2)
---> 91             return func(*args, **kwargs)
     92         wrapper._original_function = func
     93         return wrapper

~/anaconda3/envs/tensorflow/lib/python3.6/site-packages/keras/engine/training.py in fit_generator(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)
   2212                     # build batch logs
   2213                     batch_logs = {}
-> 2214                     if x is None or len(x) == 0:
   2215                         # Handle data tensors support when no input given
   2216                         # step-size = 1 for data tensors

TypeError: object of type 'Tensor' has no len()
我就是不明白。有人知道吗?

你可以直接通过求值将张量转换成numpy

features = tf.reshape(features, [NR_FEATURES, 1])
# convert tensor to numpy
with tf.Session() as sess:
    features = features.eval()
# Your data shape needs to be adjusted relative to your model input.
features = features.reshape(-1,NR_FEATURES,1) 
label = next['next_nr']
label = np.array([label])
yield (features, label)

问题在于数据格式而不是fit_生成器使用错误。你使用的张量没有len。您导入的最佳数据类型应为numpy。感谢您的评论。火车数据发生器返回张量是真的。但是我如何转换它,让它返回numpy数组呢?