2016-11-01 2 views
1

В настоящее время у меня есть (1631160,78) np массив в качестве моего входа в нейронную сеть. Я хотел бы попробовать что-то с LSTM, которое требует трехмерной структуры в качестве входных данных. В настоящее время я использую следующий код для создания необходимой 3D-структуры, но он очень медленный (ETA> 1день). Есть ли лучший способ сделать это с помощью numpy?Каков самый быстрый способ подготовки данных для RNN с numpy?

Мой текущий код для генерации данных:

def transform_for_rnn(input_x, input_y, window_size): 
    output_x = None 
    start_t = time.time() 
    for i in range(len(input_x)): 
     if i > 100 and i % 100 == 0: 
      sys.stdout.write('\rTransform Data: %d/%d\tETA:%s'%(i, len(input_x), str(datetime.timedelta(seconds=(time.time()-start_t)/i * (len(input_x) - i))))) 
      sys.stdout.flush() 
     if output_x is None: 
      output_x = np.array([input_x[i:i+window_size, :]]) 
     else: 
      tmp = np.array([input_x[i:i+window_size, :]]) 
      output_x = np.concatenate((output_x, tmp)) 

    print 
    output_y = input_y[window_size:] 
    assert len(output_x) == len(output_y) 
    return output_x, output_y 

ответ

2

Вот подход, использующий NumPy strides векторизовать создание output_x -

nrows = input_x.shape[0] - window_size + 1 
p,q = input_x.shape 
m,n = input_x.strides 
strided = np.lib.stride_tricks.as_strided 
out = strided(input_x,shape=(nrows,window_size,q),strides=(m,m,n)) 

Пример запуска -

In [83]: input_x 
Out[83]: 
array([[ 0.73089384, 0.98555845, 0.59818726], 
     [ 0.08763718, 0.30853945, 0.77390923], 
     [ 0.88835985, 0.90506367, 0.06204614], 
     [ 0.21791334, 0.77523643, 0.47313278], 
     [ 0.93324799, 0.61507976, 0.40587073], 
     [ 0.49462016, 0.00400835, 0.66401908]]) 

In [84]: window_size = 4 

In [85]: out 
Out[85]: 
array([[[ 0.73089384, 0.98555845, 0.59818726], 
     [ 0.08763718, 0.30853945, 0.77390923], 
     [ 0.88835985, 0.90506367, 0.06204614], 
     [ 0.21791334, 0.77523643, 0.47313278]], 

     [[ 0.08763718, 0.30853945, 0.77390923], 
     [ 0.88835985, 0.90506367, 0.06204614], 
     [ 0.21791334, 0.77523643, 0.47313278], 
     [ 0.93324799, 0.61507976, 0.40587073]], 

     [[ 0.88835985, 0.90506367, 0.06204614], 
     [ 0.21791334, 0.77523643, 0.47313278], 
     [ 0.93324799, 0.61507976, 0.40587073], 
     [ 0.49462016, 0.00400835, 0.66401908]]]) 

Это создает просматривать во входном массиве и как таковой эффективно. В большинстве случаев это должно привести к повышению эффективности работы при последующих операциях с ним. Давайте проверим, что его вид действительно -

In [86]: np.may_share_memory(out,input_x) 
Out[86]: True # Doesn't guarantee, but is sufficient in most cases 

Другой надежный выстрел способ проверить бы установить некоторые значения в output и проверить вход -

In [87]: out[0] = 0 

In [88]: input_x 
Out[88]: 
array([[ 0.  , 0.  , 0.  ], 
     [ 0.  , 0.  , 0.  ], 
     [ 0.  , 0.  , 0.  ], 
     [ 0.  , 0.  , 0.  ], 
     [ 0.93324799, 0.61507976, 0.40587073], 
     [ 0.49462016, 0.00400835, 0.66401908]]) 
Смежные вопросы