{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import torch\n", "import torch.nn.functional as F\n", "from sklearn.datasets import make_moons\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "torch.manual_seed(1024)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "# 定义线性模型和Sigmoid函数\n", "\n", "class Linear:\n", " \n", " def __init__(self, in_features, out_features, bias=True):\n", " '''\n", " 模型参数初始化\n", " 需要注意的是,此次故意没做参数初始化的优化\n", " '''\n", " self.weight = torch.randn((in_features, out_features), requires_grad=True) # (in_features, out_features)\n", " self.bias = torch.randn(out_features, requires_grad=True) if bias else None # ( out_features)\n", " \n", " def __call__(self, x):\n", " # x: (B, in_features)\n", " # self.weight: (in_features, out_features)\n", " self.out = x @ self.weight # (B, out_features)\n", " if self.bias is not None:\n", " self.out += self.bias\n", " return self.out\n", " \n", " def parameters(self):\n", " '''\n", " 返回线性模型的参数,主要用于参数迭代更新\n", " 由于PyTorch的计算单元就是张量,\n", " 所以此次只需将不同参数简单合并成列表即可\n", " '''\n", " if self.bias is not None:\n", " return [self.weight, self.bias]\n", " return [self.weight]\n", "\n", "\n", "class Sigmoid:\n", " \n", " def __call__(self, x):\n", " self.out = torch.sigmoid(x)\n", " return self.out\n", " \n", " def parameters(self):\n", " '''\n", " Sigmoid函数没有模型参数\n", " '''\n", " return []" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "class Sequential:\n", " \n", " def __init__(self, layers):\n", " # layers表示的模型组件,比如线性模型,比如sigmoid\n", " self.layers = layers\n", " \n", " def __call__(self, x):\n", " for l in self.layers:\n", " x = l(x)\n", " self.out = x\n", " return self.out\n", " \n", " def parameters(self):\n", " # k = []\n", " # for layer in self.layers:\n", " # for p in layer.parameters():\n", " # k.append(p)\n", " return [p for layer in self.layers for p in layer.parameters()]\n", " \n", " def predict_proba(self, x):\n", " # 计算概率预测\n", " if isinstance(x, np.ndarray):\n", " x = torch.tensor(x).float()\n", " logits = self(x)\n", " self.prob = F.softmax(logits, dim=-1).detach().numpy()\n", " return self.prob" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([[-0.5756, 0.0729],\n", " [-0.5902, 0.0307],\n", " [-0.5812, 0.0562]])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# x: (B, 2)\n", "# mlp: [4, 4, 2]\n", "model = Sequential([\n", " Linear(2, 4), Sigmoid(), # (B, 4)\n", " Linear(4, 4), Sigmoid(), # (B, 4)\n", " Linear(4, 2)\n", "])\n", "x = torch.randn(3, 2)\n", "model(x)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.34332383, 0.6566762 ],\n", " [0.34957516, 0.6504248 ],\n", " [0.34582347, 0.65417653]], dtype=float32)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.predict_proba(x)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def draw_data(data):\n", " '''\n", " 将数据可视化\n", " '''\n", " fig = plt.figure(figsize=(5, 5))\n", " ax = fig.add_subplot(1, 1, 1)\n", " x, y = data\n", " label1 = x[y > 0]\n", " ax.scatter(label1[:, 0], label1[:, 1], marker='o')\n", " label0 = x[y == 0]\n", " ax.scatter(label0[:, 0], label0[:, 1], marker='^', color='k')\n", " return ax\n", "\n", "def draw_model(ax, model):\n", " '''\n", " 将模型的分离超平面可视化\n", " '''\n", " x1 = np.linspace(ax.get_xlim()[0], ax.get_xlim()[1], 100)\n", " x2 = np.linspace(ax.get_ylim()[0], ax.get_ylim()[1], 100)\n", " x1, x2 = np.meshgrid(x1, x2)\n", " y = model.predict_proba(np.c_[x1.ravel(), x2.ravel()])[:, 1]\n", " y = y.reshape(x1.shape)\n", " ax.contourf(x1, x2, y, levels=[0, 0.5], colors=['gray'], alpha=0.4)\n", " return ax" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "data = make_moons(200, noise=0.05)\n", "draw_data(data)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "batch_size = 20\n", "max_steps = 40000\n", "x, y = torch.tensor(data[0]).float(), torch.tensor(data[1])\n", "learning_rate = 0.1\n", "model = Sequential([\n", " Linear(2, 4), Sigmoid(), # (B, 4)\n", " Linear(4, 4), Sigmoid(), # (B, 4)\n", " Linear(4, 2)\n", "])\n", "lossi = []\n", "\n", "for t in range(max_steps):\n", " ix = (t * batch_size) % len(x)\n", " xx = x[ix: ix + batch_size]\n", " yy = y[ix: ix + batch_size]\n", " logits = model(xx)\n", " loss = F.cross_entropy(logits, yy)\n", " loss.backward()\n", " with torch.no_grad():\n", " for p in model.parameters():\n", " p -= learning_rate * p.grad\n", " p.grad = None\n", " lossi.append(loss.item())" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "ax = draw_data(data)\n", "draw_model(ax, model)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(lossi)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([1.5000, 3.5000, 5.5000, 7.5000, 9.5000])" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "torch.linspace(1, 10, 10).view(-1, 2).mean(dim=-1)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(torch.tensor(lossi).view(-1, 100).mean(dim=-1))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.8.5" } }, "nbformat": 4, "nbformat_minor": 4 }