Files
temperature-based-fertility…/code/new_realtime/models/collation.py
T
Alex Blank 50cf43b9fe added code
2025-05-19 11:11:04 +02:00

95 lines
3.3 KiB
Python

import numpy as np
import torch
def flat_x_y_collate(batch, *args, **kwargs) -> tuple:
"""
Collate function for a classical model with flat x and y feature vectors
"""
# Flatten each item in the batch
flattened_x = list()
flattened_y = list()
for i in range(len(batch)):
item = batch[i]
flattened_x_item = list()
flattened_y_item = list()
for j, (category, windows) in enumerate(item.items()):
for feature in windows.T:
if category == "target":
flattened_y_item.append(feature)
else:
flattened_x_item.append(feature)
# create numpy arrays with t_1_f1, t_1_f2, t_2_f1, t_2_f2 and so on
reordered_x = np.empty((len(flattened_x_item) * len(flattened_x_item[0])))
reordered_y = np.empty((len(flattened_y_item) * len(flattened_y_item[0])))
for j in range(len(flattened_x_item)):
for k in range(len(flattened_x_item[j])):
reordered_x[j + k * len(flattened_x_item)] = flattened_x_item[j][k]
for j in range(len(flattened_y_item)):
for k in range(len(flattened_y_item[j])):
reordered_y[j + k * len(flattened_y_item)] = flattened_y_item[j][k]
# append to the list
flattened_x.append(reordered_x)
flattened_y.append(reordered_y)
return np.array(flattened_x), np.array(flattened_y)
def simple_x_y_collate(batch):
"""
Collate function for LSTM model
"""
collated_x = list()
collated_y = list()
for item in batch:
current_x = list()
current_y = list()
for category, windows in item.items():
if category == "target_features":
current_y.append(windows)
else:
current_x.append(windows)
collated_x.append(np.concatenate(current_x, axis=1))
collated_y.append(np.concatenate(current_y, axis=1))
return torch.tensor(collated_x, dtype=torch.float32), torch.tensor(collated_y, dtype=torch.float32)
def collate_with_padding(batch,
padding_value: float = 0.0, ):
"""
Collate the batch with padding
"""
# create simple lists for x and y
collated_x = list()
collated_y = list()
for item in batch:
current_x = list()
current_y = list()
for category, windows in item.items():
if category == "target_features":
current_y.append(windows)
else:
current_x.append(windows)
collated_x.append(np.concatenate(current_x, axis=1))
collated_y.append(np.concatenate(current_y, axis=1))
# get the max length of the x and y
max_x_length = max([x.shape[0] for x in collated_x])
max_y_length = max([y.shape[0] for y in collated_y])
# pad the x and y
padded_x = list()
padded_y = list()
for x, y in zip(collated_x, collated_y):
padded_x.append(
np.pad(x, ((max_x_length - x.shape[0], 0), (0, 0)), mode='constant', constant_values=padding_value))
padded_y.append(
np.pad(y, ((max_y_length - y.shape[0], 0), (0, 0)), mode='constant', constant_values=padding_value))
return torch.tensor(padded_x, dtype=torch.float32), torch.tensor(padded_y, dtype=torch.float32)