相关疑难解决方法(0)

将时序数据馈入有状态LSTM的正确方法?

假设我有一个整数序列:

0,1,2, ..

并希望根据给定的最后3个整数来预测下一个整数,例如:

[0,1,2]->5[3,4,5]->6

假设我像这样设置模型:

batch_size=1
time_steps=3
model = Sequential()
model.add(LSTM(4, batch_input_shape=(batch_size, time_steps, 1), stateful=True))
model.add(Dense(1))
Run Code Online (Sandbox Code Playgroud)

据我了解,模型具有以下结构(请原图):

在此处输入图片说明

第一个问题:我的理解正确吗?

请注意,我已经画出了C_{t-1}, h_{t-1}进入图片的先前状态,因为指定时会暴露出来stateful=True。在这个简单的“下一个整数预测”问题中,应通过提供此额外的信息来改善性能(只要先前的状态是由前三个整数产生的)。

这使我想到了一个主要问题: 似乎标准做法(例如,参见此博客文章TimeseriesGenerator keras预处理实用程序)是在训练过程中向模型提供一组交错的输入。

例如:

batch0: [[0, 1, 2]]
batch1: [[1, 2, 3]]
batch2: [[2, 3, 4]]
etc
Run Code Online (Sandbox Code Playgroud)

这让我感到困惑,因为这似乎需要第一Lstm单元的输出(对应于第一时间步长)。看这个图:

从tensorflow docs

stateful:布尔值(默认为False)。如果为True,则批次中索引i的每个样本的最后状态将用作下一个批次中索引i的样本的初始状态。

似乎此“内部”状态不可用,并且所有可用状态都是最终状态。看这个图:

因此,如果我的理解是正确的(显然不是这样),那么在使用时是否不应该将不重叠的样本窗口馈送到模型中stateful=True?例如:

batch0: [[0, 1, 2]]
batch1: [[3, 4, 5]]
batch2: [[6, 7, 8]]
etc
Run Code Online (Sandbox Code Playgroud)

python machine-learning lstm keras tensorflow

7
推荐指数
1
解决办法
226
查看次数

Keras模型无法减少损失

我提出一个示例,其中tf.keras模型无法从非常简单的数据中学习。我使用tensorflow-gpu==2.0.0keras==2.3.0和Python 3.7。在文章的结尾,我提供了Python代码来重现我观察到的问题。


  1. 数据

样本是形状为(6、16、16、16、16、3)的Numpy阵列。为了使事情变得非常简单,我只考虑充满1和0的数组。带有1的数组的标签为1,带有0的数组的标签为0。我可以使用以下n_samples = 240代码生成一些样本(在以下示例中):

def generate_fake_data():
    for j in range(1, 240 + 1):
        if j < 120:
            yield np.ones((6, 16, 16, 16, 3)), np.array([0., 1.])
        else:
            yield np.zeros((6, 16, 16, 16, 3)), np.array([1., 0.])
Run Code Online (Sandbox Code Playgroud)

为了在tf.keras模型中输入此数据,我tf.data.Dataset使用下面的代码创建一个实例。这本质上将产生混洗的BATCH_SIZE = 12样品批次。

def make_tfdataset(for_training=True):
    dataset = tf.data.Dataset.from_generator(generator=lambda: generate_fake_data(),
                                             output_types=(tf.float32,
                                                           tf.float32),
                                             output_shapes=(tf.TensorShape([6, 16, 16, 16, 3]),
                                                            tf.TensorShape([2])))
    dataset = dataset.repeat()
    if for_training:
        dataset = dataset.shuffle(buffer_size=1000)
    dataset = dataset.batch(BATCH_SIZE)
    dataset = …
Run Code Online (Sandbox Code Playgroud)

python deep-learning keras tensorflow tensorflow-datasets

5
推荐指数
1
解决办法
165
查看次数