significantly improved GB-RBM training

This commit is contained in:
2026-01-05 14:16:34 +01:00
parent 9f72c1f253
commit fdf4186d6b
3 changed files with 60 additions and 78 deletions
+44 -45
View File
File diff suppressed because one or more lines are too long
+9 -27
View File
@@ -93,60 +93,42 @@ def cd_binary_binary(entity: Entity, data_pos: Mat):
return dw, dbv, dbh return dw, dbv, dbh
def cd_gaussian_binary(entity: Entity, data_pos: Mat): def cd_gaussian_binary(entity: Entity, data_pos: Mat):
params = entity.training_params
# Positive phase # Positive phase
if params.do_batch_sample: h_probs_pos = prob(entity.h_given_v(data_pos + sample_gaussian(data_pos)))
h_probs_pos = entity.h_given_v(data_pos + sample_gaussian(data_pos))
else:
h_probs_pos = entity.h_given_v(data_pos)
# Update weights (positive phase) # Update weights (positive phase)
dw = np.dot(np.transpose(data_pos), h_probs_pos) dw = np.dot(np.transpose(data_pos), h_probs_pos)
dbh = np.sum(h_probs_pos, 0) dbh = np.sum(h_probs_pos, 0)
dbv = np.sum(data_pos, 0) dbv = np.sum(data_pos-entity.state.b_v, 0)
if not params.do_rao_blackwell:
# Sample hidden states
h_probs_pos = sample(h_probs_pos)
# Negative phase # Negative phase
data_neg = entity.v_given_h(h_probs_pos) data_neg = entity.v_given_h(h_probs_pos)
h_probs_neg = entity.h_given_v(data_neg) h_probs_neg = prob(entity.h_given_v(data_neg + sample_gaussian(data_neg)))
# Update weights (negative phase) # Update weights (negative phase)
dw -= np.dot(np.transpose(data_neg), h_probs_neg) dw -= np.dot(np.transpose(data_neg), h_probs_neg)
dbh -= np.sum(h_probs_neg, 0) dbh -= np.sum(h_probs_neg, 0)
dbv -= np.sum(data_neg, 0) dbv -= np.sum(data_neg-entity.state.b_v, 0)
return dw, dbv, dbh return dw, dbv, dbh
def cd_gaussian_gaussian(entity: Entity, data_pos: Mat): def cd_gaussian_gaussian(entity: Entity, data_pos: Mat):
params = entity.training_params
# Positive phase # Positive phase
if params.do_batch_sample: h_probs_pos = entity.h_given_v(data_pos)
h_probs_pos = entity.h_given_v(data_pos + sample_gaussian(data_pos))
else:
h_probs_pos = entity.h_given_v(data_pos)
if not params.do_rao_blackwell:
# Sample hidden states
h_probs_pos += sample_gaussian(h_probs_pos)
# Update weights (positive phase) # Update weights (positive phase)
dw = np.dot(np.transpose(data_pos), h_probs_pos) dw = np.dot(np.transpose(data_pos), h_probs_pos + sample_gaussian(h_probs_pos))
dbh = np.sum(h_probs_pos, 0) dbh = np.sum(h_probs_pos, 0)
dbv = np.sum(data_pos, 0) dbv = np.sum(data_pos-entity.state.b_v, 0)
# Negative phase # Negative phase
data_neg = entity.v_given_h(h_probs_pos) data_neg = entity.v_given_h(h_probs_pos)
h_probs_neg = entity.h_given_v(data_neg) h_probs_neg = entity.h_given_v(data_neg + sample_gaussian(data_neg))
# Update weights (negative phase) # Update weights (negative phase)
dw -= np.dot(np.transpose(data_neg), h_probs_neg) dw -= np.dot(np.transpose(data_neg), h_probs_neg)
dbh -= np.sum(h_probs_neg, 0) dbh -= np.sum(h_probs_neg, 0)
dbv -= np.sum(data_neg, 0) dbv -= np.sum(data_neg-entity.state.b_v, 0)
return dw, dbv, dbh return dw, dbv, dbh
+7 -6
View File
@@ -11,11 +11,12 @@ class TestModel(Model):
if do_gaussian_hidden: if do_gaussian_hidden:
# Hidden gaussian # Hidden gaussian
self.unit1 = Entity((96*96, 16), EntityParams(do_gaussian_visible=True, do_gaussian_hidden=True), TrainingParams(learning_rate=0.00001, momentum=0.9, num_epochs=1000, do_rao_blackwell=True)) self.unit1 = Entity((96*96, 16), EntityParams(do_gaussian_visible=True, do_gaussian_hidden=True),
TrainingParams(learning_rate=0.000001, momentum=0.9, num_epochs=1000))
else: else:
# Hidden binary # Hidden binary
self.unit1 = Entity((96 * 96, 16), EntityParams(do_gaussian_visible=True, do_gaussian_hidden=False), self.unit1 = Entity((96 * 96, 333), EntityParams(do_gaussian_visible=True, do_gaussian_hidden=False),
TrainingParams(learning_rate=0.000002, momentum=0.9, num_epochs=1000)) TrainingParams(learning_rate=0.0001, momentum=0.9, num_epochs=1000))
def forward(self, x: Mat): def forward(self, x: Mat):
x = self.unit1.forward(x) x = self.unit1.forward(x)
@@ -34,10 +35,10 @@ if __name__ == "__main__":
model = TestModel(prj_name, "results") model = TestModel(prj_name, "results")
# Init state # Init state
model.init(0.01) model.init(0.1)
# load state # load state
# model.load() model.load()
# Load train data # Load train data
train_batch = read_armadillo(os.path.join(prj_root, f"{prj_name}.training.dat")) train_batch = read_armadillo(os.path.join(prj_root, f"{prj_name}.training.dat"))
@@ -56,7 +57,7 @@ if __name__ == "__main__":
out_normalized = model.backward(model.forward(inp)) out_normalized = model.backward(model.forward(inp))
img = 2*(out_normalized + 0.5) img = 2*(out_normalized + 0.5)
img = np.reshape(img, (96, 96)) img = np.reshape(img, (96, 96))
axes[index].imshow(img) axes[index].imshow(np.asnumpy(img))
axes[index].axis('off') axes[index].axis('off')
plt.show() plt.show()