{ "cells": [ { "cell_type": "markdown", "id": "9aa453ff", "metadata": {}, "source": [ "e ** x = b" ] }, { "cell_type": "code", "execution_count": 3, "id": "ee6590f9", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import math" ] }, { "cell_type": "code", "execution_count": 4, "id": "a0481e20", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.6486586255873816\n", "5.199999999999999\n" ] } ], "source": [ "b = 5.2\n", "print(np.log(b))\n", "print(math.e ** 1.6486586255873816)" ] }, { "cell_type": "markdown", "id": "64590073", "metadata": {}, "source": [ "交叉熵损失函数" ] }, { "cell_type": "markdown", "id": "0a45646b", "metadata": {}, "source": [ "class: 3 \n", "label: 0 \n", "one-hot: [1, 0, 0] \n", "prediction: [0.7, 0.1, 0.2] \n", "$$L = -\\sum_jy_ilog(\\hat{y}) = -(1\\cdot\\log(0.7) + 0\\cdot\\log(0.1) + 0\\cdot\\log(0.2))$$" ] }, { "cell_type": "code", "execution_count": 5, "id": "bbf3bd0e", "metadata": {}, "outputs": [], "source": [ "softmax_output = [0.7, 0.1, 0.2]" ] }, { "cell_type": "code", "execution_count": 6, "id": "44c25853", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.35667494393873245\n" ] } ], "source": [ "target_output = [1, 0, 0]#独热编码\n", "loss = -(math.log(softmax_output[0]) * target_output[0] +\n", " math.log(softmax_output[1]) * target_output[1] +\n", " math.log(softmax_output[2]) * target_output[2])\n", "print(loss)" ] }, { "cell_type": "markdown", "id": "4a9cebb9", "metadata": {}, "source": [ "简化运算" ] }, { "cell_type": "code", "execution_count": 7, "id": "d07da7f4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.35667494393873245" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "loss = -(math.log(softmax_output[0]) * target_output[0])\n", "loss" ] }, { "cell_type": "markdown", "id": "00ca4e6a", "metadata": {}, "source": [ "多个数据" ] }, { "cell_type": "code", "execution_count": 10, "id": "3b3b7290", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.7 0.5 0.9]\n", "[0.7 0.5 0.9]\n" ] } ], "source": [ "softmax_outputs = np.array([[0.7, 0.1, 0.2],\n", " [0.1, 0.5, 0.4],\n", " [0.02, 0.9, 0.08]])\n", "class_targets = [0, 1, 1]\n", "print(softmax_outputs[[0, 1, 2],class_targets])\n", "print(softmax_outputs[range(len(softmax_outputs)),class_targets])" ] }, { "cell_type": "code", "execution_count": 11, "id": "e639666d", "metadata": {}, "outputs": [], "source": [ "neg_log = -np.log(softmax_outputs[range(len(softmax_outputs)),class_targets])" ] }, { "cell_type": "code", "execution_count": 12, "id": "636b4d4f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.35667494, 0.69314718, 0.10536052])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "neg_log" ] }, { "cell_type": "code", "execution_count": 13, "id": "ff5eee5d", "metadata": {}, "outputs": [], "source": [ "avg_loss = np.mean(neg_log)" ] }, { "cell_type": "code", "execution_count": 14, "id": "ab993d9f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.38506088005216804" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "avg_loss" ] }, { "cell_type": "markdown", "id": "2d026b79", "metadata": {}, "source": [ "考虑np.log(0)" ] }, { "cell_type": "code", "execution_count": 15, "id": "841620c0", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "D:\\envs\\stark-lin\\lib\\site-packages\\ipykernel_launcher.py:1: RuntimeWarning: divide by zero encountered in log\n", " \"\"\"Entry point for launching an IPython kernel.\n" ] }, { "data": { "text/plain": [ "-inf" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.log(0)" ] }, { "cell_type": "markdown", "id": "45c2d27e", "metadata": {}, "source": [ "对输出进行裁剪" ] }, { "cell_type": "code", "execution_count": 17, "id": "e7642073", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(16.11809565095832, 1.0000000494736474e-07)" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "-np.log(1e-7), -np.log(1-1e-7)" ] }, { "cell_type": "code", "execution_count": 21, "id": "7ace302a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "16.11809565095832" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred = 0\n", "y_pred_clip = np.clip(y_pred, 1e-7, 1-1e-7)\n", "-np.log(y_pred_clip)" ] }, { "cell_type": "code", "execution_count": null, "id": "a3083d8f", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.9" } }, "nbformat": 4, "nbformat_minor": 5 }