У меня есть фрейм данных -> данные с формой (10000 257). Мне нужно предварительно обработать этот кадр данных, чтобы я мог использовать его в LSTM, для которого требуется трехмерный ввод - (nrows, ntimesteps, nfeatures). Я работаю с приведенным здесь фрагментом кода:
def univariate_processing(variable, window):
import numpy as np
# create empty 2D matrix from variable
V = np.empty((len(variable)-window+1, window))
# take each row/time window
for i in range(V.shape[0]):
V[i,:] = variable[i: i+window]
V = V.astype(np.float32) # set common data type
return V
def RNN_regprep(df, y, len_input, len_pred): #, test_size):
# create 3D matrix for multivariate input
X = np.empty((df.shape[0]-len_input+1, len_input, df.shape[1]))
# Iterate univariate preprocessing on all variables - store them in XM
for i in range(df.shape[1]):
X[:,:, i ] = univariate_processing(df[:,i], len_input)
# create 2D matrix of y sequences
y = y.reshape((-1,)) # reshape to 1D if needed
Y = univariate_processing(y, len_pred)
## Trim dataframes as explained
X = X[:-(len_pred + 1),:,: ]
Y = Y[len_input:-1,:]
# Set common datatype
X = X.astype(np.float32)
Y = Y.astype(np.float32)
return X, Y
X,y = RNN_regprep(data,label, len_ipnut=200,len_pred=1)
При выполнении этого возникает следующая ошибка:
numpy.core._exceptions._ArrayMemoryError: Unable to allocate 28.9 GiB for an array with shape (10000, 200, 257) and data type float64
Я понимаю, что это скорее проблема с моей памятью на моем сервере. Я хочу знать какое-либо решение, которое я могу изменить в своем коде, чтобы узнать, могу ли я избежать этой ошибки памяти или попытаться уменьшить это потребление памяти?
Решение проблемы
Для этого и нужны окна. Используя мой рецепт здесь:
var = np.random.rand(10000,257)
w = window_nd(var, 200, axis = 0)
Теперь у вас есть оконный вид на var
:
w.shape
Out[]: (9801, 200, 257)
Но, что важно, он использует те же данные, что и var
, просто просматривая их в оконном режиме:
w.__array_interface__['data'] #This is the memory's starting address
Out[]: (1448954720320, False)
var.__array_interface__['data']
Out[]: (1448954720320, False)
np.shares_memory(var, w)
Out[]: True
w.base.base.base is var #(lots of rearranging views in the background)
Out[]: True
Итак, вы можете сделать:
def univariate_processing(variable, window):
return window_nd(variable, window, axis = 0)
Это должно значительно уменьшить выделение памяти, никакой «магии» не требуется:)
Вы также можете попробовать
from skimage.util import view_as_windows
w = np.squeeze(view_as_windows(var, (200, 1)))
Что делает почти то же самое. В этом случае: ваш ответ будет:
def univariate_processing(variable, window):
from skimage.util import view_as_windows
window = (window,) + (1,)*(len(variable.shape)-1)
return np.squeeze(view_as_windows(variable, window))
Комментариев нет:
Отправить комментарий