|
2 | 2 | from unittest.mock import MagicMock, patch |
3 | 3 |
|
4 | 4 | import mlx.core as mx |
| 5 | +import mlx.nn as nn |
5 | 6 | import numpy as np |
6 | 7 |
|
7 | 8 |
|
@@ -329,6 +330,35 @@ def test_forward_log_probs_sum(self): |
329 | 330 | total = float(mx.sum(probs[0]).item()) |
330 | 331 | self.assertAlmostEqual(total, 1.0, places=3) |
331 | 332 |
|
| 333 | + def test_sentence_mean_normalize_centers_each_mel_bin(self): |
| 334 | + mel = mx.array([[[1.0, 3.0], [3.0, 5.0], [5.0, 7.0]]]) |
| 335 | + normalized = self.Model.sentence_mean_normalize(mel) |
| 336 | + mean_per_bin = mx.mean(normalized, axis=1) |
| 337 | + mx.eval(mean_per_bin) |
| 338 | + |
| 339 | + self.assertAlmostEqual(float(mean_per_bin[0, 0].item()), 0.0, places=5) |
| 340 | + self.assertAlmostEqual(float(mean_per_bin[0, 1].item()), 0.0, places=5) |
| 341 | + |
| 342 | + def test_classifier_matches_speechbrain_order(self): |
| 343 | + model = self.Model(self.config) |
| 344 | + model.eval() |
| 345 | + classifier = model.classifier |
| 346 | + x = mx.random.normal((1, 1, self.config.embedding_dim)) |
| 347 | + |
| 348 | + expected = mx.squeeze(x, axis=1) |
| 349 | + expected = nn.leaky_relu(expected, negative_slope=0.01) |
| 350 | + expected = classifier.norm(expected) |
| 351 | + expected = classifier.DNN.block_0.linear(expected) |
| 352 | + expected = nn.leaky_relu(expected, negative_slope=0.01) |
| 353 | + expected = classifier.DNN.block_0.norm(expected) |
| 354 | + expected = classifier.out(expected) |
| 355 | + expected = mx.log(mx.softmax(expected, axis=-1) + 1e-10) |
| 356 | + |
| 357 | + actual = classifier(x) |
| 358 | + mx.eval(expected, actual) |
| 359 | + |
| 360 | + self.assertTrue(mx.allclose(actual, expected, atol=1e-5, rtol=1e-5).item()) |
| 361 | + |
332 | 362 | def test_predict_returns_sorted(self): |
333 | 363 | model = self.Model(self.config) |
334 | 364 | labels = {str(i): f"lang_{i}" for i in range(10)} |
|
0 commit comments