scale up model, expand vocab, collect predicted text in forward pass

- Increase H_SIZE to 128, lr to 0.2, disable Rao-Blackwell
- Expand VOCAB to include lowercase and hyphen/period
- Fix batch_delay to always use delay=1 per unit
- forward_step now returns (vc, text) with predicted char per unit step
- Collect and print generated text in main inference loop

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-05 18:17:41 +02:00
co-authored by Claude Sonnet 4.6
parent 5ac4608ba8
commit a41ddce6a8
2 changed files with 18 additions and 12 deletions
+17 -11
View File
@@ -24,19 +24,19 @@ from rbm.train import train
from rbm.status import Status from rbm.status import Status
# ── Hyper-parameters ────────────────────────────────────────────────────────── # ── Hyper-parameters ──────────────────────────────────────────────────────────
TEXT = "HALLO MAUSI! SUPER HASE!" # the character sequence to learn (matches diagram example) TEXT = "Call me Ishmael. Some years ago" # the character sequence to learn (matches diagram example)
WIN = 3 # sliding-window width (= N in the diagram) WIN = 3 # sliding-window width (= N in the diagram)
STRIDE = 1 # sliding-window step size STRIDE = 1 # sliding-window step size
UNITS = 3 UNITS = 3
H_SIZE = 64 # hidden units per RBM cell H_SIZE = 128 # hidden units per RBM cell
NUM_EPOCHS = 1000 NUM_EPOCHS = 1000
NUM_ITERATIONS = 1 NUM_ITERATIONS = 1
TRAIN_PARAMS = TrainingParams( TRAIN_PARAMS = TrainingParams(
learning_rate = 0.1, learning_rate = 0.2,
momentum = 0.5, momentum = 0.5,
num_epochs = NUM_EPOCHS, num_epochs = NUM_EPOCHS,
do_rao_blackwell = True, do_rao_blackwell = False,
num_gibbs_samples= 1 num_gibbs_samples= 1
) )
#WIN=3 #WIN=3
@@ -92,27 +92,29 @@ class RnnModel(Model):
def train(self, vc: Mat, status: Status = None): def train(self, vc: Mat, status: Status = None):
_v, _c = split(vc, H_SIZE, axis=1) _v, _c = split(vc, H_SIZE, axis=1)
for delay, unit in enumerate(self.units): for unit in self.units:
_vd = batch_delay(_v, delay) _vd = batch_delay(_v, 1)
_vc = concat(_vd, _c, axis=1) _vc = concat(_vd, _c, axis=1)
for i in range(vc.shape[0]): for i in range(vc.shape[0]):
print(f"train: {unit.name}:{vc2char(_vc[i,:])}") print(f"train: {unit.name}:{vc2char(_vc[i,:])}")
train(unit, _vc, status) train(unit, _vc, status)
# For the next unit: Update context portion of vc # For the next unit: Update context portion of vc
_c = unit.forward(_vc) _c = unit.forward(vc)
def forward_step(self, _vc: Mat): def forward_step(self, _vc: Mat):
text = ''
for unit in self.units: for unit in self.units:
# print(f"forward_step in : {unit.name}:{vc2char(_vc)}") # print(f"forward_step in : {unit.name}:{vc2char(_vc)}")
_c = unit.forward(_vc) _c = unit.forward(_vc)
_vc = unit.reconstruct(_c) _vc = unit.reconstruct(_c)
print(f"forward_step out: {unit.name}:{vc2char(_vc)}") # print(f"forward_step out: {unit.name}:{vc2char(_vc)}")
text += vc2char(_vc)[WIN-1]
_v, _ = split(_vc, H_SIZE, axis=1) _v, _ = split(_vc, H_SIZE, axis=1)
_v_cl = clamp(_v.reshape([WIN, vocab_size()]), axis=1) _v_cl = clamp(_v.reshape([WIN, vocab_size()]), axis=1)
_v = shift_left(_v_cl.reshape([1, WIN*vocab_size()]), vocab_size()) _v = shift_left(_v_cl.reshape([1, WIN*vocab_size()]), vocab_size())
_vc = concat(_v, _c, axis=1) _vc = concat(_v, _c, axis=1)
return _vc return _vc, text
def forward(self, x: Mat): def forward(self, x: Mat):
pass pass
@@ -147,10 +149,14 @@ if __name__ == "__main__":
model.save() model.save()
# test the model # test the model
seed_str = 'HA' seed_str = 'Cal'
seed_padded = seed_str + '^'*(WIN-len(seed_str)) seed_padded = seed_str + '^'*(WIN-len(seed_str))
v_test = str2vec(seed_padded).reshape([1, WIN*vocab_size()]) v_test = str2vec(seed_padded).reshape([1, WIN*vocab_size()])
c_test = np.zeros([1, H_SIZE]) c_test = np.zeros([1, H_SIZE])
vc_test = concat(v_test, c_test, axis=1) vc_test = concat(v_test, c_test, axis=1)
text = ''
for i in range(len(TEXT)): for i in range(len(TEXT)):
vc_test = model.forward_step(vc_test) vc_test, text_frag = model.forward_step(vc_test)
text += text_frag
print(text)
+1 -1
View File
@@ -1,6 +1,6 @@
from rbm.matrix import Mat, np from rbm.matrix import Mat, np
VOCAB = '^ .!?ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' VOCAB = '^ -.!?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
_CH2IDX = {ch: i for i, ch in enumerate(VOCAB)} _CH2IDX = {ch: i for i, ch in enumerate(VOCAB)}
def clamp(vec: Mat, axis=0): def clamp(vec: Mat, axis=0):