- refactored Rbm
- added myStatus with realtime update of reconstruction - DeepStack: added up/down passes for multilayer Stacks
This commit is contained in:
+28
-13
@@ -2,6 +2,30 @@ import os.path
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
import cv2 as cv
|
import cv2 as cv
|
||||||
from stack_factory import StackFactory
|
from stack_factory import StackFactory
|
||||||
|
from status import Status
|
||||||
|
from stack_deep import StackDeep
|
||||||
|
|
||||||
|
def cv_show(name: str, 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"{name}", img_n)
|
||||||
|
|
||||||
|
class MyStatus(Status):
|
||||||
|
def __init__(self, _stack: StackDeep, _batch: np.ndarray):
|
||||||
|
Status.__init__(self)
|
||||||
|
self.stack = _stack
|
||||||
|
self.batch = _batch
|
||||||
|
|
||||||
|
def on_change(self, status: dict) -> bool:
|
||||||
|
# Show reconstruction
|
||||||
|
# Shape of training vector
|
||||||
|
shape = self.stack.from_index(0).shape[0:2] + (1,)
|
||||||
|
|
||||||
|
for n in range(self.batch.shape[0]):
|
||||||
|
img = self.stack.pass_down_up(self.batch[n,:])
|
||||||
|
cv_show("img", img, shape)
|
||||||
|
cv.waitKeyEx(1)
|
||||||
|
return True
|
||||||
|
|
||||||
def read_armadillo(filename: str) -> np.ndarray:
|
def read_armadillo(filename: str) -> np.ndarray:
|
||||||
result = None
|
result = None
|
||||||
@@ -23,11 +47,6 @@ def read_armadillo(filename: str) -> np.ndarray:
|
|||||||
|
|
||||||
return result
|
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"):
|
def main(prj_name: str = "test"):
|
||||||
work_dir = "../../results"
|
work_dir = "../../results"
|
||||||
prj_root = "/home/jens/work/repos/Rbm"
|
prj_root = "/home/jens/work/repos/Rbm"
|
||||||
@@ -45,21 +64,17 @@ def main(prj_name: str = "test"):
|
|||||||
training_data_path = os.path.join(prj_root, f"{prj_name}.training.dat")
|
training_data_path = os.path.join(prj_root, f"{prj_name}.training.dat")
|
||||||
batch = read_armadillo(training_data_path)
|
batch = read_armadillo(training_data_path)
|
||||||
|
|
||||||
# Shape of training vector
|
# Prepare status listener
|
||||||
shape = stack.from_index(0).shape[0:2] + (1,)
|
my_status = MyStatus(stack, batch)
|
||||||
|
|
||||||
# Train
|
# Train
|
||||||
stack.train(batch)
|
stack.train(batch, status=my_status)
|
||||||
|
|
||||||
# Save state
|
# Save state
|
||||||
stack.state_save()
|
stack.state_save()
|
||||||
|
|
||||||
for n in range(batch.shape[0]):
|
|
||||||
cv_show(batch[n,:], shape)
|
|
||||||
cv.waitKeyEx(200)
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main("norb_small_16h")
|
main("prims")
|
||||||
cv.destroyAllWindows()
|
cv.destroyAllWindows()
|
||||||
|
|
||||||
print("Test: [passed]")
|
print("Test: [passed]")
|
||||||
|
|||||||
+19
-2
@@ -16,10 +16,27 @@ class StackDeep(Stack):
|
|||||||
|
|
||||||
return _batch
|
return _batch
|
||||||
|
|
||||||
def train(self, batch: np.ndarray):
|
def train(self, batch: np.ndarray, status=Status()):
|
||||||
_batch = np.matrix.copy(batch)
|
_batch = np.matrix.copy(batch)
|
||||||
for index, layer in enumerate(self.layers):
|
for index, layer in enumerate(self.layers):
|
||||||
print(f"Train layer {index}")
|
print(f"Train layer {index}")
|
||||||
_batch = self.batch_from(batch, index)
|
_batch = self.batch_from(batch, index)
|
||||||
layer.train(_batch, cd_func=cd_jens, status=Status())
|
layer.train(_batch, cd_func=cd_jens, status=status)
|
||||||
|
|
||||||
|
|
||||||
|
def pass_up(self, visible: np.ndarray, from_layer_id: int = 0):
|
||||||
|
h = np.matrix.copy(visible)
|
||||||
|
for layer in self.layers[from_layer_id:]:
|
||||||
|
h = layer.gibbs_v_to_h(h)
|
||||||
|
return h
|
||||||
|
|
||||||
|
def pass_down(self, hidden: np.ndarray, from_layer_id: int = 0):
|
||||||
|
v = np.matrix.copy(hidden)
|
||||||
|
for layer in list(reversed(self.layers))[from_layer_id:]:
|
||||||
|
v = layer.gibbs_h_to_v(v)
|
||||||
|
return v
|
||||||
|
|
||||||
|
def pass_down_up(self, visible: np.ndarray, from_layer_id: int = 0):
|
||||||
|
h = self.pass_up(visible, from_layer_id)
|
||||||
|
v = self.pass_down(h)
|
||||||
|
return v
|
||||||
Reference in New Issue
Block a user