{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"### Implementation\nI wanted to see the competition score on the training phase, so I can see my progress more clearly.\n\nThe implementation is designed for markwijkhuizen's notebook:\nhttps://www.kaggle.com/code/markwijkhuizen/aslfr-transformer-training-inference","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport tensorflow as tf\nfrom Levenshtein import distance as Lev_distance\n\nclass NDLevenshtein(tf.keras.metrics.Metric):\n    def __init__(self, name='ndlevenshtein', **kwargs):\n        super().__init__(**kwargs)\n        self.N = self.add_weight('N', initializer = 'zeros')\n        self.D = self.add_weight('D', initializer = 'zeros')\n\n    def update_state(self, y_true, y_pred, sample_weight=None):\n        y_pred = tf.math.argmax(y_pred, axis=-1)\n        \n        n, d = tf.py_function(self.__calc_levenshtein, inp=[y_true, y_pred], Tout=[tf.float32, tf.float32])\n        \n        self.N.assign_add(tf.cast(n, self.dtype))\n        self.D.assign_add(tf.reduce_sum(tf.cast(d, self.dtype)))\n        \n    def reset_state(self):\n        self.N.assign(0)\n        self.D.assign(0)\n\n    def result(self):\n        return (self.N - self.D) / self.N\n    \n    def __calc_levenshtein(self, y_true, y_pred):\n        n, d = 0, 0\n        for s1, s2 in zip(y_true.numpy(), y_pred.numpy()):\n            s1 = s1[:np.argmin(s1 < N_UNIQUE_CHARACTERS0)]\n            s2 = s2[:np.argmin(s2 < N_UNIQUE_CHARACTERS0)]\n            \n            n += max(s1.size, s2.size)\n            d += Lev_distance(s1, s2)\n        \n        return n, d","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_model():\n    # ...\n    metrics = [\n        NDLevenshtein(),\n    ]\n\n    model.compile(\n        metrics=metrics,\n        # ...\n    )","metadata":{},"execution_count":null,"outputs":[]}]}