From 8c2c8c4f4762c02c73241f6be12beb0696057ebd Mon Sep 17 00:00:00 2001 From: Lyu Muyang <87132523+senngadaisuki@users.noreply.github.com> Date: Fri, 22 Nov 2024 00:33:14 +0800 Subject: [PATCH] ann tutorial (#37) * ann_training-zh quickstart * ann training quickstart * ann tutorial --------- Co-authored-by: LyuMuyang <11932083+lyumuyang@user.noreply.gitee.com> --- .../artificial-neural-network-tutorial1.png | Bin 0 -> 16131 bytes .../artificial-neural-network-tutorial2.png | Bin 0 -> 6136 bytes .../artificial-neural-network-tutorial3.png | Bin 0 -> 14555 bytes .../artificial-neural-network-tutorial4.png | Bin 0 -> 40601 bytes .../artificial-neural-network-tutorial5.jpg | Bin 0 -> 51750 bytes .../artificial_neural_networks-zh.ipynb | 504 +++++++++++++++++- 6 files changed, 497 insertions(+), 7 deletions(-) create mode 100644 docs/_static/artificial-neural-network-tutorial1.png create mode 100644 docs/_static/artificial-neural-network-tutorial2.png create mode 100644 docs/_static/artificial-neural-network-tutorial3.png create mode 100644 docs/_static/artificial-neural-network-tutorial4.png create mode 100644 docs/_static/artificial-neural-network-tutorial5.jpg diff --git a/docs/_static/artificial-neural-network-tutorial1.png b/docs/_static/artificial-neural-network-tutorial1.png new file mode 100644 index 0000000000000000000000000000000000000000..eccb7dc385ae2dc8dfd53f2b896a9fc4e586668c GIT binary patch literal 16131 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%0Dqs!6~O0k?|7}Q)7auU=KWATKW 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 literal 0 HcmV?d00001 diff --git a/docs/_static/artificial-neural-network-tutorial4.png b/docs/_static/artificial-neural-network-tutorial4.png new file mode 100644 index 0000000000000000000000000000000000000000..209903349c941670166ef1e4d7a3243f944de77b GIT binary patch literal 40601 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 literal 0 HcmV?d00001 diff --git a/docs/_static/artificial-neural-network-tutorial5.jpg b/docs/_static/artificial-neural-network-tutorial5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..659a33a0d6b17fd7f4bbcae47ce3ca3237b04b94 GIT binary patch literal 51750 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 XPL>;>|LvdqzvfT>fAlH7zi0jj1cs3C literal 0 HcmV?d00001 diff --git a/docs/tutorials/artificial_neural_networks-zh.ipynb b/docs/tutorials/artificial_neural_networks-zh.ipynb index d8e1e37..8a81b33 100644 --- a/docs/tutorials/artificial_neural_networks-zh.ipynb +++ b/docs/tutorials/artificial_neural_networks-zh.ipynb @@ -2,13 +2,503 @@ "cells": [ { "cell_type": "markdown", - "source": [ - "# 构建人工神经网络" - ], + "id": "cff08e5afff144b2", "metadata": { "collapsed": false }, - "id": "cff08e5afff144b2" + "source": [ + "# 构建人工神经网络" + ] + }, + { + "cell_type": "markdown", + "id": "1c216cfe", + "metadata": {}, + "source": [ + "人工神经网络(英语:artificial neural network,ANNs)又称类神经网络,简称神经网络(neural network,NNs),在机器学习和认知科学领域,是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。与人类大脑的神经元相互连接类似,人工神经网络在网络的各个层中也有神经元相互连接。\n", + "\n", + "相比于脉冲神经网络,人工神经网络中的神经元更为简化,不具有自身动力学。神经元之间传递的信息也不是0、1离散化的动作电位,而是连续的浮点数,可以被理解为在一个时间步内该神经元的发放率。虽然人工神经网络最初是受生物脑启发而来,也可以表现出一些生物脑的性质,但是我们主要使用它作为一种强大的模型解决具体问题,而不用纠结它各部分和生物的对应。\n", + "\n", + "
\n", + " \"bnn\"\n", + "
\n", + "
\n", + " \"ann\"\n", + "
\n", + "\n", + "## 人工神经网络架构\n", + "人工神经网络的神经元分布于不同的层,信息逐层前向传播。这些层可以分为3类:\n", + "- 输入层:人工神经网路的第一层是输入层,它接收输入并将其传递给隐藏层。\n", + "- 隐藏层:隐藏层对输入层传递来的信息进行各种计算和特征提取。通常,会有不止一个隐藏层,信息依次通过所有隐藏层进行计算。\n", + "- 输出层:最后,输出层接收隐藏层的信息进行计算,提供最终结果。\n", + "\n", + "
\n", + " \"ann2\"\n", + "
\n", + "\n", + "人工神经网络根据计算不同有很多种类的层,其中最简单的层为线性层。线性层接收输入后,会计算输入的加权和,再加上一个偏差值。用公式可以表示为:\n", + "$$\n", + "\\sum_{\\mathrm{i=1}}^{\\mathrm{n}}\\mathrm{W_i}*\\mathrm{X_i}+\\mathrm{b}。\\tag{1}\n", + "$$\n", + "这样的点积、求和都是线性运算。如果添加更多的层,但只使用线性操作,那么添加层将没有任何效果,通过交换律和结合律都可以等效为一层单一的线性变换。因此,需要通过添加非线性的**激活函数**,增加模型的表现力。可以理解为,通过激活函数判断神经元是否被激活,只有被激活神经元才有(非0)输出。这和生物神经元是类似的。激活函数类型多种多样,可以根据任务效果选用。在本教程的神经网络实现中,我们将使用ReLU(整流线性函数)和Softmax(归一化指数函数)激活函数,在下文中再详细叙述。\n", + "\n", + "## 人工神经网络的工作流\n", + "人工神经网络是数据驱动的统计模型。我们训练模型解决问题,不是明确地编写规则,而是提供训练数据,使模型学会解决问题的方法。\n", + "\n", + "具体而言,就是提供数据集,规定模型输入输出的对应关系,运行模型得到模型目前的输出,用**损失函数**计算当前输出和正确输出的差异。然后通过**反向传播**的方法,逐层对参数(主要是$W$和$b$)求偏导数,获得参数优化的大小和方向。然后用**优化器**进行参数优化,使模型的输出和数据集给出的标准输出更为相近。\n" + ] + }, + { + "cell_type": "markdown", + "id": "c7262143", + "metadata": {}, + "source": [ + "# 构建你的第一个人工神经网络\n", + "下面我们用`brainstate`,写代码构建一个三层的多层感知机(Multilayer Perceptron, MLP),来完成一个手写数字识别(MNIST)的任务,作为示例。\n", + "\n", + "我们将手写数字的图片输入构建好的多层感知机中,令多层感知机输出这张图片写的是哪一个数字。\n", + "\n", + "
\n", + " \"mnist\n", + "
\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "0825d40e", + "metadata": {}, + "outputs": [], + "source": [ + "import jax.numpy as jnp\n", + "import numpy as np\n", + "from datasets import load_dataset\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import brainstate as bst\n", + "from braintools.metric import softmax_cross_entropy_with_integer_labels" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "8bf694f8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'0.1.0'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bst.__version__" + ] + }, + { + "cell_type": "markdown", + "id": "d67a35ad", + "metadata": {}, + "source": [ + "## 数据集准备\n", + "首先准备数据集。数据集提供了许多组对应的“输入-输出”样本,在这个任务中就是,手写数字图片和对应数字是多少的标签。\n", + "\n", + "数据集可以分为训练集和测试集(二者的样本没有交集),在训练集上训练模型,调整模型的参数;在测试集上测试模型的训练效果,此时模型参数不更新。" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e37df3d9", + "metadata": {}, + "outputs": [], + "source": [ + "dataset = load_dataset('mnist')\n", + "X_train = np.array(np.stack(dataset['train']['image']), dtype=np.uint8)\n", + "X_test = np.array(np.stack(dataset['test']['image']), dtype=np.uint8)\n", + "X_train = (X_train > 0).astype(jnp.float32)\n", + "X_test = (X_test > 0).astype(jnp.float32)\n", + "Y_train = np.array(dataset['train']['label'], dtype=np.int32)\n", + "Y_test = np.array(dataset['test']['label'], dtype=np.int32)" + ] + }, + { + "cell_type": "markdown", + "id": "0cc63f9d", + "metadata": {}, + "source": [ + "MNIST训练集有60000个样本,测试集有10000个样本。每个样本输入就是$28 \\times 28$的单通道图像,输出是一位标签值。" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "d3150ef6", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5\n" + ] + }, + { + "data": { + "text/plain": [ + "((60000, 28, 28), (60000,), (10000, 28, 28), (10000,))" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plt.figure(figsize=(3, 3))\n", + "plt.imshow(X_train[0], cmap='gray')\n", + "plt.show()\n", + "print(Y_train[0])\n", + "X_train.shape, Y_train.shape, X_test.shape, Y_test.shape" + ] + }, + { + "cell_type": "markdown", + "id": "23747623", + "metadata": {}, + "source": [ + "为了方便训练,我们需要将数据集包装为`Dataset`类,统一进行一些处理。" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "5deb09a0", + "metadata": {}, + "outputs": [], + "source": [ + "class Dataset:\n", + " def __init__(self, X, Y, batch_size, shuffle=True):\n", + " self.X = X\n", + " self.Y = Y\n", + " self.batch_size = batch_size\n", + " self.shuffle = shuffle\n", + " self.indices = np.arange(len(X))\n", + " self.current_index = 0\n", + " if self.shuffle:\n", + " np.random.shuffle(self.indices)\n", + "\n", + " def __iter__(self):\n", + " self.current_index = 0\n", + " if self.shuffle:\n", + " np.random.shuffle(self.indices)\n", + " return self\n", + "\n", + " def __next__(self):\n", + " # Check if all samples have been processed\n", + " if self.current_index >= len(self.X):\n", + " raise StopIteration\n", + "\n", + " # Define the start and end of the current batch\n", + " start = self.current_index\n", + " end = start + self.batch_size\n", + " if end > len(self.X):\n", + " end = len(self.X)\n", + " \n", + " # Update current index\n", + " self.current_index = end\n", + "\n", + " # Select batch samples\n", + " batch_indices = self.indices[start:end]\n", + " batch_X = self.X[batch_indices]\n", + " batch_Y = self.Y[batch_indices]\n", + "\n", + " # Ensure batch has consistent shape\n", + " if batch_X.ndim == 1:\n", + " batch_X = np.expand_dims(batch_X, axis=0)\n", + "\n", + " return batch_X, batch_Y" + ] + }, + { + "cell_type": "markdown", + "id": "9c426971", + "metadata": {}, + "source": [ + "在训练时,我们一般会将数据划分为批(batch),输入模型。模型根据一个批次的所有样本计算损失,进行梯度回传优化参数。\n", + "\n", + "因为如果将整个训练集输入模型,会需要过大的显存;如果只将一个训练样本输入模型训练,并行化不够会导致资源浪费、遍历完一个训练集用时过长,也会导致每次参数更新只包含一个样本点的信息,不利于在整个数据集上收敛。以批的形式输入是很好的权衡。测试集由于不需要更新参数,所以可以在显存允许的情况下,批的大小可以设置地更大一些。\n", + "\n", + "训练集一般打乱顺序(`shuffle=True`),这样能尽量保证每次迭代训练集,每个批都有不同的样本组合,有利于模型在整个数据集上收敛。训练集不需要更新参数所以不用打乱。" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "8a44b4d2", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize training and testing datasets\n", + "batch_size = 32\n", + "train_dataset = Dataset(X_train, Y_train, batch_size, shuffle=True)\n", + "test_dataset = Dataset(X_test, Y_test, batch_size, shuffle=False)" + ] + }, + { + "cell_type": "markdown", + "id": "54a36298", + "metadata": {}, + "source": [ + "## 模型结构设置\n", + "\n", + "经典的多层感知机具有3个线性层,一个输入层,一个隐藏层,和一个输出层。\n", + "\n", + "在定义每个线性层时,需要给出这一层的输入维数和输出维数。(这是非常好理解的,由公式(1),需要提供$W$的大小)\n", + "\n", + "- 线性层只接受一维输入,因此我们要使用`flatten()`函数将二维图片展为一维。在这里,$28*28=784$就是第一个线性层输入的大小。\n", + "- 手写数字识别是十分类任务,对于多分类任务,一般要求模型的输出是一个十维的向量,每一维表示是这一维对应标签的概率是多少。因此,最后一个线性层的输出维是$10$。\n", + "- 隐层在自动提取特征,维数越多,提取的特征越多,表现力越强大。在这个简单的任务中,可以将隐藏层的维数设置为$784$和$10$之间的一个数,如果效果不好,就增加隐藏层维数。在其他更困难的任务中,可以增加隐藏层层数,并且使隐藏层维数超过模型输入和输出维。但一般隐藏层的维数要逐层增加,再逐层下降。\n", + "- 注意,相邻的层,上一层的输出维数,就是下一层的输入维数。\n", + "\n", + "
\n", + " \"mnist\n", + "
\n", + "\n", + "如前文所说,线性层之间需要加入激活函数,否则就相当于一个线性层。在这里,我们使用了ReLU(整流线性函数)激活函数将负值置为0,增加非线性。公式为:\n", + "$$\n", + "\\text{ReLU}(x) = \\max(0, x)\\tag{2}\n", + "$$\n", + "\n", + "
\n", + " \"relu\"\n", + "
\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "331a3ca7", + "metadata": {}, + "outputs": [], + "source": [ + "# Define MLP model\n", + "class MLP(bst.nn.Module):\n", + " def __init__(self, din, dhidden, dout):\n", + " super().__init__()\n", + " self.linear1 = bst.nn.Linear(din, dhidden) # Define the first linear layer, input dimension is din, output dimension is dhidden \n", + " self.linear2 = bst.nn.Linear(dhidden, dhidden) # Define the second linear layer, input dimension is dhidden, output dimension is dhidden\n", + " self.linear3 = bst.nn.Linear(dhidden, dout) # Define the third linear layer, input dimension is dhidden, output dimension is dout (10 classes for MNIST)\n", + " self.flatten = bst.nn.Flatten(start_axis=1) # Flatten images to 1D\n", + " self.relu = bst.nn.ReLU() # ReLU activation function\n", + "\n", + " def __call__(self, x):\n", + " x = self.flatten(x) # Flatten the input image from 2D to 1D\n", + " x = self.linear1(x) # Pass the flattened input through the first linear layer\n", + " x = self.relu(x) # Alternatively, you can use jax's ReLU function: x = jax.nn.relu(x)\n", + " x = self.linear2(x) # Pass the result through the second linear layer\n", + " x = self.relu(x) # Apply the ReLU activation function\n", + " x = self.linear3(x) # Pass the result through the third linear layer to get the final output\n", + "\n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "347dc916", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize model with input, hidden, and output layer sizes\n", + "model = MLP(din=28*28, dhidden=512, dout=10)" + ] + }, + { + "cell_type": "markdown", + "id": "b9c94f0e", + "metadata": {}, + "source": [ + "## 模型优化\n", + "\n", + "人工神经网络得到图片输入后,运行输出分类结果。我们需要将这个分类结果和标准答案进行对比,然后优化参数,让模型预测的类别概率尽可能接近真实类别。\n", + "\n", + "### 损失函数\n", + "\n", + "在这个过程中,用**损失函数**衡量分类结果和真实类别差异的大小。针对输出的不同含义,有多种多样的损失函数可以选择。这里我们使用多分类任务的常用损失函数交叉熵(cross entropy)函数。对于一个样本,交叉熵损失函数公式如下:\n", + "\n", + "$$\n", + "Loss(y_i, \\hat{y_i}) = - \\sum_{i=1}^{N} y_i \\log(\\hat{y_i})\\tag{3}\n", + "$$\n", + "\n", + "其中,$\\hat{y_i}$ 是模型预测的概率分布(所有类别的概率和为1),$y_i$ 是真实类别标签,使用 One-Hot 编码(只有正确类别对应的值为 1,其余为 0),$N$ 是类别的数量。如果模型正确预测(真实类别的概率接近 1),损失会非常小;反之,真实类别的概率接近 0 时,损失会非常大。\n", + "\n", + "在此,我们给损失函数的输入模型输出值并不是概率值(没有控制所有类别的概率和为1),是因为`braintools.metric`中的损失函数`softmax_cross_entropy_with_integer_labels`会自动让模型的输出经过softmax(归一化指数函数)激活函数,将其转换为概率分布。公式如下:\n", + "\n", + "$$\n", + "\\sigma(\\mathbf{z})_i = \\frac{e^{z_i}}{\\sum_{j=1}^{K} e^{z_j}}\\tag{4}\n", + "$$\n", + "\n", + "其中,$\\mathbf{z}$ 是输入向量,$z_i$ 是输入向量中的第 $i$ 个元素,$K$ 是输入向量的维度。\n", + "\n", + "同时,`softmax_cross_entropy_with_integer_labels`也可以将一维真实类别标签自动转为One-Hot 编码。\n", + "\n", + "### 反向传播算法\n", + "\n", + "**反向传播**(Backpropagation) 是神经网络训练过程中优化参数的关键算法。它的主要任务是根据损失函数的值,计算出模型中每个参数(主要是权重$W$和偏置$b$)的梯度。用这种方法推测模型预测的误差来源,用于优化参数。得到损失值后,反向传播利用链式法则,逐层计算损失函数对每个参数的偏导数。这些偏导数(梯度)描述了损失函数随着参数变化的方向和幅度,是优化的基础。\n", + "\n", + "### 优化器\n", + "**优化器**(Optimizer) 是一种算法,决定得到梯度后,如何用其更新网络的参数(主要是权重和偏置),减少损失值。基本的更新公式是:\n", + "$$\n", + "w=w-\\eta\\cdot\\frac{\\partial L}{\\partial w}\\tag{5}\n", + "$$\n", + "其中$w$是参数,$\\eta$是学习率,$\\frac\\partial L{\\partial w}$是梯度。\n", + "\n", + "有很多种类的优化器可供选择,在此我们选用的是常用的SGD(随机梯度下降)优化器。\n", + "\n", + "在这里我们将模型的优化器实例化,并指定其更新的参数是哪些。" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "375b3e54", + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize optimizer and register model parameters\n", + "optimizer = bst.optim.SGD(lr = 1e-3) # Initialize SGD optimizer with learning rate\n", + "optimizer.register_trainable_weights(model.states(bst.ParamState)) # Register parameters for optimization" + ] + }, + { + "cell_type": "markdown", + "id": "d5ecc46c", + "metadata": {}, + "source": [ + "## 模型训练&测试\n", + "在每一个训练数据批的迭代中,都有这样的训练流程:\n", + "- 将数据输入模型,得到输出\n", + "- 计算损失值\n", + "- 计算梯度\n", + "- 将梯度提供给优化器,优化器优化参数" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "68c121df", + "metadata": {}, + "outputs": [], + "source": [ + "# Training step function\n", + "@bst.compile.jit\n", + "def train_step(batch):\n", + " x, y = batch\n", + " # Define loss function\n", + " def loss_fn():\n", + " return softmax_cross_entropy_with_integer_labels(model(x), y).mean()\n", + " \n", + " # Compute gradients of the loss with respect to model parameters\n", + " grads = bst.augment.grad(loss_fn, model.states(bst.ParamState))()\n", + " optimizer.update(grads) # Update parameters using optimizer" + ] + }, + { + "cell_type": "markdown", + "id": "0fe15316", + "metadata": {}, + "source": [ + "在每一个测试数据批的迭代中,测试流程无需计算梯度和优化参数,但可以选择计算正确率反映训练的效果:\n", + "- 将数据输入模型,得到输出\n", + "- 计算损失值\n", + "- 计算正确率" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "9a4df640", + "metadata": {}, + "outputs": [], + "source": [ + "# Testing step function\n", + "@bst.compile.jit\n", + "def test_step(batch):\n", + " x, y = batch\n", + " y_pred = model(x) # Perform forward pass\n", + " loss = softmax_cross_entropy_with_integer_labels(y_pred, y).mean() # Compute loss\n", + " correct = (y_pred.argmax(1) == y).sum() # Count correct predictions\n", + "\n", + " return {'loss': loss, 'correct': correct}" + ] + }, + { + "cell_type": "markdown", + "id": "a0a91dfa", + "metadata": {}, + "source": [ + "模型一般在同一个训练集上训练多次,每一次都分批迭代完整个训练集;可以每次或每几次在测试集上查看训练效果。\n", + "\n", + "在下面这个例子中,随着训练集迭代次数的增加,训练损失值逐渐减小,测试正确率逐渐提高,说明我们成功地训练了一个多层感知机进行手写数字分类。" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "9964de29", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 0, test loss: 1.2870731353759766, test accuracy: 0.8459000587463379\n", + "epoch: 1, test loss: 0.8965848088264465, test accuracy: 0.8851000666618347\n", + "epoch: 2, test loss: 0.7595921754837036, test accuracy: 0.8992000222206116\n", + "epoch: 3, test loss: 0.6877797842025757, test accuracy: 0.9066000580787659\n", + "epoch: 4, test loss: 0.6413018703460693, test accuracy: 0.9117000699043274\n", + "epoch: 5, test loss: 0.6088062524795532, test accuracy: 0.914400041103363\n", + "epoch: 6, test loss: 0.5789325833320618, test accuracy: 0.9187000393867493\n", + "epoch: 7, test loss: 0.5573971271514893, test accuracy: 0.921000063419342\n", + "epoch: 8, test loss: 0.5350563526153564, test accuracy: 0.9230000376701355\n", + "epoch: 9, test loss: 0.5217731595039368, test accuracy: 0.9251000285148621\n" + ] + } + ], + "source": [ + "# Execute training and testing\n", + "total_steps = 20\n", + "for epoch in range(10):\n", + " for step, batch in enumerate(train_dataset):\n", + " train_step(batch) # Perform training step for each batch\n", + "\n", + " # Calculate test loss and accuracy\n", + " test_loss, correct = 0, 0\n", + " for step_, test_ in enumerate(test_dataset):\n", + " logs = test_step(test_)\n", + " test_loss += logs['loss']\n", + " correct += logs['correct']\n", + " test_loss += logs['loss']\n", + " test_loss = test_loss / (step_ + 1)\n", + " test_accuracy = correct / len(X_test)\n", + " print(f\"epoch: {epoch}, test loss: {test_loss}, test accuracy: {test_accuracy}\")" + ] } ], "metadata": { @@ -20,14 +510,14 @@ "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" + "pygments_lexer": "ipython3", + "version": "3.11.10" } }, "nbformat": 4,