From 6ef577c76971b3571044f4ffe235dbed64763e98 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Wed, 17 Dec 2025 17:05:40 +0100 Subject: [PATCH] - fixed armadillo data read - added shape to layer - changed construction of layer from Stack factory - fixed rms_error_accu scaling - RBM: added image display using opencv - improved Status print --- pyproject.toml | 4 +++- src/rbm/helper.py | 2 +- src/rbm/layer.py | 5 +++-- src/rbm/rbm.py | 43 ++++++++++++++++------------------------ src/rbm/stack_factory.py | 2 +- src/rbm/status.py | 5 ++++- 6 files changed, 29 insertions(+), 32 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 832dab2..d766c7d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,9 @@ authors = [ { name = "Jens Ahrensfeld" } ] dependencies = [ - "numpy" + "numpy", + "opencv-python", + "opencv-contrib-python" ] readme = "README.md" diff --git a/src/rbm/helper.py b/src/rbm/helper.py index 3b51f5b..2158e35 100644 --- a/src/rbm/helper.py +++ b/src/rbm/helper.py @@ -21,6 +21,6 @@ def rms_error(d_err: np.ndarray): def rms_error_accu(d_err: np.ndarray): d_err_squared = d_err * d_err - s = np.sum(d_err_squared) / len(d_err) + s = np.sum(d_err_squared) / d_err.size return s diff --git a/src/rbm/layer.py b/src/rbm/layer.py index f87d983..65223f6 100644 --- a/src/rbm/layer.py +++ b/src/rbm/layer.py @@ -7,9 +7,10 @@ from status import Status from cd_train import cd_jens class Layer: - def __init__(self, name: str, dim: tuple[int, int], params: RbmParams): + def __init__(self, name: str, shape: tuple[int, int, int, int], params: RbmParams): self.name = name - self.state = RbmState.from_layer_params(dim) + self.shape = shape + self.state = RbmState.from_layer_params((shape[0]*shape[1]+shape[2], shape[3])) self.params = params self.state_filename = f"{self.name}_state.npz" diff --git a/src/rbm/rbm.py b/src/rbm/rbm.py index fd2c667..2233cd6 100644 --- a/src/rbm/rbm.py +++ b/src/rbm/rbm.py @@ -1,29 +1,7 @@ import os.path - import numpy as np -from layer import Layer -from stack import Stack, StackType, StackException +import cv2 as cv from stack_factory import StackFactory -from params import RbmParams - -def test(): - params = RbmParams() - stack = Stack(StackType.Deep, "Stack") - dims = [(2, 3), (3, 4), (4, 5)] - - for n, dim in enumerate(dims): - layer = Layer(f"Layer-{n}", dim, params) - stack.append(layer) - - stack.init(std=0.1) - stack.state_save() - - lay0 = stack.layers[0] - lay1 = stack.from_name("Layer-1") - lay2 = stack.from_index(2) - stack.remove(lay2) - stack.remove(lay1) - stack.remove(lay0) def read_armadillo(filename: str) -> np.ndarray: result = None @@ -37,14 +15,18 @@ def read_armadillo(filename: str) -> np.ndarray: print(f"shape: {shape}") result = np.zeros(shape=shape, dtype=np.float64) - line = fp.readline().replace("\n", '').split(' ') - line = line[1:] - data = [float(s) for s in line] for row in range(shape[0]): + line = fp.readline().replace("\n", '').split(' ') + line = line[1:] + data = [float(s) for s in line] result[row, :] = data return result +def cv_show(vec: np.array, shape): + img = cv.Mat(np.resize(vec, shape)) + img_n = cv.normalize(src=img, dst=None, alpha=255, beta=0, norm_type=cv.NORM_MINMAX, dtype=cv.CV_8U) + cv.imshow(f"training samples", img_n) def main(prj_name: str = "test"): work_dir = "../../results" @@ -63,12 +45,21 @@ def main(prj_name: str = "test"): training_data_path = os.path.join(prj_root, f"{prj_name}.training.dat") batch = read_armadillo(training_data_path) + # Shape of training vector + shape = stack.from_index(0).shape[0:2] + (1,) + # Train stack.train(batch) # Save state stack.state_save() + for n in range(batch.shape[0]): + cv_show(batch[n,:], shape) + cv.waitKeyEx(200) + if __name__ == "__main__": main("norb_small_16h") + cv.destroyAllWindows() + print("Test: [passed]") diff --git a/src/rbm/stack_factory.py b/src/rbm/stack_factory.py index bf9aed3..0ca3fff 100644 --- a/src/rbm/stack_factory.py +++ b/src/rbm/stack_factory.py @@ -48,7 +48,7 @@ class StackFactory: params = RbmParams.from_dict(layer_params, params_version) # Create layer - layer_obj = Layer(f"{layer_name}-{layer_id}", (num_visible_x*num_visible_y+num_context, num_hidden), params) + layer_obj = Layer(f"{layer_name}-{layer_id}", (num_visible_x, num_visible_y, num_context, num_hidden), params) # Add layer to stack obj.append(layer_obj) diff --git a/src/rbm/status.py b/src/rbm/status.py index e970be5..79382b3 100644 --- a/src/rbm/status.py +++ b/src/rbm/status.py @@ -14,5 +14,8 @@ class Status: for key in status.keys(): value = status[key]['value'] unit = status[key]['unit'] - print(f"{key} : {value}{unit}") + if isinstance(value, float): + print(f"{key} : {value:0.6f}{unit}") + else: + print(f"{key} : {value}{unit}") return True