>

다른 그룹의 데이터를 RNN으로 전달하려고 할 때 문제가 발생합니다. 대부분의 예는 우아한 시계열을 가정하지만 그룹을 추가 할 때 단순히 데이터 프레임을 창으로 표시 할 수 없으므로 그룹이 변경되면 점프해야합니다. 데이터는 그룹 내에서 가져옵니다.

이 그룹은 다른 사람들 일 뿐이므로 시퀀스를 스스로 유지하고 싶었습니다. 예 : 웹 사이트를 탐색하고 페이지 뷰 데이터를 수집하는 사용자 또는 다른 주식과 관련 가격 변동이있을 수 있습니다.

import pandas as pd
data = {
    'group_id': [1,1,1,1,2,2],
    'timestep': [1,2,3,4,1,2],
    'x': [6,5,4,3,2,1],
    'y': [0,1,1,1,0,1]
}
df = pd.DataFrame(data=data)

   group_id  timestep  x  y
0         1         1  6  0
1         1         2  5  1
2         1         3  4  1
3         1         4  3  1
4         2         1  2  0
5         2         2  1  1

2 개 샘플의 배치 크기를 사용하고 각 샘플에 3 개의 타임 스텝이 있다고 가정합니다. 와이즈 비즈  (아래) 배치이지만 가능하지 않습니다. 최대 1 그룹에서 2 샘플을 얻을 수 있기 때문에 (1 배치를 만듭니다). 두 번째 그룹에는 2 개의 시간 단계 만 있으므로 반복이 불가능합니다.

RNNSequence.__len__ = 3

시퀀스를 사용하여 이러한 배치를 얻는 가장 효율적인 방법은 무엇입니까?

내 솔루션은 실제로 시퀀스를 사용하지 않고 사전에 배치가 몇 개인 지 알지 못하고 데이터를 추출하는 사용자 정의 생성기를 사용하는 것이 었습니다. from keras.utils import Sequence class RNNSequence(Sequence): def __init__(self, x_set, y_set, batch_size, seq_length): self.x, self.y = x_set, y_set self.batch_size = batch_size self.seq_length = seq_length def __len__(self): return int(np.ceil(len(self.x) / float(self.batch_size))) def __getitem__(self, idx): # get_batch to be coded return get_batch(idx, self.x, self.y, self.batch_size, self.seq_length) 를 사용하십시오.  대신에. 이것이 가장 효율적인 방법입니까? 여기서 문제는 셔플 링이 없으며 문제가 될 수 있다는 것입니다.

batchsize = 2, seq_length = 3에 대한 원하는 출력은 다음과 같습니다.

fit_generator(custom_generator, max_queue_size=batch_size)

X = [ [ [6], [5], [4] ], [ [5], [4], [3] ] ] Y = [ 1, 1 ]
  • 답변 # 1

    배치 수를 알아야 할뿐만 아니라 배치 번호 만 주어진 배치도 출력 할 수 있어야합니다. RNNSequence.__init__ 에서 모든 샘플의 인덱스를 만들 수 있습니다  또는 이전에 배치를 조립하십시오. __getitem__ 에서  그런 다음 그에 따라 배치를 출력 할 수 있습니다.

    이 빠르고 의사 코드는 샘플 인덱스의 개념을 설명해야합니다. 필요한 경우 팬더 또는 numpy 등의 함수를 대신 사용하기로 결정할 수 있습니다.

    # Pseuducode for generating indexes for where samples start.
    seq_len = 3
    sample_start_ids = []
    for group_id, group in enumerate(groups):
        for timestep_id, timestep in enumerate(group_timesteps):
            # Only add as sample if it is the first
            # timestep in the group or if a full sample fits.
            if timestep == 1 or timestep <= len(group_timesteps) - seq_len+1:
                sample_start_ids.append((group_id, timestep_id))
    num_samples = len(sample_start_ids)
    # Group the samples into batches of appropriate size.
    pass
    num_batches = len(your_batches)
    
    

  • 이전 sequelize.js - Sequelize 중첩 열망로드는 동일한 모델과 연관된 두 레코드를로드하지 않습니다
  • 다음 java - Firestore 모음의 이미지로 RecyclerView를 채 웁니다