"
],
"text/html": [
"\n",
" \n",
" \n",
"
\n",
" [430/430 40:10, Epoch 5/5]\n",
"
\n",
" \n",
" \n",
" \n",
" Step \n",
" Training Loss \n",
" Validation Loss \n",
" Accuracy \n",
" Precision \n",
" Recall \n",
" F1 \n",
" \n",
" \n",
" \n",
" \n",
" 100 \n",
" 0.566022 \n",
" 0.098864 \n",
" 0.978382 \n",
" 0.982360 \n",
" 0.978491 \n",
" 0.980367 \n",
" \n",
" \n",
" 200 \n",
" 0.205725 \n",
" 0.059238 \n",
" 0.986301 \n",
" 0.987747 \n",
" 0.986834 \n",
" 0.987265 \n",
" \n",
" \n",
" 300 \n",
" 0.133694 \n",
" 0.055091 \n",
" 0.988870 \n",
" 0.990312 \n",
" 0.989150 \n",
" 0.989711 \n",
" \n",
" \n",
" 400 \n",
" 0.095762 \n",
" 0.052623 \n",
" 0.989084 \n",
" 0.990369 \n",
" 0.989207 \n",
" 0.989768 \n",
" \n",
" \n",
"
"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Writing model shards: 0%| | 0/1 [00:00, ?it/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "54c85ba4880f471087dad059229401c4"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Writing model shards: 0%| | 0/1 [00:00, ?it/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "a8d7f7c4ac014e0481186cb336b897f1"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Writing model shards: 0%| | 0/1 [00:00, ?it/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "e31ffb4737a54896967a4fe7fc0c8e10"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Writing model shards: 0%| | 0/1 [00:00, ?it/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "74de4b3765a24936be26f1049c7e37c2"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Writing model shards: 0%| | 0/1 [00:00, ?it/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "6510121ce058460db0f73c5bd31e0e93"
}
},
"metadata": {}
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"TrainOutput(global_step=430, training_loss=0.6660554780516513, metrics={'train_runtime': 2416.4359, 'train_samples_per_second': 45.116, 'train_steps_per_second': 0.178, 'total_flos': 2.868539743678464e+16, 'train_loss': 0.6660554780516513, 'epoch': 5.0})"
]
},
"metadata": {},
"execution_count": 11
}
],
"source": [
"train_out = trainer.train()\n",
"train_out"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "0c6caee8",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 152
},
"id": "0c6caee8",
"outputId": "a6076f75-5a0f-4140-ff26-be0dd6bbe444"
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"text/html": [
"\n",
" \n",
" \n",
"
\n",
" [73/73 01:04]\n",
"
\n",
" "
]
},
"metadata": {}
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
" split eval_loss eval_accuracy eval_precision eval_recall eval_f1 \\\n",
"0 val 0.052044 0.989084 0.990369 0.989207 0.989768 \n",
"1 test 0.058439 0.988230 0.989575 0.989209 0.989375 \n",
"\n",
" eval_runtime eval_samples_per_second eval_steps_per_second \n",
"0 32.4421 144.010 2.250 \n",
"1 32.2773 144.777 2.293 "
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" split \n",
" eval_loss \n",
" eval_accuracy \n",
" eval_precision \n",
" eval_recall \n",
" eval_f1 \n",
" eval_runtime \n",
" eval_samples_per_second \n",
" eval_steps_per_second \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" val \n",
" 0.052044 \n",
" 0.989084 \n",
" 0.990369 \n",
" 0.989207 \n",
" 0.989768 \n",
" 32.4421 \n",
" 144.010 \n",
" 2.250 \n",
" \n",
" \n",
" 1 \n",
" test \n",
" 0.058439 \n",
" 0.988230 \n",
" 0.989575 \n",
" 0.989209 \n",
" 0.989375 \n",
" 32.2773 \n",
" 144.777 \n",
" 2.293 \n",
" \n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"summary": "{\n \"name\": \"])\",\n \"rows\": 2,\n \"fields\": [\n {\n \"column\": \"split\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"test\",\n \"val\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"eval_loss\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.004521988060294459,\n \"min\": 0.0520443357527256,\n \"max\": 0.05843939259648323,\n \"num_unique_values\": 2,\n \"samples\": [\n 0.05843939259648323,\n 0.0520443357527256\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"eval_accuracy\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.0006036182921715719,\n \"min\": 0.9882302589343035,\n \"max\": 0.989083904109589,\n \"num_unique_values\": 2,\n \"samples\": [\n 0.9882302589343035,\n 0.989083904109589\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"eval_precision\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.0005618548723572975,\n \"min\": 0.9895749056031532,\n \"max\": 0.9903694883837263,\n \"num_unique_values\": 2,\n \"samples\": [\n 0.9895749056031532,\n 0.9903694883837263\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"eval_recall\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.4062148581137545e-06,\n \"min\": 0.9892067999760494,\n \"max\": 0.9892087886641734,\n \"num_unique_values\": 2,\n \"samples\": [\n 0.9892087886641734,\n 0.9892067999760494\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"eval_f1\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.0002781664128556073,\n \"min\": 0.9893749443026145,\n \"max\": 0.9897683310162716,\n \"num_unique_values\": 2,\n \"samples\": [\n 0.9893749443026145,\n 0.9897683310162716\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"eval_runtime\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.11653119753954778,\n \"min\": 32.2773,\n \"max\": 32.4421,\n \"num_unique_values\": 2,\n \"samples\": [\n 32.2773,\n 32.4421\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"eval_samples_per_second\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.5423509011700791,\n \"min\": 144.01,\n \"max\": 144.777,\n \"num_unique_values\": 2,\n \"samples\": [\n 144.777,\n 144.01\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"eval_steps_per_second\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.030405591591021647,\n \"min\": 2.25,\n \"max\": 2.293,\n \"num_unique_values\": 2,\n \"samples\": [\n 2.293,\n 2.25\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 12
}
],
"source": [
"val_metrics = trainer.evaluate(val_ds)\n",
"test_metrics = trainer.evaluate(test_ds)\n",
"\n",
"pd.DataFrame([\n",
" {\"split\": \"val\", **{k: float(v) for k, v in val_metrics.items() if k.startswith(\"eval_\")}},\n",
" {\"split\": \"test\", **{k: float(v) for k, v in test_metrics.items() if k.startswith(\"eval_\")}},\n",
"])"
]
},
{
"cell_type": "markdown",
"id": "88afdd35",
"metadata": {
"id": "88afdd35"
},
"source": [
"## Confusion matrix"
]
},
{
"cell_type": "code",
"source": [
"pred = trainer.predict(test_ds)\n",
"y_true = pred.label_ids\n",
"y_pred = np.argmax(pred.predictions, axis=-1)\n",
"\n",
"cm = confusion_matrix(y_true, y_pred, labels=list(range(len(label_names))))"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 17
},
"id": "a6BgU6L2L-pH",
"outputId": "2fbeedd3-de27-4597-8e66-6979d3db0fbc"
},
"id": "a6BgU6L2L-pH",
"execution_count": 13,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"text/html": []
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "1ad044d2",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 607
},
"id": "1ad044d2",
"outputId": "9c273ae3-3047-4e8b-d959-d4598ce14ae1"
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAApYAAAJOCAYAAAANn0dIAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAbENJREFUeJzt3Xd8FNX6x/HvpG0KKfQkErrSOwKRLkiCoKhYUFRUFAtFQSx4pViQK9hoF0RRLHjtehW9KAKCSqRHegSlCYSggYQkpO3O74/c7G8jIMkym83Gz/v1mtdlZ86efebcNXnyzDkzhmmapgAAAIDz5OftAAAAAFA5kFgCAADAEiSWAAAAsASJJQAAACxBYgkAAABLkFgCAADAEiSWAAAAsASJJQAAACxBYgkAAABLkFgCKJPdu3erX79+ioyMlGEY+vTTTy3tf9++fTIMQ4sWLbK038qgfv36uu2227wdBgCcFYkl4IN++eUX3X333WrYsKGCg4MVERGhrl27aubMmTp16pRHP3vYsGHaunWrpk6dqrfeeksdO3b06OdVRjt27NCUKVO0b98+b4cCAJYyeFY44Fu++OILXXfddbLZbLr11lvVsmVL5efn6/vvv9dHH32k2267TQsWLPDIZ586dUqhoaH6xz/+oaefftojn2GapvLy8hQYGCh/f3+PfIa3ffjhh7ruuuu0cuVK9erVq9Tvy8vLk5+fnwIDAz0XHACchwBvBwCg9Pbu3ashQ4aoXr16WrFihWJiYpzHRo4cqT179uiLL77w2OcfO3ZMkhQVFeWxzzAMQ8HBwR7r39eYpqnc3FyFhITIZrN5OxwA+EtcCgd8yPTp05WVlaWFCxeWSCqLNW7cWPfff7/zdWFhoZ566ik1atRINptN9evX12OPPaa8vLwS76tfv74GDhyo77//Xp06dVJwcLAaNmyoN99809lmypQpqlevniTpoYcekmEYql+/viTptttuc/7b1ZQpU2QYRol9y5YtU7du3RQVFaUqVaqoSZMmeuyxx5zHzzbHcsWKFerevbvCwsIUFRWlQYMGaefOnWf8vD179ui2225TVFSUIiMjdfvttysnJ+fsA/s/vXr1UsuWLbVlyxb17NlToaGhaty4sT788ENJ0qpVq9S5c2eFhISoSZMm+uabb0q8f//+/brvvvvUpEkThYSEqHr16rruuutKXPJetGiRrrvuOklS7969ZRiGDMPQt99+K+n//7/46quv1LFjR4WEhOjll192HiueY2mapnr37q2aNWsqLS3N2X9+fr5atWqlRo0aKTs7+5znDABWIrEEfMjnn3+uhg0b6pJLLilV+zvvvFOTJk1S+/bt9eKLL6pnz56aNm2ahgwZclrbPXv26Nprr9Vll12m559/XlWrVtVtt92m7du3S5KuueYavfjii5KkG2+8UW+99ZZeeumlMsW/fft2DRw4UHl5eXryySf1/PPP68orr9QPP/zwl+/75ptvlJCQoLS0NE2ZMkXjxo3TmjVr1LVr1zPOU7z++ut18uRJTZs2Tddff70WLVqkJ554olQxHj9+XAMHDlTnzp01ffp02Ww2DRkyRO+9956GDBmiyy+/XP/85z+VnZ2ta6+9VidPnnS+d/369VqzZo2GDBmiWbNm6Z577tHy5cvVq1cvZ2Lbo0cPjRkzRpL02GOP6a233tJbb72lZs2aOftJSUnRjTfeqMsuu0wzZ85U27ZtT4vTMAy99tprys3N1T333OPcP3nyZG3fvl2vv/66wsLCSnXOAGAZE4BPyMjIMCWZgwYNKlX75ORkU5J55513ltg/fvx4U5K5YsUK57569eqZkszVq1c796WlpZk2m8188MEHnfv27t1rSjJnzJhRos9hw4aZ9erVOy2GyZMnm64/Zl588UVTknns2LGzxl38Ga+//rpzX9u2bc1atWqZf/zxh3PfTz/9ZPr5+Zm33nrraZ93xx13lOjz6quvNqtXr37WzyzWs2dPU5L5zjvvOPft2rXLlGT6+fmZP/74o3P/V199dVqcOTk5p/WZlJRkSjLffPNN574PPvjAlGSuXLnytPbF/18sXbr0jMeGDRtWYt/LL79sSjLffvtt88cffzT9/f3NBx544JznCgCeQMUS8BGZmZmSpPDw8FK1//LLLyVJ48aNK7H/wQcflKTT5mI2b95c3bt3d76uWbOmmjRpol9//dXtmP+seG7mf/7zHzkcjlK958iRI0pOTtZtt92matWqOfe3bt1al112mfM8XblW8CSpe/fu+uOPP5xj+FeqVKlSoqLbpEkTRUVFqVmzZurcubNzf/G/XccnJCTE+e+CggL98ccfaty4saKiorRp06ZSnG2RBg0aKCEhoVRtR4wYoYSEBI0ePVq33HKLGjVqpGeeeabUnwUAViKxBHxERESEJJW49PpX9u/fLz8/PzVu3LjE/ujoaEVFRWn//v0l9tetW/e0PqpWrarjx4+7GfHpbrjhBnXt2lV33nmnateurSFDhuj999//yySzOM4mTZqcdqxZs2b6/fffT5tL+OdzqVq1qiSV6lzq1Klz2rzQyMhIxcXFnbbvz32eOnVKkyZNUlxcnGw2m2rUqKGaNWvqxIkTysjIOOdnF2vQoEGp20rSwoULlZOTo927d2vRokUlElwAKE8kloCPiIiIUGxsrLZt21am9/05STqbs93axyzFHcnO9hl2u73E65CQEK1evVrffPONbrnlFm3ZskU33HCDLrvsstPano/zOZezvbc0fY4ePVpTp07V9ddfr/fff19ff/21li1bpurVq5e6QiupzInht99+61yQtXXr1jK9FwCsRGIJ+JCBAwfql19+UVJS0jnb1qtXTw6HQ7t37y6x/+jRozpx4oRzhbcVqlatqhMnTpy2/89VUUny8/NTnz599MILL2jHjh2aOnWqVqxYoZUrV56x7+I4U1JSTju2a9cu1ahRo8IsUvnwww81bNgwPf/8886FUN26dTttbEqb7JfGkSNHNHr0aPXr108DBw7U+PHjzzjuAFAeSCwBH/Lwww8rLCxMd955p44ePXra8V9++UUzZ86UJF1++eWSdNrK7RdeeEGSNGDAAMviatSokTIyMrRlyxbnviNHjuiTTz4p0S49Pf209xaveP7zLZCKxcTEqG3btnrjjTdKJGjbtm3T119/7TzPisDf3/+0qujs2bNPq8YWJ8JnSsbL6q677pLD4dDChQu1YMECBQQEaPjw4aWqzgKA1bhBOuBDGjVqpHfeeUc33HCDmjVrVuLJO2vWrNEHH3zgvM9hmzZtNGzYMC1YsEAnTpxQz549tW7dOr3xxhu66qqr1Lt3b8viGjJkiB555BFdffXVGjNmjHJycjRv3jxddNFFJRatPPnkk1q9erUGDBigevXqKS0tTf/6179Up04ddevW7az9z5gxQ/3791d8fLyGDx+uU6dOafbs2YqMjNSUKVMsO4/zNXDgQL311luKjIxU8+bNlZSUpG+++UbVq1cv0a5t27by9/fXs88+q4yMDNlsNl166aWqVatWmT7v9ddf1xdffKFFixapTp06kooS2Ztvvlnz5s3TfffdZ9m5AUBpkFgC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XZlRsQQAAIAlqFgCAAC4Yo6l26hYAgAAwBJULAEAAFwYjqLNU31XZlQsAQAAYAkqlgAAAK6YY+k2EksAAABXPNLRbSSWAABJUq05a7wdAoA/mTZtmj7++GPt2rVLISEhuuSSS/Tss8+qSZMmzja5ubl68MEH9e677yovL08JCQn617/+pdq1azvbHDhwQPfee69WrlypKlWqaNiwYZo2bZoCAqxNBZljCQAA4MIwTY9uZbFq1SqNHDlSP/74o5YtW6aCggL169dP2dnZzjZjx47V559/rg8++ECrVq3S4cOHdc011ziP2+12DRgwQPn5+VqzZo3eeOMNLVq0SJMmTbJszIoZplnJL/ZLyszMVGRkpHppkAKMQG+HAwAAzqHQLNC3+o8yMjIUERFRLp9ZnC/07viYAgKCPfIZhYW5WrnhGbfP69ixY6pVq5ZWrVqlHj16KCMjQzVr1tQ777yja6+9VpK0a9cuNWvWTElJSerSpYv++9//auDAgTp8+LCzijl//nw98sgjOnbsmIKCgiw7PyqWAAAArooX73hqOw8ZGRmSpGrVqkmSNm7cqIKCAvXt29fZpmnTpqpbt66SkpIkSUlJSWrVqlWJS+MJCQnKzMzU9u3bzyueP2OOJQAAQDnLzMws8dpms8lms/3lexwOhx544AF17dpVLVu2lCSlpqYqKChIUVFRJdrWrl1bqampzjauSWXx8eJjVqJiCQAA4MqU5PDQ9r+CZVxcnCIjI53btGnTzhnWyJEjtW3bNr377rtWnanlqFgCAACUs4MHD5aYY3muauWoUaO0ZMkSrV69WnXq1HHuj46OVn5+vk6cOFGiann06FFFR0c726xbt65Ef0ePHnUesxIVSwAAABflsSo8IiKixHa2xNI0TY0aNUqffPKJVqxYoQYNGpQ43qFDBwUGBmr58uXOfSkpKTpw4IDi4+MlSfHx8dq6davS0tKcbZYtW6aIiAg1b97c0rGjYgkAAFBBjRw5Uu+8847+85//KDw83DknMjIyUiEhIYqMjNTw4cM1btw4VatWTRERERo9erTi4+PVpUsXSVK/fv3UvHlz3XLLLZo+fbpSU1P1+OOPa+TIkeeslJYViSUAAIArUx58pGPZms+bN0+S1KtXrxL7X3/9dd12222SpBdffFF+fn4aPHhwiRukF/P399eSJUt07733Kj4+XmFh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5jGWf+Hnn382ExMTzSuvvNK88847zVq1aplfffWV8/j+/ftNwzDMefPmeTFK31DasXzllVfMvLw8Mz093YvRVmy//fabWatWLfPKK6809+3b59zvOjfwwQcfNB955JGzzrtE6cZx3Lhx5mOPPcY4wqtILC3Qo0cP08/Pz4yNjeUSznliLM9PSkqKedlll5khISHmc889Z5pm0S+e/Px887fffjPbtGljfvDBB879OLtzjWXr1q1PW2SGM/voo49Mm81m3nLLLeb27dud+7Ozs80JEyaY9erVM1NSUrwYoW8ozTju2rXLixECLN45L+b/Jp0/8sgjSk1N1bPPPqs2bdpwY2Q3MJbWuOiiizRv3jzdd999Wr58uTp16qTu3bsrMDBQL7/8sjIzM9W5c2dJ3GfxXM41lidPnnTeaxV/7aqrrtLMmTM1atQorV+/XvHx8QoODtahQ4f0448/aunSpbrooou8HWaFV5pxbNKkibfDxN8ccyzPQ/Ev5g4dOsjhcGjjxo0l9qP0GEvrNGrUSHPmzJFpmpo6dao2b96s6dOna8aMGfroo48UFxfn7RB9BmNpDT8/P91999364Ycf1LJlS23evFnbtm1Ts2bN9P333zP/vJQYR/gCwzS5u7QV3n77bd1zzz1asWKFOnXq5O1wfBpjaY3du3dr3LhxWrdunY4fP66kpCQWl7iJsbQOjxC1BuOIioqKpUV69+6tiy++WLGxsd4Oxecxlta48MIL9dxzz6lLly7avHkzidB5YCyt47qambqG+xhHVFRULC305xsnw32MpXUKCgqcN+vH+WEsAeCvkVgCAADAElwKBwAAgCVILAEAAGAJEksAAABYgsQSAAAAliCxBAAAgCVILAEAAGAJEksAHnfbbbfpqquucr7u1auXHnjggXKP49tvv5VhGDpx4sRZ2xiGoU8//bTUfU6ZMkVt27Y9r7j27dsnwzCUnJx8Xv0AgLeRWAJ/U7fddpsMw5BhGAoKClLjxo315JNPqrCw0OOf/fHHH+upp54qVdvSJIMAgIohwNsBAPCexMREvf7668rLy9OXX36pkSNHKjAwUBMmTDitbX5+voKCgiz53GrVqlnSDwCgYqFiCfyN2Ww2RUdHq169err33nvVt29fffbZZ5L+//L11KlTFRsbqyZNmkiSDh48qOuvv15RUVGqVq2aBg0apH379jn7tNvtGjdunKKiolS9enU9/PDDpz3L+M+XwvPy8vTII48oLi5ONptNjRs31sKFC7Vv3z717t1bklS1alUZhqHbbrtNkuRwODRt2jQ1aNBAISEhatOmjT788MMSn/Pll1/qoosuUkhIiHr37l0iztJ65JFHdNFFFyk0NFQNGzbUxIkTVVBQcFq7l19+WXFxcQoNDdX111+vjIyMEsdfffVVNWvWTMHBwWratKn+9a9/lTkWAKjoSCwBOIWEhCg/P9/5evny5UpJSdGyZcu0ZMkSFRQUKCEhQeHh4fruu+/0ww8/qEqVKkpMTHS+7/nnn9eiRYv02muv6fvvv1d6ero++eSTv/zcW2+9Vf/+9781a9Ys7dy5Uy+//LKqVKmiuLg4ffTRR5KklJQUHTlyRDNnzpQkTZs2TW+++abmz5+v7du3a+zYsbr55pu1atUqSUUJ8DXXXKMrrrhCycnJuvPOO/Xoo4+WeUzCw8O1aNEi7dixQzNnztQrr7yiF198sUSbPXv26P3339fnn3+upUuXavPmzbrvvvucxxcvXqxJkyZp6tSp2rlzp5555hlNnDhRb7zxRpnjAYAKzQTwtzRs2DBz0KBBpmmapsPhMJctW2babDZz/PjxzuO1a9c28/LynO956623zCZNmpgOh8O5Ly8vzwwJCTG/+uor0zRNMyYmxpw+fbrzeEFBgVmnTh3nZ5mmafbs2dO8//77TdM0zZSUFFOSuWzZsjPGuXLlSlOSefz4cee+3NxcMzQ01FyzZk2JtsOHDzdvvPFG0zRNc8KECWbz5s1LHH/kkUdO6+vPJJmffPLJWY/PmDHD7NChg/P15MmTTX9/f/O3335z7vvvf/9r+vn5mUeOHDFN0zQbNWpkvvPOOyX6eeqpp8z4+HjTNE1z7969piRz8+bNZ/1cAPAFzLEE/saWLFmiKlWqqKCgQA6HQzfddJOmTJniPN6qVasS8yp/+ukn7dmzR+Hh4SX6yc3N1S+//KKMjAwdOXJEnTt3dh4LCAhQx44dT7scXiw5OVn+/v7q2bNnqePes2ePcnJydNlll5XYn5+fr3bt2kmSdu7cWSIOSYqPjy/1ZxR77733NGvWLP3yyy/KyspSYWGhIiIiSrSpW7euLrjgghKf43A4lJKSovDwcP3yyy8aPny47rrrLmebwsJCRUZGljkeAKjISCyBv7HevXtr3rx5CgoKUmxsrAICSv5ICAsLK/E6KytLHTp00OLFi0/rq2bNmm7FEBISUub3ZGVlSZK++OKLEgmdVDRv1CpJSUkaOnSonnjiCSUkJCgyMlLvvvuunn/++TLH+sorr5yW6Pr7+1sWKwBUBCSWwN9YWFiYGjduXOr27du313vvvadatWqdVrUrFhMTo7Vr16pHjx6SiipzGzduVPv27c/YvlWrVnI4HFq1apX69u172vHiiqndbnfua968uWw2mw4cOHDWSmezZs2cC5GK/fjjj+c+SRdr1qxRvXr19I9//MO5b//+/ae1O3DggA4fPqzY2Fjn5/j5+alJkyaqXbu2YmNj9euvv2ro0KFl+nwA8DUs3gFQakOHDlWNGjU0aNAgfffdd9q7d6++/fZbjRkzRr/99psk6f7779c///lPffrpp9q1a5fuu+++v7wHZf369TVs2DDdcccd+vTTT519vv/++5KkevXqyTAMLVmyRMeOHVNWVpbCw8M1fvx4jR07Vm+88YZ++eUXbdq0SbNnz3YuiLnnnnu0e/duPfTQQ0pJSdE777yjRYsWlel8L7zwQh04cEDvvvuufvnlF82aNeuMC5GCg4M1bNgw/fTTT/ruu+80ZswYXX/99YqOjpYkPfHEE5o2bZpmzZqln3/+WVu3btXrr7+uF154oUzxAEBFR2IJoNRCQ0O1evVq1a1bV9dcc42aNWum4cOHKzc311nBfPDBB3XLLbdo2LBhio+PV3h4uK6++uq/7HfevHm69tprdd9996lp06a66667lJ2dLUm64IIL9MQTT+jRRx9V7dq1NWrUKEnSU089pYkTJ2ratGlq1qyZEhMT9cUXX6hBgwaSiuY9fvTRR/r000/Vpk0bzZ8/X88880yZzvfKK6/U2LFjNWrUKLVt21Zr1qzRxIkTT2vXuHFjXXPNNbr88svVr18/tW7dusTthO688069+uqrev3119WqVSv17NlTixYtcsYKAJWFYZ5tRj0AAABQBlQsAQAAYAkSSwAAAFiCxBIAAACWILEEAACAJUgsAQAAYAkSSwAAAFiCxBIAAACWILEEAACAJUgsAQAAYAkSSwAAAFiCxBIAAACWILEEAACAJf4PO0Bz4JSf9kYAAAAASUVORK5CYII=\n"
},
"metadata": {}
}
],
"source": [
"fig, ax = plt.subplots(figsize=(8, 6))\n",
"im = ax.imshow(cm, interpolation=\"nearest\")\n",
"ax.set_title(\"Confusion matrix\")\n",
"ax.set_xlabel(\"Predicted label\")\n",
"ax.set_ylabel(\"True label\")\n",
"ax.set_xticks(range(len(label_names)))\n",
"ax.set_yticks(range(len(label_names)))\n",
"ax.set_xticklabels(label_names, rotation=45, ha=\"right\")\n",
"ax.set_yticklabels(label_names)\n",
"fig.colorbar(im, ax=ax, fraction=0.046, pad=0.04)\n",
"\n",
"for i in range(cm.shape[0]):\n",
" for j in range(cm.shape[1]):\n",
" ax.text(j, i, int(cm[i, j]), ha=\"center\", va=\"center\", fontsize=8)\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "f2d643cc",
"metadata": {
"id": "f2d643cc"
},
"source": [
"## Hub upload"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "a08601e5",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 194,
"referenced_widgets": [
"427a612ce814489e87fa4ac4094cc76c",
"85496885501844a5bd42653720b4c41b",
"27113ec9d7a14a3997d36b65b98931bc",
"c9539b39e1e444ceb7d04be95301d357",
"53fef2c38cae4ab1887e8730ead824f2",
"95678504fc9b4a1284e38fe2d8486ce9",
"d6748b26fe7948de85c5ea5735b2c4d7",
"b473177806324c7e94d907c9faecb1f2",
"1e2be2b4b3e24dad9861879ea52fec53",
"908df1adb5d845c6b5bdfed6821926a5",
"1f531353bffb41619d13adc8967f8b18",
"e69644b99f8c4f37b09f5851339329db",
"ac51944031f34699be96b7a5c9c1b5af",
"0255ab95c3414f5b868c3e11ad8939c6",
"05d255580dcc4d98b42c2c67a0c74995",
"818e0296b761444ab34a2011d142a2c9",
"97691687a3bb4e0f8c6d6c4c468af4ca",
"ea378a44d7504765aad59a23b6a63982",
"f6c8a5b5805f479086a0c80fd37cc7b4",
"292cf4f4f4d04a3a8e6347f308a63866",
"12753b5d527f45f182a6c702696c5025",
"c26af4df443847a2bdd0de05bb202544",
"5d7762cb1a96440b9ad551b0a347de16",
"cadcbfe29d23492cb321132657579e05",
"956b2b0687c341038ac83bc989319f6d",
"e98296208ee348e7bd345815a5a44959",
"1c00af189a9e4811a34b5a760f6f5bc0",
"ad90e9b3fe444523b5c84cbf052d423c",
"6aa94549ddac458fb28dc68ccd397545",
"a49affe907614432af8e94ea1a50e471",
"5d01b6f4dc884aac9f1325bffb79433d",
"0f04c8a6e64b490db973f12b279b4797",
"ba7250801a984ad095463c57d5d10d43",
"9e351086a70d4e1e9eac692ae85733d6",
"cbd54e7a89ef490d87095e48dadaef7a",
"22b5df18864744399a3fc0c8e0914aa6",
"69fb23d622b74191bad1431ae7e64d48",
"52cec782d26d497182cb37af98632bb3",
"b2c995c84bd74731a59af2d1a9c8d8ac",
"901d9a2250b8410bba1a0ff8bf45225e",
"dbf2cc80e02842cc85d84928c59b1882",
"c90811d942b845a6a5c5823dd847dbfe",
"882afeaa90664febbf9a26da5337acb6",
"38622bf2e93445eaac69035cc16327c4",
"cd45b88f4d384a6cb2b043ca48e787fa",
"3263e9a92532499b99d5397bdb4f5b77",
"be5155630ab0438d82ef83ed070bd3ab",
"e4ac92991e8740c4b01347c5e12e84b9",
"6cdc252741164d60ad540e1752ba8b08",
"28d8c2408ad14ceba461cea694c20e6e",
"164e1fc51afd4224ad891c809473392c",
"e4a01f5fe9e34caf92561a712dcb17a8",
"7225d7e47a7943ca8bffb4712044c24e",
"ed3198e5cbbd455aa92afc3fdf8953cd",
"88420d2499604d44bd56d0f248ea5a1e"
]
},
"id": "a08601e5",
"outputId": "adf3086b-7bd8-442e-e447-c5dbef998f22"
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"Writing model shards: 0%| | 0/1 [00:00, ?it/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "427a612ce814489e87fa4ac4094cc76c"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Processing Files (0 / 0) : | | 0.00B / 0.00B "
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "e69644b99f8c4f37b09f5851339329db"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"New Data Upload : | | 0.00B / 0.00B "
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "5d7762cb1a96440b9ad551b0a347de16"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
" ...in_cefr/model.safetensors: 0%| | 580kB / 499MB "
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "9e351086a70d4e1e9eac692ae85733d6"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
" ...in_cefr/training_args.bin: 2%|1 | 99.0B / 5.20kB "
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "cd45b88f4d384a6cb2b043ca48e787fa"
}
},
"metadata": {}
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"pymlex/roberta-spanish-cefr\n"
]
}
],
"source": [
"from huggingface_hub import login\n",
"\n",
"login(token='YOUR_TOKEN')\n",
"trainer.push_to_hub(commit_message=\"Spanish CEFR fine-tuning\")\n",
"print(repo_id)"
]
},
{
"cell_type": "markdown",
"source": [
"## Inference"
],
"metadata": {
"id": "BDGpYPNLZXba"
},
"id": "BDGpYPNLZXba"
},
{
"cell_type": "code",
"source": [
"from transformers import AutoTokenizer, AutoModelForSequenceClassification\n",
"import torch\n",
"\n",
"model_id = \"pymlex/roberta-spanish-cefr\"\n",
"\n",
"tokenizer = AutoTokenizer.from_pretrained(model_id)\n",
"model = AutoModelForSequenceClassification.from_pretrained(model_id)\n",
"model.eval()\n",
"\n",
"def predict_cefr(text, top_k=3):\n",
" inputs = tokenizer(\n",
" text,\n",
" return_tensors=\"pt\",\n",
" truncation=True,\n",
" max_length=512,\n",
" )\n",
" with torch.no_grad():\n",
" logits = model(**inputs).logits\n",
" probs = torch.softmax(logits, dim=-1)[0]\n",
"\n",
" k = min(top_k, probs.numel())\n",
" values, indices = torch.topk(probs, k=k)\n",
"\n",
" return [\n",
" {\n",
" \"label\": model.config.id2label[i.item()],\n",
" \"score\": float(v.item()),\n",
" }\n",
" for i, v in zip(indices, values)\n",
" ]\n",
"\n",
"text = \"Estimados se\u00f1ores, les escribo para solicitar informaci\u00f3n sobre el curso.\"\n",
"print(predict_cefr(text, top_k=3))"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 318,
"referenced_widgets": [
"81146c5153fc4c599ffa4210f49315f9",
"30b7c08c82e642e68c324fa37d2273e1",
"c6df9d43f7f944e3a731aa794561928e",
"3eb95943e51849309a17ddca78155da8",
"0b0cd91951cc432f8cb3a3e5399914d8",
"fcb1dad83c224c068787027e8bcfd398",
"d9297a6d9f174cc99c0c407f5196d2ec",
"81fb07e5833548f695df1d4421253990",
"706c0a5d14e34471b28e2b98dcc9126f",
"cadf5dd05b614d5b962ea953ac9da959",
"c68665f850b74a2bb710d3de0ba92087",
"3f00dc74734a498ca37b21b5d514d576",
"d82869ad687a43eabb113ce699cbf369",
"814d90db9746490a825f092523c3a4b9",
"c9b0001778274587a251eddd7ecc342f",
"939f139ca1054dffa12b1d0a46e1aee4",
"4845ee644faf400b94c89ff9d036efd0",
"84aa6f541feb4a848b1ee256a793f56a",
"4a2b76e52f4046bc84da2fcafdba6bf1",
"41c4b4dbf9684298b13e25ad627713bf",
"44eff00a96c44e34bf5c8864b11c7dbf",
"8e8c0db7bc054c1f8aaccd331cbe742f",
"380e59a0af0044ee9cc6cb352270f2b5",
"ccd972537eff4c48ad7a69741a905d91",
"4b59346d2dfe488a974d1d5c8986be68",
"9a54680eb4b6453fb6fe09812ce3438d",
"e9ca9c53899441e393db33551a35e354",
"d7e32c7d91b94b2997b1c2e8ad5ee9a1",
"19809cbf199d423483b1608d87b9ac3d",
"a717856a82334c2c993cdada3f904de8",
"82e8ba74e4ce4ffc8d6e559c12733dc0",
"7973daaba8914086b9bc0d67181a8034",
"4f6da9c2fc924d83b41092b7bb5643a3",
"6f2f6435bc904bb294955df6db6f2d5b",
"b23cb1da8901414c8bee3a65bd352c41",
"3d33aaff6edc44ea9d5a4db026832f2b",
"edc3cb71239e4f7488eaa361ccf34243",
"9f39495c04434441b3137a9b36f038a9",
"c02c08a573c34adcbbc3d9fffea1b0e6",
"8df14bad8d9c4a409df3a57b6776cc50",
"5f87bb2c926941fba9dee6fad84dd0d1",
"771cdc1db79048ef8cff34bfa7783b0f",
"4f06b9da51ac4881a8626fac9f6525a8",
"00186b8e015041efbd04588b93d3ea1c",
"cd786a95965542309c2e06a30b1ecbc8",
"1fbf3b722a624c45857c6eb03cae065b",
"2790d0484be342a790239edd60eaa937",
"63b8697c268d4d38846bbcba1e9a7b0e",
"efd3f3f2b4cb4712a4f7125d45d5c721",
"fb49075f8b1d4ea3913ee44b3391ff5b",
"2aff4da8c86a4b9c8836579e00501ea6",
"583cc33276924a55bf059969fc19b2cb",
"e6969631cc954f79b2b8e5cd84546323",
"3c9ad6fc90624e1483150e1df7ec71fd",
"0b49180ffb1d4e41b6c2e3990cfd6507"
]
},
"id": "Xkw2MLNdZqct",
"outputId": "2cf27c73-5ec5-438e-b23c-6ea35188900a"
},
"id": "Xkw2MLNdZqct",
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"/usr/local/lib/python3.12/dist-packages/huggingface_hub/utils/_auth.py:94: UserWarning: \n",
"The secret `HF_TOKEN` does not exist in your Colab secrets.\n",
"To authenticate with the Hugging Face Hub, create a token in your settings tab (https://huggingface.co/settings/tokens), set it as secret in your Google Colab and restart your session.\n",
"You will be able to reuse this secret in all of your notebooks.\n",
"Please note that authentication is recommended but still optional to access public models or datasets.\n",
" warnings.warn(\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"config.json: 0.00B [00:00, ?B/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "81146c5153fc4c599ffa4210f49315f9"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"tokenizer_config.json: 0%| | 0.00/377 [00:00, ?B/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "3f00dc74734a498ca37b21b5d514d576"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"tokenizer.json: 0.00B [00:00, ?B/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "380e59a0af0044ee9cc6cb352270f2b5"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"model.safetensors: 0%| | 0.00/499M [00:00, ?B/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "6f2f6435bc904bb294955df6db6f2d5b"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Loading weights: 0%| | 0/201 [00:00, ?it/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "cd786a95965542309c2e06a30b1ecbc8"
}
},
"metadata": {}
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"[{'label': 'A1', 'score': 0.22886891663074493}, {'label': 'B1', 'score': 0.19498008489608765}, {'label': 'A2', 'score': 0.19106613099575043}]\n"
]
}
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.12"
},
"colab": {
"provenance": [],
"gpuType": "T4"
},
"accelerator": "GPU"
},
"nbformat": 4,
"nbformat_minor": 5
}