Die Funktionen, die alles starten und die Parallelisierung einleiten sind folgende:
Code: Alles auswählen
def split(data, n):
k, m = divmod(len(data), n)
return list(data[i*k+min(i, m):(i+1)*k+min(i+1, m)] for i in range(n))
def start_sample_generation(args):
data, shape, cols = args
return to_samples(data, shape, cols)
def generate_samples(sample_shape, cols_no_normalization):
with open('raw_data.pickle', 'rb') as handle:
raw_data= pickle.load(handle)
pool = mp.Pool(mp.cpu_count())
data = pool.map(start_sample_generation, [(x, sample_shape, cols_no_normalization) for x in split(raw_data, mp.cpu_count())])
X, Y = [], []
for x, y in data:
print(x.shape, y.shape)
X.append(x)
Y.append(y)
X = np.concatenate(X, axis=0)
Y = np.concatenate(Y, axis=0)
return X, Y
if __name__ == '__main__':
generate_samples((25,5),['state'])
Code: Alles auswählen
class Sample:
def __init__(self, data, cols_no_normalization):
self.sample = normalize(data.history, cols_no_normalization)
self.label = ...
self.label = tf.one_hot(self.label, depth=3)
def to_samples(raw_data, input_shape, cols_no_normalization=[]):
samples = list(map(lambda x: Sample(x, cols_no_normalization), raw_data))
return samples_to_numpy(samples, input_shape)
def samples_to_numpy(samples : list[Sample], input_shape):
shuffle(samples)
x = []
y = []
count = 0
l = int(len(samples) / 10)
print(">>> creating numpy arrays --> started; len(samples) =", len(samples))
for i in range(len(samples)):
x_n = samples[i].sample.to_numpy()
if x_n.shape == input_shape:
x.append(x_n)
y.append(samples[i].label)
if (l + count * l) == i:
print(">>> creating numpy arrays --> progress:", (count+1)*10, '%')
count = count + 1
return np.stack(x, axis=0), np.stack(y, axis=0)
def normalize(df: pd.DataFrame, cols_no_normalization=[], drop_na=True) -> pd.DataFrame:
tmp = df
for col in tmp.columns:
if col not in cols_no_normalization:
tmp[col] = tmp[col].pct_change()
tmp = tmp.replace([np.inf, -np.inf], np.nan)
tmp[col] = preprocessing.scale(tmp[col].values) # scale values
if drop_na:
tmp.dropna(inplace=True)
return tmp
1. Was an meinem Code sorgt überhaupt dafür, dass CUDA bzw. meine GPU genutzt wird?
2. Lässt sich der Code noch hinsichtlich des Speicherbedarfs optimieren? Wenn ja wie?
Vielen Dank!