【问题标题】:Creating a generator from list of sequences for RNN从 RNN 的序列列表中创建生成器
【发布时间】:2016-07-10 17:18:47
【问题描述】:

我需要为我的数据创建一个生成器,以传递给我的 RNN 训练函数。我有一个患者样本列表,其中每个样本都是三个维度上长度为 ni 的时间序列(令人讨厌地变化),我想创建批次批次中的每个样本仅属于单个患者但每个批次可能包含多个患者样本的数据。这样做应该最大限度地增加我可以训练使用的样本数量,而不会产生任何后果,因为我的 RNN 不是stateful。起初我有以下功能

def dataIterator(rawDataList, config):
    batchSize, nSteps = config.batchSize, config.nSteps
    for rawData in rawDataList:
        dataLen, dataWidth = rawData.shape
        batchLen = dataLen // batchSize
        data = np.zeros([batchSize, batchLen, dataWidth], dtype=np.float32)
        for i in xrange(batchSize):
            data[i] = rawData[batchLen*i:batchLen*(i+1), :]

        epochSize = (batchLen - 1) // nSteps

        if epochSize == 0:
            raise ValueError('epoch_size == 0')

        for i in xrange(epochSize):
            x = data[:, i*nSteps:(i+1)*nSteps, :]
            y = data[:, i*nSteps+1:(i+1)*nSteps+1, :]
            yield (x, y)

但是,这会修剪每个患者样本以适应批量大小。所以我想要一些可以创建所有可能批次的东西,包括最后一个尺寸过小的批次。然而,我对发电机的不熟悉让我很困惑。到目前为止,我已经计算出它必须使用模算术,但我不确定具体如何,所以我只到了这一点:

def dataIterator(data, batchSize=batchSize, nSteps=nSteps, nDimensions=3):
    nTimePoints = sum([len(x) for x in data])
    totalBatchLen = 1+(nTimePoints-1)//batchSize
    newData = np.zeros([batchSize, totalBatchLen, nDimensions])
    for i in xrange(batchSize):
        ...

编辑 这是一个简短的示例,说明如何在不使用生成器的情况下解决问题

import numpy as np
np.random.seed(42)
nPatients = 3
tsLength = 5
nDimensions = 3
rnnTSLength = 3
batchSize = 3
inputData = np.random.random((nPatients, tsLength, nDimensions))
inputData[1, :, :] *= 10
inputData[2, :, :] *= 100
outputData = []
for i in xrange(tsLength-rnnTSLength):
    outputData.append(inputData[0, i:i+rnnTSLength, :])
for i in xrange(tsLength-rnnTSLength):
    outputData.append(inputData[1, i:i+rnnTSLength, :])
for i in xrange(tsLength-rnnTSLength):
    outputData.append(inputData[2, i:i+rnnTSLength, :])
temp1 = np.array(outputData[:3])
temp2 = np.array(outputData[3:])
npOutput = np.array((temp1, temp2))
print npOutput

产生:

[[[[  3.74540119e-01   9.50714306e-01   7.31993942e-01]
[  5.98658484e-01   1.56018640e-01   1.55994520e-01]
[  5.80836122e-02   8.66176146e-01   6.01115012e-01]]

[[  5.98658484e-01   1.56018640e-01   1.55994520e-01]
[  5.80836122e-02   8.66176146e-01   6.01115012e-01]
[  7.08072578e-01   2.05844943e-02   9.69909852e-01]]

[[  1.83404510e+00   3.04242243e+00   5.24756432e+00]
[  4.31945019e+00   2.91229140e+00   6.11852895e+00]
[  1.39493861e+00   2.92144649e+00   3.66361843e+00]]]


[[[  4.31945019e+00   2.91229140e+00   6.11852895e+00]
[  1.39493861e+00   2.92144649e+00   3.66361843e+00]
[  4.56069984e+00   7.85175961e+00   1.99673782e+00]]

[[  6.07544852e+01   1.70524124e+01   6.50515930e+00]
[  9.48885537e+01   9.65632033e+01   8.08397348e+01]
[  3.04613769e+01   9.76721140e+00   6.84233027e+01]]

[[  9.48885537e+01   9.65632033e+01   8.08397348e+01]
[  3.04613769e+01   9.76721140e+00   6.84233027e+01]
[  4.40152494e+01   1.22038235e+01   4.95176910e+01]]]]

如您所见,有两批大小为 3 的批次,其中都包含两个不同的“患者”,但每个“患者”的时间序列不重叠。

【问题讨论】:

  • 你能添加一个输入和预期输出的样本吗?
  • 已添加,抱歉回复缓慢。

标签: python batch-processing keras


【解决方案1】:

不清楚您在寻找什么。输入和所需输出的小样本会有所帮助。不过,我会尝试一下我认为您要问的问题:

def dataIterator(data, batchSize=batchSize):
    for patient_data in data:
        for n in range(0, len(patient_data), batchSize):
            yield patient_data[n:n+batchSize]

【讨论】:

  • 我刚刚添加了一个示例输入和输出,抱歉回复缓慢。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 2018-04-17
  • 2020-06-14
  • 2020-09-06
  • 1970-01-01
相关资源
最近更新 更多