diff --git a/.ipynb_checkpoints/keras-checkpoint.ipynb b/.ipynb_checkpoints/keras-checkpoint.ipynb new file mode 100644 index 0000000..fa0b602 --- /dev/null +++ b/.ipynb_checkpoints/keras-checkpoint.ipynb @@ -0,0 +1,199 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Keras Tutorial" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Keras is a popular deep learning framework and it's easy to get started." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import keras\n", + "from keras.datasets import mnist\n", + "from keras.models import Sequential\n", + "from keras.layers import Dense,Activation, Dropout, Flatten, Conv2D, MaxPooling2D\n", + "\n", + "BATCH_SIZE = 128\n", + "NUM_CLASSES = 10\n", + "NUM_EPOCHS = 10\n", + "nb_filters = 32\n", + "pool_size = (2,2)\n", + "kernel_size = (3,3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, we read the mnist data and preprocess them." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# download and load the data (split them between train and test sets)\n", + "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n", + "\n", + "# expand the channel dimension\n", + "x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)\n", + "x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)\n", + "input_shape = (28, 28, 1)\n", + "\n", + "# make the value of pixels from [0, 255] to [0, 1] for further process\n", + "x_train = x_train.astype('float32') / 255.\n", + "x_test = x_test.astype('float32') / 255.\n", + "\n", + "# convert class vectors to binary class matrics\n", + "y_train = keras.utils.to_categorical(y_train, NUM_CLASSES)\n", + "y_test = keras.utils.to_categorical(y_test, NUM_CLASSES)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Then, we define the model, object function and optimizer that we use to classify." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(60000, 28, 28, 1) (60000, 10) (10000, 28, 28, 1) (10000, 10)\n", + "WARNING:tensorflow:From /home/luna/.local/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py:4070: The name tf.nn.max_pool is deprecated. Please use tf.nn.max_pool2d instead.\n", + "\n" + ] + } + ], + "source": [ + "print(x_train.shape,y_train.shape,x_test.shape,y_test.shape)\n", + "\n", + "# define the model\n", + "model = Sequential()\n", + "model.add(Conv2D(nb_filters,kernel_size,input_shape=input_shape,padding='valid')) \n", + "model.add(Activation('relu'))\n", + "model.add(Conv2D(nb_filters,kernel_size))\n", + "model.add(Activation('relu'))\n", + "model.add(MaxPooling2D(pool_size=pool_size))\n", + "model.add(Dropout(0.25))\n", + "model.add(Flatten())\n", + "model.add(Dense(128))\n", + "model.add(Activation('relu'))\n", + "model.add(Dropout(0.5))\n", + "model.add(Dense(NUM_CLASSES))\n", + "model.add(Activation('softmax'))\n", + "\n", + "# define the object function, optimizer and metrics\n", + "model.compile(loss = 'categorical_crossentropy',optimizer='adadelta',metrics=['accuracy'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we can start to train and evaluate!" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:From /home/luna/.local/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py:422: The name tf.global_variables is deprecated. Please use tf.compat.v1.global_variables instead.\n", + "\n", + "Train on 60000 samples, validate on 10000 samples\n", + "Epoch 1/10\n", + "60000/60000 [==============================] - 87s 1ms/step - loss: 0.2938 - accuracy: 0.9104 - val_loss: 0.0648 - val_accuracy: 0.9800\n", + "Epoch 2/10\n", + "60000/60000 [==============================] - 82s 1ms/step - loss: 0.1007 - accuracy: 0.9706 - val_loss: 0.0467 - val_accuracy: 0.9842\n", + "Epoch 3/10\n", + "60000/60000 [==============================] - 80s 1ms/step - loss: 0.0759 - accuracy: 0.9767 - val_loss: 0.0386 - val_accuracy: 0.9872\n", + "Epoch 4/10\n", + "60000/60000 [==============================] - 88s 1ms/step - loss: 0.0639 - accuracy: 0.9814 - val_loss: 0.0373 - val_accuracy: 0.9880\n", + "Epoch 5/10\n", + "60000/60000 [==============================] - 85s 1ms/step - loss: 0.0557 - accuracy: 0.9837 - val_loss: 0.0313 - val_accuracy: 0.9891\n", + "Epoch 6/10\n", + "60000/60000 [==============================] - 85s 1ms/step - loss: 0.0502 - accuracy: 0.9847 - val_loss: 0.0330 - val_accuracy: 0.9896\n", + "Epoch 7/10\n", + "60000/60000 [==============================] - 84s 1ms/step - loss: 0.0481 - accuracy: 0.9857 - val_loss: 0.0303 - val_accuracy: 0.9900\n", + "Epoch 8/10\n", + "60000/60000 [==============================] - 82s 1ms/step - loss: 0.0434 - accuracy: 0.9870 - val_loss: 0.0304 - val_accuracy: 0.9906\n", + "Epoch 9/10\n", + "60000/60000 [==============================] - 82s 1ms/step - loss: 0.0391 - accuracy: 0.9881 - val_loss: 0.0271 - val_accuracy: 0.9909\n", + "Epoch 10/10\n", + "60000/60000 [==============================] - 82s 1ms/step - loss: 0.0366 - accuracy: 0.9888 - val_loss: 0.0311 - val_accuracy: 0.9901\n", + "60000/60000 [==============================] - 17s 288us/step\n", + "Training loss: 0.0156, Training accuracy: 99.50%\n", + "10000/10000 [==============================] - 3s 285us/step\n", + "Testing loss: 0.0311, Testing accuracy: 99.01%\n" + ] + } + ], + "source": [ + "# train\n", + "model.fit(x_train,y_train,batch_size=BATCH_SIZE,epochs=NUM_EPOCHS,validation_data=(x_test,y_test))\n", + "\n", + "# evaluate\n", + "score_train,acc_train = model.evaluate(x_train,y_train,batch_size=BATCH_SIZE)\n", + "print('Training loss: %.4f, Training accuracy: %.2f%%' % (score_train,acc_train*100))\n", + "score_test,acc_test = model.evaluate(x_test,y_test,batch_size=BATCH_SIZE)\n", + "print('Testing loss: %.4f, Testing accuracy: %.2f%%' % (score_test,acc_test*100))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Q6:\n", + "Please print the training and testing accuracy." + ] + } + ], + "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.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/.ipynb_checkpoints/numpy_matplotlib_sklearn-checkpoint.ipynb b/.ipynb_checkpoints/numpy_matplotlib_sklearn-checkpoint.ipynb new file mode 100644 index 0000000..a4b34e2 --- /dev/null +++ b/.ipynb_checkpoints/numpy_matplotlib_sklearn-checkpoint.ipynb @@ -0,0 +1,435 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Numpy, Matplotlib and Sklearn Tutorial" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We often use numpy to handle high dimensional arrays.\n", + "\n", + "Let's try the basic operation of numpy:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2 (2, 3) 6 int64 \n" + ] + } + ], + "source": [ + "import numpy as np\n", + "\n", + "a = np.array([[1,2,3], [2,3,4]])\n", + "print(a.ndim, a.shape, a.size, a.dtype, type(a))\n", + "\n", + "b = np.zeros((3,4))\n", + "c = np.ones((3,4))\n", + "d = np.random.randn(2,3)\n", + "e = np.array([[1,2], [2,3], [3,4]])\n", + "f = b*2 - c*3\n", + "g = 2*c*f\n", + "h = np.dot(a,e)\n", + "i = d.mean()\n", + "j = d.max(axis=1)\n", + "k = a[-1][:2]\n", + "\n", + "# You can print from a to k for details" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "matplotlib.pyplot provides very useful apis for drawing graphs.\n", + "\n", + "Let's try the basic operation of matplotlib.pyplot:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAD8CAYAAABuHP8oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3deZzN5f//8cdrNvu+ZB1ESGQby1gnCi3oI0kbRWmzhH4qLdpUWpQoRVnKkpJQH4lowtdYBpPKNrIvY99GZr9+f1zDR8yYceaceZ9z5nW/3dxmnDnnvF9Tt3m65vW+FjHGoJRSyvcEOF2AUkop12iAK6WUj9IAV0opH6UBrpRSPkoDXCmlfJQGuFJK+agsA1xEJonIYRH585LHB4jIFhH5S0Te8VyJSimlMpKdEfgUoNPFD4jITUBXoL4x5gbgPfeXppRS6kqyDHBjzDLg+CUPPwG8bYxJTH/OYQ/UppRS6gqCXHxdTaC1iIwEEoBnjDFrs3pR6dKlTdWqVV28pFJK5U3r1q07aowpc+njrgZ4EFASaA40Ab4RkWtNBuvyRaQf0A8gNDSU6OhoFy+plFJ5k4jszuhxV2eh7APmGGsNkAaUzuiJxpgJxpgwY0xYmTKX/QOilFLKRa4G+FzgJgARqQmEAEfdVZRSSqmsZdlCEZGZQARQWkT2ASOAScCk9KmFSUDvjNonSimlPCfLADfG3JvJlx5wcy1KKaWugq7EVEopH6UBrpRSPkoDXCmlfJQGuFJKedKZMzBoEJw65fa31gBXSilP2bMHWrWCjz+G5cvd/vaursRUSil1JWvXQufOcO4c/PQT3HKL2y+hI3CllHK32bOhbVsoUACiojwS3qABrpRS7mMMvPUW3H03NGgAq1dDnToeu5y2UJRSyh2SkuCxx2DKFLj3Xpg0CfLn9+gldQSulFI5dewYdOhgw3vECJg+3ePhDToCV0qpnNm2De64A3bvhmnT4P77c+3SGuBKKeWqpUuhe3cIDIQlS+yUwVykLRSllHLFhAnQsSOUL29vVuZyeIMGuFJKXZ3UVBgyxN6wvPlmWLkSrr3WkVK0haKUUtl15oydYfLf/8LAgfD++xDkXIxqgCulVHbs3m1XVm7aBJ98Ak884XRFGuBKKZWlqCi4805ITPTYsnhXaA9cKaWuZNo0iIiAIkVg1SqvCW/QAFdKqYylpcHzz8ODD0KLFnamSe3aTlf1L9pCUUqpS8XHwwMPwLx50K8fjBsHwcFOV3WZLEfgIjJJRA6nn0B/6deGiogRkdKeKU8ppXLZ7t3QsiX88AOMGQOffuqV4Q3Za6FMATpd+qCIVAY6AHvcXJNSSjlj5Upo2tSG+E8/2amCIk5XlaksA9wYsww4nsGXPgCGAcbdRSmlVK778ku46SYoWtTerOzQwemKsuTSTUwR6QrsN8b8no3n9hORaBGJPnLkiCuXU0opz0lNheeeg9697XJ4L7xZmZmrDnARKQgMB17OzvONMROMMWHGmLAyZcpc7eWUUspzTp+Grl1h1Ch4/HFYuBBKlnS6qmxzZRZKdaAa8LvY3lAlYL2INDXGxLmzOKWU8pjt26FLF4iN9ZqVlVfrqgPcGPMHUPb830VkFxBmjDnqxrqUUspzliyxx56JwKJFtvftg7IzjXAmEAXUEpF9ItLX82UppZQHGGPndHfsCBUq2JPjfTS8IRsjcGPMvVl8varbqlFKKU9JSoIBA+w+3p072yXyRYs6XVWO6FJ6pZT/O3LE7mEyYYJdHj93rs+HN+hSeqWUv/v9dzvT5NAhe9jwffc5XZHb6AhcKeW/vv3WbkSVkgLLl/tVeIMGuFLKH6WlwUsvQY8eUL8+REdDWJjTVbmdtlCUUv7l9Gm7Bez8+dC3L3z8MeTL53RVHqEBrpTyH9u323731q0wdiw89ZRXb0aVUxrgSin/sHgx3HPP/xbntGvndEUepz1wpZRvMwZGj4ZOnaBSJbs4Jw+EN2iAK6V82blztt89dKg9dHjlSrj2WqeryjUa4Eop37Rnj93+dcYMeOMNmD0bChd2uqpcpT1wpZTv+e03uxlVYqKdbXLHHU5X5AgdgSulfMf5zahuvtnu271mTZ4Nb9AAV0r5ioQEO697wAC49VZ7ck6tWk5X5SgNcKWU99u3D9q2hcmT4eWX7WZUxYo5XZXjtAeulPJuy5bZfvc//8B330G3bk5X5DV0BK6U8k7G2NWU7dtD8eK2ZaLh/S8a4Eop73PuHDz0EAwcaPvda9ZAnTpOV+V1NMCVUt5l9247v/vLL+GVV7TffQXaA1dKeY+lS+0WsMnJdn53585OV+TVsnOo8SQROSwif1702LsiskVENorI9yJS3LNlKqX8mjHw/vv22LOyZe1+JhreWcpOC2UK0OmSxxYDdY0xNwLbgOfdXJdSKq+Ij4eePeGZZ+x+JqtXQ82aTlflE7IMcGPMMuD4JY8tMsakpP91FVDJA7Uppfzdtm3QrJndx+Ttt+3HIkWcrspnuKMH3geY5Yb3UUrlJfPmQa9eEBwMP/9sl8erq5KjWSgi8gKQAky/wnP6iUi0iEQfOXIkJ5dTSvmD1FR48UXbLqlZE9av1/B2kcsBLiIPAXcA9xtjTGbPM8ZMMMaEGWPCypQp4+rllFL+4NgxuP12GDnS7muyfDmEhjpdlc9yqYUiIp2AYUBbY8w/7i1JKeWX1q+Hu+6CAwdgwgR49FGnK/J52ZlGOBOIAmqJyD4R6QuMA4oAi0UkRkQ+9XCdSilfNmkStGgBKSl21K3h7RZZjsCNMfdm8PAXHqhFKeVvEhLs9q+ff2773DNmgLZS3UaX0iulPGPnTmjZ0ob38OGwcKGGt5vpUnqllPv99BPcfz+kpdnpgl26OF2RX9IRuFLKfdLS7AZUt99uZ5esW5enw3vWn7MYsGAA3/71rUfeX0fgSin3OHYMHnjAtkp694ZPPoGCBZ2uyuOO/XOMmLgY++dQDKcSTjH/3vkATPl9Civ2rOCawtd45Noa4EqpnFuzxp6aExcHn34K/fqBiNNVuZUxhn2n9xETF8MdNe9ARBjy8xA+WPXBhedUKlqJRuUbkWbSCJAAZt41k6L5ihIgnml2aIArpVxnDIwfD08/DRUqwIoV0KSJ01W5ze9xvzPjjxmsj1vPhoMbOHbuGAA7Bu6gWolqdKzekfKFy9OwfEMalGtA6YKl//X64vk9u1GrBrhSyjXx8XakPXMm3HYbfPUVlCzpdFVXLTUtla3HtrL+4HrWHVjH+rj1vHvLuzSt2JTY47F8uPpD6paty52176RhuYY0Kt+ICkUqANCxRkc61ujoWO0a4Eqpq7dpE3TvDlu32mXxzz0HAd4/J+J8WBcOKUxosVB+j/udlpNacjb5LAAFggpQv1x9/km2C8w71+zMmefPEBIY4mTZmdIAV0pdnRkz7ErKwoVh8WJo187pijKVnJrMrL9mEX0gmugD0cTExXA2+SwvtH6BN9q9QfWS1enbsC+NKzSmUflG1C5dm6CA/8VivqB8DlafNbnCPlRuFxYWZqKjo3PtekopN0pMhCFD7OySVq3g66+hYkWnqwLsDcZdJ3ex9sBaog9EU65wOYaEDyHNpFFiVAlS0lJoUK4BYeXDaFyhMa1DW1OtRDWny842EVlnjAm79HEdgSulsrZzp51lsm4dDB0Kb71l9/F2yJnEMxTJZw9+eOyHx/hu83cXbjCGBIbQ44YeAARIADGPxVC5WOV/jaz9hf99R0op95o3z87rBvj+e7uPdy6KT4pn3YF1rN6/mjX717D2wFqSUpM4MOQAIkKpgqXoWqsrTSo2oUmFJtS7pt6/eta+NNK+WhrgSqmMJSfbm5OjR0PjxvDNN3DttR69ZGpaKpuObGLN/jX0qt+L4MBgXlz6ImNWjwGgWvFqhFcKp2nFpqSaVIIkiDfbv+nRmryZBrhS6nJ798I990BUFDz1lD0xPp9nbuhtPbqVKTFTWLV/FWv3r70wI6RBuQY0rtCYPg370KF6B5pUaEKZQroZ1sU0wJVS//bTT/Dgg5CUZG9U3nOPW942KTWJmLgYVu1bxap9q3g87HHaVGnD3tN7eS/qPRqUa8BDDR6iWcVmNKvUjOtKXgfAjdfcyI3X3OiWGvyNBrhSykpJgREj4M034cYb4dtv7ZmVrr5dWgpBAUEcij9E92+7s3b/WhJTEwG75Lxrra4AtK3SltPPnaZAcAG3fBt5iQa4Ugr27YP77rOn5fTtC2PHQoHsB2pqWiobD21k5d6VrNy3kqi9Udx23W2Mu20cpQqWIjggmKeaPEV45XCaV2pOpaKVLrw2ODCY4EDnZrT4Mg1wpfK68y2ThAS7HP6BB7J8yenE0+w+uZt619QDoN74emw+uhmA8oXL06JyC1pUbgFAUEAQS3sv9Vz9eZgGuFJ5VXIyvPQSjBoF9erZWSa1a2f41ANnDrBs9zJW7FnBij0r+OPwH1QsUpE9g/cAMDR8KAWCC9CicguqFKuC+NlOhN4qywAXkUnAHcBhY0zd9MdKArOAqsAuoIcx5oTnylRKudXevdCzJ6xcaTek+vDDCy0TYwxbjm7h//b+Hw83eJjAgEDeWPYG46PHUyi4EM0rNefF1i/SMrQlxhhEhL6N+jr8DeVNWS6lF5E2QDzw5UUB/g5w3Bjztog8B5Qwxjyb1cV0Kb1SXuDHH+3CnKQkmDgRevZkz6k9zN40+8Io+/yqxpjHYqhfrj5bjm7hbNJZ6per75crGr2dy0vpjTHLRKTqJQ93BSLSP58KRAJZBrhSykFJSfDCCyR+8B5r21Zn2YAu3N78euoDfx3+i6GLhlK9RHW61OpC69DWtAptRY2SNQCoXTrj1opylqv/lF5jjDmY/nkc4JnzgpRSbnFm2x+MfvVWIoP3s+rFQBLkb/j9A4pVqE79cvWJqBrB/iH7L+xzrXxDjn8XMsYYEcm0DyMi/YB+AKGhoTm9nFIqCwkpCazat4rIXZGUK1yOx3eWIl+/vrz35BlqFb2WJxp0pW2VtrQKbUWpgqUAKBBcQOdh+yBXA/yQiJQ3xhwUkfLA4cyeaIyZAEwA2wN38XpKqSx8uOpD5m6Zy6p9q0hMTSRAArj/bHUefyeWkGbNOPTwZArWuN7pMvOkqCiIjISICAgPd9/7uhrg84HewNvpH+e5rSKl1BWlpKWw/uB6lu5cytZjW5ncdTIAK/eu5EzSGfo37U9EYHVaDRtH8fWbYNgweOMNCjq4/WteFhUF7dvbWxAhIbBkiftCPDvTCGdib1iWFpF9wAhscH8jIn2B3UAP95SjlMrM4r8XM3bNWH7b/RunE08DULdsXeKT4ikcUpiZd80kUAJg8mQYMAAKFbKLdDp1crjyvC0y0oZ3aqr9GBmZiwFujLk3ky+1d08JSqlL7Tm1hyU7lvDLzl94pe0rXFfqOg7GH2Tz0c3cW/de2lVrR0TVCMoWKnvhNYHxZ+GJJ+yRZzfdBNOm2ZPilcddqUUSEWFH3udH4BER7ruuHqmmlJc4cOYAI5eNZPGOxcQejwWgbKGyfPWfr+hQvQNpJo0AyeTg4DVr4N57YfduuyHV8OEQGJiL1edd2WmR5LQHrkeqKeVFUtJSWLt/LYv+XkSt0rXoWbcn+YPyM+2PabQKbcWTTZ7k5mtv5oYyN1xYlp5heKelwXvvwQsv2NH2b79By5a5/N3kbdlpkYSHu/fm5Xka4ErlokkbJvHjth9ZunMppxJPIQhPNXmKnnV7UrJASY4NO5b9lY4HD0KvXvDLL/a8ys8+gxIlPPsN5FFOtUiyogGulIecSz7Hb7t/Y+vRrQxqPgiAL3//kp0nd9Ljhh7ccu0ttL+2PSULlLzwmmyH908/2eXw8fF2OXzfvqAbSHlEVi2S8HD7mCemCWZFA1wpN9p5Yidzt8xl4d8L+W3XbySmJlI4pDD9GvejQHAB5vWcR9F8RV3frS8xEZ5/Hj74wB668PXXcL3O7c6pK42wnWyRZEUDXKkcOJd8jshdkYRXDqd4/uLM2TyHZxY/Q+3StXki7Ak61ehEmyptLqxyLJa/mOsX27LFHrqwYQP07w/vvgv587vpO8m7shphO9kiyYoGuFJXaeeJnSyIXcCC7QtYunMpCSkJzOg2g3vr3UvvBr25q85dVC1e1X0XNMa2SZ5+2s7tnjcPunRx3/vncVmNsJ1skWRFA1ypLKSmpXIq8RQlC5Rkx4kdVP+oOgDXlbyOxxo/xq01bqVt1bYAlC5YmtIFS7vv4seOwaOPwvffwy23wNSpUL68+94/j8jpTUinWiRZ0QBXKgOnEk6xcPtCfoz9kQWxC+hUoxPTu03n2hLXMrHzRNpWact1pa7zbBFLl9pZJocPw/vv2xF4QCbzwFWmvPkmZE5pgCt1iUfmP8LU36eSkpZCqQKluP2627m7zt3/+3qjRzxbQFISvPwyvPOOPRX+hx+gYUPPXtOPefNNyJzSAFd5ljGGDXEbmLdlHpG7I/nlwV8IDgzmhjI38Ez4M3Su1ZlmFZsRGJCLKxq3bYP774foaHvU2ejRtu+tspRZm8Sbb0LmlAa4ynO2HN3C2NVjmb9tPvtO7yNAAmhRuQWHzx6mYtGKDA4fnPtFnb9ROXiwnVny3XfQrVvu1+GjrtQm8eUWSVY0wJXfO5d8jkV/L6JmqZpcX+Z64uLjmBwzmQ7VO/BaxGvcUfMOyhQq41yBR47YG5Xz5sHNN8OUKVCxonP1+KDszCTxp+A+TwNc+aXTiaf577b/MmfLHH6K/YmzyWcZ1mIYo24ZRevQ1hwddpSCwQWdLhMWLoSHH4bjx227ZNAgvVGZCW9dzu4kDXDlN1LSUggKCCI1LZWaY2ty6OwhyhUux4M3Pki367sRUTUCgMCAQAoGOBze587ZgxbGjYO6deHnn+3KSpUhf55JkhMa4MqnnTh3grlb5jJ782z2nNrDxsc3EhgQyOiOo6lavCrNKzXPfAtWp8TE2BuVmzbZEffbb+uKyiz480ySnNAAVz5p6c6lvLvyXX7Z8QspaSlUKVaF7nW6k5SaRL6gfNxX7z6nS7xcaqqdz/3ii1C6tB11d+jgdFVeQ1skV08DXPmEM4ln+GHbD7QObU3lYpU5cvYIW49uZUjzIXSv052wCmGubxCVG3btsotyli+3s0s++8yGuAK0ReIqDXDltc4ln2NB7AK+/utrftz2IwkpCXzQ8QOebv403et0p8cNPbw7tMFOD5w6FQYOtH+fOhUefFC3fr2EtkhcowGuvNK55HNUHF2REwknKFuoLH0b9qVn3Z60qNwCIHcX17jqyBF47DG7j0mbNja8q1Z1uirHaIvE/XIU4CIyGHgEMMAfwMPGmAR3FKbyDmMM0QeimbZxGofOHuLr7l9TILgAL7V5iXrX1COiakT2DzrwFv/9rz1k4cQJu+3r4MF5+oxKbZF4hss/FSJSERgI1DHGnBORb4CewBQ31ab83M4TO/lq41dM2ziN2OOxhASG0KVWlwvTAR1ZEZlT8fHwzDO2x12vHixalGemB/rqoQi+LKfDmiCggIgkAwWBAzkvSfmzkwknyReYz55Os3Uer0S+QkTVCJ5t+Sx31bmL4vmLO12i61assMec7dxpQ/yNNyBfPqeryhW+fCiCL3N5gqwxZj/wHrAHOAicMsYsuvR5ItJPRKJFJPrIkSOuV6p8VkpaCgtiF3DP7Hso9145Zv01C4CHGjzEnsF7WNp7KX0b9fXd8E5IsIty2rSxNy1/+822TfJIeEPGI+yLnW+RvP765eGuXJeTFkoJoCtQDTgJfCsiDxhjpl38PGPMBGACQFhYmMlBrcrHJKcm8/yS55n+x3Ti4uMoVaAUjzZ6lKYVmwJQPH9x3w3t8zZssLNK/vrL7h743ntQpIjTVXmEvx6K4Mty0kK5GdhpjDkCICJzgBbAtCu+Svm1UwmnWHdwHe2qtSM4MJgVe1bQrGIzetfvze01byckMMTpEt0jJcWuoHz1VShTxt60vO02p6vyGL0J6Z1yEuB7gOYiUhA4B7QHot1SlfIpxhiW7V7GFxu+YPam2QDEPRNH0XxFWdFnhe/NIMnK1q12Uc6aNdCzJ3z8MZQs6XRVHqU3Ib2Tyz9ZxpjVIjIbWA+kABtIb5WovGPpzqU8/uPjxB6PpWi+ovSq34u+DftSJMS2EfwqvNPSYMwYGD4cChaEWbOgRw+nq3KrvHgogi/L0U+XMWYEMMJNtSgfkGbSWPz3YsoVLkf9cvUpV7gc5QqX48U2L9K9Tnfv2KLVE/7+2277unw5dO5spwn62eHCefVQBF/mR8Mj5UmH4g8xOWYyE9dPZMeJHfRp0Icvun5BnTJ1WPbwMqfL85y0NBg/3s4yCQ62hy306uWXS+Hz6qEIvkwDXGVpwIIBfLbuM5LTkomoGsHIdiP5T+3/OF2W5+3aZVdTLl0KHTvC559DpUpOV5Ujupzdv2iAq8ucTjzNrD9n0adhHwIDAqlcrDL9m/anX+N+1C5d2+nyPO/8+ZRDh9qR9sSJNsh9fNStM0n8jwa4umDzkc18vPZjpv4+lfikeGqUrMFN1W5iWMthTpeWe/bssedTLloE7drBpElQpYrTVbmFziTxPxrgikPxh7h/zv0s2bmEfIH56Fm3J/2b9iesQpjTpeUeY2DCBLsEHuCTT+xOgj52PqW2SPIWDfA86sS5E2w6somWoS0pXbA0yWnJvNnuTR5p9IizJ7Q7YdcueOQR2z9o3972un1w21dtkeQ9GuB5zPbj2xmzagyTYyZTMLgg+4bsIyQwhN8e+s3p0nJfWhp8+qmdYRIQYKcGPvqoz/a6tUWS92iA5xEbD23k5V9fZv7W+QQFBHFfvfsY3Hyw/yxtv1o7dtgbk5GR9lzKiRMhNNTpqrKkLRJ1MQ1wP5acmszZ5LMUz1+cUwmnWLFnBS+0foEnmzxJ+SL+tQgl21JTYdw4u5oyKMi2S/r08YlRt7ZI1KU0wP1QfFI8n6//nNFRo+lSqwvjbhtHq9BW7B28lwLBBZwuzzmbN9tRd1QU3HqrbZlUrux0Vf+ihyKoq6EB7keO/nOUsavHMm7tOI6fO06bKm3oXLMzACKSd8M7Odnuz/3qq1C4MHz1Fdx/v9eNuvVQBHW1NMD9yAtLXmDC+gl0rdWVZ1s+S3hlHYqxYYNtkcTEwN13w9ixcM01TleVoewsZdcWibqYGJN7ZyyEhYWZ6GjdcdZdNh3ZxFsr3mJA0wE0rdiU3Sd3czb5LHXK1HG6NOclJMBrr8E779j9uj/5BP7jHcv/M2uTZDUCV3mXiKwzxly2MENH4D5o46GNvLHsDWZvmk3B4ILccu0tNK3YlCrF/WPFYI6tWGGnA27ZYncQfP99KFHC6aoA3fFPuZcGuI95eN7DTImZQpGQIgxvPZynmz9N6YKlnS7LO5w6Bc8/b3cPrFoVfv7ZThH0Irrjn3InDXAfEBMXw43X3EiABHB96esZ0XYEg5oNokQB7xhVeoV58+DJJyEuDoYMse2TQoUcKUXnaqvcogHuxdbuX8vLkS+zcPtC5t4zl661u+atjaWy4+BBGDgQZs+GG2+EuXOhSRPHytG52io3aYB7oT8P/8lLv77E3C1zKVWgFG+1f4t21do5XZZ3MQa++MJuPpWQAG++aT8PDna0LJ2rrXKTBriXSU1LpcvMLhw7d4xXI17l6eZPUzRfUafL8i5bt8Ljj9t0bNvW7iJYs2auXV5bJMpb5CjARaQ48DlQFzBAH2NMlDsKy0v2ntrLR6s/4vV2r5M/KD+zus/i2hLXUqpgKadL8y6JifD223a0XbCgDe6+fXN1y1dtkShvktMR+BhgoTGmu4iEAH56oq1nHPvnGCOXj+STtZ+QZtK4vebtRFSNoElF53q4XmvZMrs/95Yt0LMnfPABlCuX62Voi0R5E5eHLiJSDGgDfAFgjEkyxpx0V2H+LCUthXf+7x2qf1SdMavHcH+9+4kdEEtE1QinS/M+x4/bvbrbtrUj8J9+gpkzPRreUVHw1lv246XOt0gCA7VFopyXkxF4NeAIMFlE6gPrgEHGmLNuqcyPBUogczbPoVVoK0bdPIobyt7gdEnexxiYMQMGD7YhPmwYjBhhWycepC0S5Uty0jwMAhoB440xDYGzwHOXPklE+olItIhEHzlyJAeX821Ldy4lYkoEh88eRkRY/OBifrzvRw3vjMTG2lPgH3gAqlWDdetg1CiPhzdk3CK5VHi4XS+k4a2clpMA3wfsM8asTv/7bGyg/4sxZoIxJswYE1amTB47qgu7X8kdM+6g/Zft2XlyJ7tO7gKgSL4izhbmjRIT7QKcevVg9Wq78dTKlVC/vlsvoy0S5S9cbqEYY+JEZK+I1DLGbAXaA5vcV5pvSzNpDP15KGPXjKVwSGHeufkdBjQbQP6g/E6X5p1++cWupIyNtTcpR4+G8u4/dEJbJMqf5HQWygBgevoMlB3AwzkvybcZYxARAiSAw/8c5pFGj/BGuzd0v5LMxMXB0KG2312jBixaBLfckuO3zWyuts4iUf4kRwFujIkBLtviMK+K2hvFkEVDmNh5InXL1uWr/3xFgOTeHGWfkppqT8QZPhzOnbM3KJ97DvLn/DeUK42ydaGN8ieaLm4QFx9H77m9aTGpBbtP7iYuPg5Awzsza9dC8+bw1FMQFgZ//AGvvOKW8IYr34g83yJ5/XXdb1v5Pl1Kn0Pj1oxj+JLhJKYm8lzL5xjeerjeoMzMsWPwwgt2BWW5cjB9Otx7r0tHm+VkObu2SJS/0ADPoQNnDtAqtBVjOo3hulLXOV2Od0pLg8mT4dln4eRJGDTInk9Z1LU9XvRGpFKWBvhVik+K5+VfX6ZTjU50qN6B1256jUAJRLzsgFyvsWGDbZVERUGrVvDxx3bb1xzQG5FKWdqkvQrzt86nzsd1+HDVh6zZvwaAoIAgDe+MnDwJAwbYHvf27TBlit3PJJvhrXO1lcqajsCzYf/p/QxcOJA5m+dQt2xdZnWfpSe+ZyYtzYb1c8/ZnvcTT8Abb0Dx4tl+C22RKJU9GuDZsCB2AQtiF/BW+7cYGj6U4EBnDw3wWmvW2FH3mjXQooU9k7Jhw6t+G22RKJU9GuCZ2HtqL5uPbtvVe38AAA6pSURBVKZD9Q70bdSXDtU76KnvmTl82M7n/uILO7vkyy/tPiZXaC3poQhK5ZwG+CWMMUz9fSqDFg6icEhhdgzcQb6gfBreGUlJgU8+gZdfhrNn7ZFmL72U5ewSbZEo5R4a4Bc5cOYAj/34GD9u+5G2Vdoyqesk8gXlc7os7/Trr3Y64B9/2KXvH30EtWtn66XaIlHKPTTA08XFx1H3k7okpCQwptMY+jftryspM7Jzpx1pz5kDVavaj3feeVm7RFskSnleng/wlLQUggKCKFe4HM+1eo47a99JzVK5d0Cuz4iPt/P63n/fzt8bORKGDMlw+bu2SJTKHXl6iPnrzl+pObYmMXExAAxrOUzD+1JpaTBtGtSqZQ8Tvvtu2LbN3rTMZO8SPRRBqdyRJwM8JS2FF5e+SPsv2xMSGKKtksysWQMtW8KDD0LFivZwha++sp+T+WIbXWijVO7Icy2UXSd3cd939xG1L4o+Dfrw0a0fUSikkNNleZd9++zweNo0Oy1wyhQb4gH/+4fuSm0SbZEolTvyXIBPiZnCX0f+YuZdM+lZt6fT5XiX+Hh45x147z3bOnn+efunyOW7K2Y1k0RnkSjleXmid/BP8j/8dfgvAF5o/QIbH9+o4X2x88vfa9a0G2V36QJbthDV+U3eGldE9yNRykv5/Qh869GtdPumG6cTTxM7IJb8Qfl1Uc7Fli2DwYNh/Xpo2hRmz4YWLXQmiVI+wK8DfO6WufT6vhf5gvIxo9sMPVD4YrGxRD06icjfIKJsZcKnD7WHCaf3uXWxjVLezy8DPDUtlRGRIxi5fCRhFcL4rsd3hBYLdbos73DkCLz2GlHjY2if+jNJkp+QM8KSakL4RQ01XWyjlPfLcQ9cRAJFZIOI/OiOgtxl/cH19GnQh+UPL9fwBntw8Ntv25Pfx48nsvFQkgILkGoCSEqSy+Zq69mRSnk/d4zABwGbAdfOx3KjjYc2UrJASSoVrcT393xPSGBInj5sISoKIn9NIyLhZ8KnPAZ790LnzjBqFBEnryek/ZVH2NoiUcq75SjARaQScDswEhjilopcNOOPGTwy/xE61ujI9/d8n+c3oYqKgvY3pZKUaAihLUtqtSf8194XkjocvQmplK/L6Qj8Q2AYkOkx7CLSD+gHEBrq/lZGaloqz/7yLO9HvU/r0NaMv32826/hczZsILLXBpISe5FKEEkBAUT2+oLwiH93zHSErZRvc7kHLiJ3AIeNMeuu9DxjzARjTJgxJqxMmTKuXi5D/yT/Q/dvu/N+1Pv0b9KfJb2WUK5wObdew5tdtpR9xw64/35o1IiIQ7MICTYEBhpC8gUQcVOemPKvVJ6SkxF4S6CLiNwG5AeKisg0Y8wD7ikta4kpiWw/vp0xncYwsNnA3LqsV/jXPO1gw5LOHxI+91kICoLhwwkfNowlm4K1RaKUH3M5wI0xzwPPA4hIBPBMboX39uPbqVS0EiUKlGBdv3WEBIbkxmW9ip2nbUhNFZJSU4icfZTwRx+GESOgQgVAWyRK+Tuf+706clckTSY2YejPQwH8Prwz3PEvIcG2SFITCCSZkMA0IqY/Cp99diG8lVL+zy0LeYwxkUCkO97rSqZtnEafeX2oUbIG/6/l//P05Rx32XL2n1MI3zYVXn2V8L17WdK4P5FNhxHxYGXCw6s6Xa5SKpf5xEpMYwyvL3udEZEjuKnqTcy5Zw7F8xd3uiyP+9dy9sQ0IruNIfzoM3bPksmTCW/fHu2QKJV3+USAHzhzgA9WfUCv+r2Y2HmiX7VNrnh2ZFtDSGAaSamGkLQkIoqsh8/n2t0C8/ACJaWU5RMBXrFoRdb3W0/V4lX9amVlpjv+GQNLlxL+0kssSTJEluhGxMAbCX/pS7t/q1JK4SMBDlCtRDWnS3C7DHf8S14GL71kt3mtVInwT18k/OGHbcIrpdRFfG4Wiq/J7NxIuORQhKBUIuYMhLZtITYWxo6F7dvhscc0vJVSGfKZEbgvytahCOM2EzlqNRHbPiN8zw4YPRoefxwKFHCucKWUT9AAz6Er3YS84qEIa9bAa68R/t//El6yJLw9DPr3h0J6wLJSKns0wHMgqxF2hocirFoFr74KCxdCyZIwcqQN7qKO78arlPIxGuA5kJ2T2S9s2VpqI+Gv/D9YtAhKlbKN8aeeyvDEd6WUyg4N8CxccZ52RNbHjoWnLCd86Wvwyy9QpgyMGgVPPgmFC3u+eKWUX9MAvwKXT2Y3xo60R46E5cuhbFl491144gntcSul3EYD/Aqu+mT2tDSYN88G97p1UKkSjBkDjzwCBQvmcvVKKX+n88DJfK72v+ZpX+lk9pQUmD4dbrwRunWDkydh4kT4+28YOFDDWynlEXl+BH6lNkmmLZLzEhLgyy/hnXdsWN9wgw3yHj3swQpKKeVBeT5lsjOT5LLgPnkSxo+37ZFDhyAsDL7/3m4yFaC/1CilckeeCPCcziS54MAB+PBD+PRTOHMGOnaEZ5+1L/KjTbaUUr7B7wPc5ZkkF9uyxc4i+eorO1S/5x4YNgwaNMil70IppS7n9wF+1TNJzjPGTgF8/3344QfIlw/69YOhQ6Ga/+2MqJTyPX4R4G5rkQAkJ8Ps2XZTqehoKF3abu/av79diKOUUl7C5QAXkcrAl8A1gAEmGGPGuKuw7HJLiwTg1Cn4/HN7Y3LvXqhVy/a6e/XSnQGVUl4pJyPwFGCoMWa9iBQB1onIYmPMJjfVli0ut0jO27nT7r39+ef2xmREBHzyCdx2m84oUUp5NZcD3BhzEDiY/vkZEdkMVATcHuBubZGA7W9HRtrR9vz5dqVOjx4wZAg0buzu8pVSyiPc0gMXkapAQ2C1O97vYm5rkQD8849daPPRR/Dnn7a/PXy43aOkYkV3l66UUh6V4wAXkcLAd8DTxpjTGXy9H9APIDQ09KrfP8ctEoA9e2xbZOJEOH4c6teHSZOgZ0/tbyulfFaOAlxEgrHhPd0YMyej5xhjJgATAMLCwszVXsOlFgnYjaWWLLHBPX++few//7F7k7RurQtvlFI+LyezUAT4AthsjBntvpL+7apaJAAnTsCUKXape2ysbZMMG2bPmaxSxVNlKqVUrsvJCLwl8CDwh4jEpD823BizIOdl/VuWLRKw27d+/DHMnGk3mWrZEkaMgO7d7SIcpZTyMzmZhbICcLYPceYMfP01TJhgF90UKgS9e9ubkvXrO1qaUkp5mu+txDQG1q61NyRnzoSzZ6FuXTuzpFcvKFbM6QqVUipX+E6AnzxppwBOmAAbN9pDEnr2hEcfhWbN9KakUirP8Y0Af/11e2TOuXPQqJG9QXnffVC0qNOVKaWUY3wjwCtXtr3tRx+1Aa6UUspHAvyhh+wfpZRSF+huTUop5aM0wJVSykdpgCullI/SAFdKKR+lAa6UUj5KA1wppXyUBrhSSvkoDXCllPJRYsxVn7Hg+sVEjgC7XXx5aeCoG8txJ63NNVqba7Q21/hybVWMMWUufTBXAzwnRCTaGBPmdB0Z0dpco7W5RmtzjT/Wpi0UpZTyURrgSinlo3wpwCc4XcAVaG2u0dpco7W5xu9q85keuFJKqX/zpRG4Ukqpi3h9gItIZRH5VUQ2ichfIjLI6ZrOE5H8IrJGRH5Pr+1Vp2u6lIgEisgGEfnR6VouJiK7ROQPEYkRkWin67mYiBQXkdkiskVENotIuNM1AYhIrfT/Xuf/nBaRp52u6zwRGZz+c/CniMwUkfxO13SeiAxKr+svp/+bicgkETksIn9e9FhJEVksIrHpH0tk5728PsCBFGCoMaYO0Bx4SkTqOFzTeYlAO2NMfaAB0ElEmjtc06UGAZudLiITNxljGnjh1K4xwEJjTG2gPl7y388YszX9v1cDoDHwD/C9w2UBICIVgYFAmDGmLhAI9HS2KktE6gKPAk2x/z/vEJEaDpY0Beh0yWPPAUuMMdcBS9L/niWvD3BjzEFjzPr0z89gf5gqOluVZaz49L8Gp//xmpsKIlIJuB343OlafIWIFAPaAF8AGGOSjDEnna0qQ+2Bv40xri6M84QgoICIBAEFgQMO13Pe9cBqY8w/xpgU4Degm1PFGGOWAccvebgrMDX986nAndl5L68P8IuJSFWgIbDa2Ur+J71FEQMcBhYbY7ymNuBDYBiQ5nQhGTDAIhFZJyL9nC7mItWAI8Dk9NbT5yJSyOmiMtATmOl0EecZY/YD7wF7gIPAKWPMImeruuBPoLWIlBKRgsBtQGWHa7rUNcaYg+mfxwHXZOdFPhPgIlIY+A542hhz2ul6zjPGpKb/SlsJaJr+65rjROQO4LAxZp3TtWSilTGmEXArti3WxumC0gUBjYDxxpiGwFmy+etsbhGREKAL8K3TtZyX3rPtiv0HsAJQSEQecLYqyxizGRgFLAIWAjFAqqNFXYGxUwOz9Zu8TwS4iARjw3u6MWaO0/VkJP3X7F+5vLfllJZAFxHZBXwNtBORac6W9D/pIzaMMYexfdymzlZ0wT5g30W/Sc3GBro3uRVYb4w55HQhF7kZ2GmMOWKMSQbmAC0crukCY8wXxpjGxpg2wAlgm9M1XeKQiJQHSP94ODsv8voAFxHB9iM3G2NGO13PxUSkjIgUT/+8AHALsMXZqixjzPPGmErGmKrYX7eXGmO8YkQkIoVEpMj5z4EO2F9zHWeMiQP2ikit9IfaA5scLCkj9+JF7ZN0e4DmIlIw/We2PV5y8xdARMqmfwzF9r9nOFvRZeYDvdM/7w3My86LgjxWjvu0BB4E/kjvNQMMN8YscLCm88oDU0UkEPuP4TfGGK+aruelrgG+tz/nBAEzjDELnS3pXwYA09NbFTuAhx2u54L0f/BuAR5zupaLGWNWi8hsYD125tgGvGvl43ciUgpIBp5y8sa0iMwEIoDSIrIPGAG8DXwjIn2xO7b2yNZ76UpMpZTyTV7fQlFKKZUxDXCllPJRGuBKKeWjNMCVUspHaYArpZSP0gBXSikfpQGulFI+SgNcKaV81P8H7sP+rqfxYjgAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "x = np.arange(2, 10, 0.2)\n", + "\n", + "plt.plot(x, x**1.5*.5, 'r-', x, np.log(x)*5, 'g--', x, x, 'b.')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you want to print them in different graphs, try this:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def f(x):\n", + " return np.sin(np.pi*x)\n", + "\n", + "x1 = np.arange(0, 5, 0.1)\n", + "x2 = np.arange(0, 5, 0.01)\n", + "\n", + "plt.subplot(211)\n", + "plt.plot(x1, f(x1), 'go', x2, f(x2-1))\n", + "\n", + "plt.subplot(212)\n", + "plt.plot(x2, f(x2), 'r--')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How about printing images?\n", + "\n", + "Let's try to print a image whose pixels gradually change:\n", + "\n", + "Different pixel values represent different gray levels." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "img = np.arange(0, 1, 1/32/32) # define an 1D array with 32x32 elements gradually increasing\n", + "img = img.reshape(32, 32) # reshape it into 32x32 array, the array represents a 32x32 image,\n", + " # each element represents the corresponding pixel of the image\n", + "plt.imshow(img, cmap='gray')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Based on numpy, Scikit-learn (sklearn) provides a lot of tools for machine learning.It is a very powerful machine learning library.\n", + "\n", + "Then, let's use it for mnist classification:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPsAAAD4CAYAAAAq5pAIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAOKUlEQVR4nO3db4wVdZbG8eeIwxtngvSaaQnjn3FCMLhRZkVcXaIYhLBGg0SiwwujWWKbCMmYbHDJrMmQbDSdVdwETSY2GTNoRseJ2gwh64KLRGZjJLaKCu0y/gk6TVpQUWlEMwucfdHFpIG+v2pvVd26cr6fpNP31umqOil9qLpVdetn7i4Ap77T6m4AQGsQdiAIwg4EQdiBIAg7EMTprVyZmXHqH6iYu9to0wvt2c1svpntMrP3zGxFkWUBqJY1e53dzMZJ+pOkuZIGJL0qabG79yfmYc8OVKyKPftMSe+5+wfu/hdJv5O0oMDyAFSoSNgnS/rziPcD2bTjmFmXmfWZWV+BdQEoqPITdO7eI6lH4jAeqFORPfseSeeMeP+jbBqANlQk7K9KmmJmPzaz8ZJ+Jml9OW0BKFvTh/HuftjMlknaKGmcpMfcfWdpnQEoVdOX3ppaGZ/ZgcpVclMNgO8Owg4EQdiBIAg7EARhB4Ig7EAQhB0IgrADQRB2IAjCDgRB2IEgCDsQBGEHgiDsQBCEHQiCsANBEHYgCMIOBEHYgSAIOxAEYQeCaOmQzcCp4vLLL0/WFy5cmKyvWNH6QY/ZswNBEHYgCMIOBEHYgSAIOxAEYQeCIOxAEIziCjThmWeeSdbzrrOPGzeuzHaO02gU10I31ZjZbklDko5IOuzuM4osD0B1yriD7hp3/7SE5QCoEJ/ZgSCKht0lbTKz18ysa7Q/MLMuM+szs76C6wJQQNHD+FnuvsfMfijpBTP7X3ffOvIP3L1HUo/ECTqgToX27O6+J/u9T1KvpJllNAWgfE2H3czOMLMfHHstaZ6kHWU1BqBcRQ7jOyX1mtmx5Tzp7v9VSldAzTo6OpL1mTO/ewexTYfd3T+QdEmJvQCoEJfegCAIOxAEYQeCIOxAEIQdCIJHSZdg+vTpyfpHH32UrO/fv7/MdlCCRx99NFmfPHlyizopD3t2IAjCDgRB2IEgCDsQBGEHgiDsQBCEHQiC6+xjdO655zasvfjii8l5P/vss2R9+fLlyfq6deuSdXx7nZ2dyXrevRN5+vv7C81fBfbsQBCEHQiCsANBEHYgCMIOBEHYgSAIOxAE19nHaPz48Q1rEyZMSM6bV7/++uuT9bzr+AcOHEjWcbJp06Yl6xdccEGh5W/YsKHQ/FVgzw4EQdiBIAg7EARhB4Ig7EAQhB0IgrADQXCdfYyuvPLKypb9xhtvJOtDQ0OVrftUdvbZZzesPfLII5Wu+/Dhw5Uuvxm5e3Yze8zM9pnZjhHTOszsBTN7N/s9sdo2ARQ1lsP430iaf8K0FZI2u/sUSZuz9wDaWG7Y3X2rpBPHJ1ogaW32eq2kG0vuC0DJmv3M3unug9nrjyU1fKCXmXVJ6mpyPQBKUvgEnbu7mXmi3iOpR5JSfwegWs1eettrZpMkKfu9r7yWAFSh2bCvl3Rb9vo2SX8opx0AVck9jDezpyTNlnSWmQ1I+qWkbkm/N7Mlkj6UdHOVTbaDWbNmVbbs1atXJ+uXXHJJsv7ll182rK1cuTI571dffZWsf5ctXry4Ye3CCy8stOxDhw4l66tWrSq0/Crkht3dG22xOSX3AqBC3C4LBEHYgSAIOxAEYQeCIOxAEHzFNTNu3Lhk/cwzz2xRJydbsmRJ0/Neeumlyfodd9yRrL///vtNr7tqU6dOTdaXLVtW2brzLpd+8cUXla27WezZgSAIOxAEYQeCIOxAEIQdCIKwA0EQdiAIc2/dw2Pa+Uk1HR0dyfonn3xS2bq3b9+erD/44IPJeupa+dVXX52c9+DBg8n67bffnqz39vYm61V6+OGHk/W77rqr6WW//PLLyfr8+Sc+g/V4dX512N1ttOns2YEgCDsQBGEHgiDsQBCEHQiCsANBEHYgCK6zZ6q8zr5t27Zkfe7cucl63jXb005r/G/2tddem5x3zZo1yfqECROS9bxHbO/YsSNZT7n44ouT9eeffz5ZTw3ZnOemm25K1tetW9f0sqvGdXYgOMIOBEHYgSAIOxAEYQeCIOxAEIQdCILnxrdA3jPEi373+ejRow1rmzZtSs67ZcuWZP3WW29N1h966KFk/eabG4/mnbddFi1alKwXuY6ed+/Dxo0bm152u8rds5vZY2a2z8x2jJi20sz2mNn27Oe6atsEUNRYDuN/I2m0x3L8h7tPz37+s9y2AJQtN+zuvlXS/hb0AqBCRU7QLTOzt7LD/ImN/sjMusysz8z6CqwLQEHNhv1Xkn4iabqkQUmrGv2hu/e4+wx3n9HkugCUoKmwu/tedz/i7kclrZE0s9y2AJStqbCb2aQRbxdKav57jABaIvc6u5k9JWm2pLPMbEDSLyXNNrPpklzSbkl3VthjS1Q5lvc111yTrF900UXJ+s6dO8ts5zh9felTKXnX2efMmZOs33DDDQ1rTzzxRHLeyy67LFkv4oEHHkjWv/7668rWXZfcsLv74lEm/7qCXgBUiNtlgSAIOxAEYQeCIOxAEIQdCIJHSWe6u7uT9eXLlzespb5iKkmHDh1K1p9++ulkvaurK1kvwmzUpw7/1T333JOs33///cl66v+vI0eOJOc9/fRi38BOXVa84oorkvPm/TdtZzxKGgiOsANBEHYgCMIOBEHYgSAIOxAEYQeC4FHSmalTpybrAwMDDWv33ntvct68r3LWKe8+i8cffzxZP++885L1O+9s/O3notfR867T33fffQ1r3+Xr6M1izw4EQdiBIAg7EARhB4Ig7EAQhB0IgrADQXCdPbN06dJkffXq1Q1rBw8eLLudtjE4OJisp65lS9KUKVMa1q666qrkvP39/cl6Xm/r169P1qNhzw4EQdiBIAg7EARhB4Ig7EAQhB0IgrADQfDc+MyTTz6ZrN9yyy0Na4sWLUrO29vb21RPp7rZs2cn61u3bk3WI34nfSyafm68mZ1jZlvMrN/MdprZz7PpHWb2gpm9m/2eWHbTAMozlsP4w5L+2d2nSfp7SUvNbJqkFZI2u/sUSZuz9wDaVG7Y3X3Q3V/PXg9JekfSZEkLJK3N/mytpBurahJAcd/q3ngzO1/STyVtk9Tp7sduTv5YUmeDebokVTdYGYAxGfPZeDP7vqRnJd3t7gdG1nz4LN+oJ9/cvcfdZ7j7jEKdAihkTGE3s+9pOOi/dffnssl7zWxSVp8kaV81LQIoQ+6lNxse03etpP3ufveI6Q9I+szdu81shaQOd0+O79vOl97ytsPQ0FDD2rx585LzvvLKK031BDSj0aW3sXxm/wdJt0p628y2Z9N+Ialb0u/NbImkDyXdXEajAKqRG3Z3/x9Jo/5LIWlOue0AqAq3ywJBEHYgCMIOBEHYgSAIOxAEj5LOfPPNN8n6m2++2bD2+eefl90OUDr27EAQhB0IgrADQRB2IAjCDgRB2IEgCDsQBNfZM93d3cn6Sy+91LC2a9eustsBSseeHQiCsANBEHYgCMIOBEHYgSAIOxAEYQeCYMhm4BTT9JDNAE4NhB0IgrADQRB2IAjCDgRB2IEgCDsQRG7YzewcM9tiZv1mttPMfp5NX2lme8xse/ZzXfXtAmhW7k01ZjZJ0iR3f93MfiDpNUk3ang89oPu/uCYV8ZNNUDlGt1UM5bx2QclDWavh8zsHUmTy20PQNW+1Wd2Mztf0k8lbcsmLTOzt8zsMTOb2GCeLjPrM7O+Qp0CKGTM98ab2fclvSTpPnd/zsw6JX0qySX9m4YP9f8pZxkcxgMVa3QYP6awm9n3JG2QtNHdHxqlfr6kDe7+tznLIexAxZr+IoyZmaRfS3pnZNCzE3fHLJS0o2iTAKozlrPxsyT9UdLbko5mk38habGk6Ro+jN8t6c7sZF5qWezZgYoVOowvC2EHqsf32YHgCDsQBGEHgiDsQBCEHQiCsANBEHYgCMIOBEHYgSAIOxAEYQeCIOxAEIQdCIKwA0HkPnCyZJ9K+nDE+7Oyae2oXXtr174kemtWmb2d16jQ0u+zn7Rysz53n1FbAwnt2lu79iXRW7Na1RuH8UAQhB0Iou6w99S8/pR27a1d+5LorVkt6a3Wz+wAWqfuPTuAFiHsQBC1hN3M5pvZLjN7z8xW1NFDI2a228zezoahrnV8umwMvX1mtmPEtA4ze8HM3s1+jzrGXk29tcUw3olhxmvddnUPf97yz+xmNk7SnyTNlTQg6VVJi929v6WNNGBmuyXNcPfab8Aws6skHZT0+LGhtczs3yXtd/fu7B/Kie7+L23S20p9y2G8K+qt0TDjt6vGbVfm8OfNqGPPPlPSe+7+gbv/RdLvJC2ooY+25+5bJe0/YfICSWuz12s1/D9LyzXorS24+6C7v569HpJ0bJjxWrddoq+WqCPskyX9ecT7AbXXeO8uaZOZvWZmXXU3M4rOEcNsfSyps85mRpE7jHcrnTDMeNtsu2aGPy+KE3Qnm+XufyfpHyUtzQ5X25IPfwZrp2unv5L0Ew2PATgoaVWdzWTDjD8r6W53PzCyVue2G6Wvlmy3OsK+R9I5I97/KJvWFtx9T/Z7n6ReDX/saCd7j42gm/3eV3M/f+Xue939iLsflbRGNW67bJjxZyX91t2fyybXvu1G66tV262OsL8qaYqZ/djMxkv6maT1NfRxEjM7IztxIjM7Q9I8td9Q1Osl3Za9vk3SH2rs5TjtMox3o2HGVfO2q334c3dv+Y+k6zR8Rv59Sf9aRw8N+rpA0pvZz866e5P0lIYP6/5Pw+c2lkj6G0mbJb0r6b8ldbRRb09oeGjvtzQcrEk19TZLw4fob0nanv1cV/e2S/TVku3G7bJAEJygA4Ig7EAQhB0IgrADQRB2IAjCDgRB2IEg/h9WJX8kYA+8zAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from sklearn.datasets import fetch_openml\n", + "\n", + "# download and load mnist data from https://www.openml.org/d/554\n", + "# for this tutorial, the data have been downloaded already in './scikit_learn_data'\n", + "X, Y = fetch_openml('mnist_784', version=1, data_home='./scikit_learn_data', return_X_y=True)\n", + "\n", + "# make the value of pixels from [0, 255] to [0, 1] for further process\n", + "X = X / 255.\n", + "\n", + "# print the first image of the dataset\n", + "img1 = X[0].reshape(28, 28)\n", + "plt.imshow(img1, cmap='gray')\n", + "plt.show()\n", + "\n", + "# print the images after simple transformation\n", + "img2 = 1 - img1\n", + "plt.imshow(img2, cmap='gray')\n", + "plt.show()\n", + "\n", + "img3 = img1.transpose()\n", + "plt.imshow(img3, cmap='gray')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# split data to train and test (for faster calculation, just use 1/10 data)\n", + "from sklearn.model_selection import train_test_split\n", + "X_train, X_test, Y_train, Y_test = train_test_split(X[::10], Y[::10], test_size=1000)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "#### Q1:\n", + "Please use the logistic regression(default parameters) in sklearn to classify the data above, and print the training accuracy and test accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training accuracy: 97.58%\n", + "Testing accuracy: 88.10%\n" + ] + } + ], + "source": [ + "# TODO:use logistic regression\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn import metrics\n", + "\n", + "lr = LogisticRegression(max_iter=400)\n", + "lr.fit(X_train,Y_train)\n", + "lr_predict_train = lr.predict(X_train)\n", + "lr_predict_test = lr.predict(X_test)\n", + "train_accuracy = metrics.accuracy_score(Y_train,lr_predict_train)\n", + "test_accuracy = metrics.accuracy_score(Y_test,lr_predict_test)\n", + "\n", + "print('Training accuracy: %0.2f%%' % (train_accuracy*100))\n", + "print('Testing accuracy: %0.2f%%' % (test_accuracy*100))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Q2:\n", + "Please use the naive bayes(Bernoulli, default parameters) in sklearn to classify the data above, and print the training accuracy and test accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training accuracy: 81.53%\n", + "Testing accuracy: 81.90%\n" + ] + } + ], + "source": [ + "# TODO:use naive bayes\n", + "from sklearn.naive_bayes import BernoulliNB\n", + "\n", + "nb = BernoulliNB()\n", + "nb.fit(X_train,Y_train)\n", + "nb_predict_train = nb.predict(X_train)\n", + "nb_predict_test = nb.predict(X_test)\n", + "train_accuracy = metrics.accuracy_score(Y_train,nb_predict_train)\n", + "test_accuracy = metrics.accuracy_score(Y_test,nb_predict_test)\n", + "\n", + "print('Training accuracy: %0.2f%%' % (train_accuracy*100))\n", + "print('Testing accuracy: %0.2f%%' % (test_accuracy*100))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Q3:\n", + "Please use the support vector machine(default parameters) in sklearn to classify the data above, and print the training accuracy and test accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training accuracy: 97.82%\n", + "Testing accuracy: 85.10%\n" + ] + } + ], + "source": [ + "# TODO:use support vector machine\n", + "from sklearn.svm import LinearSVC\n", + "\n", + "svm = LinearSVC(max_iter=5000)\n", + "svm.fit(X_train,Y_train)\n", + "svm_predict_train = svm.predict(X_train)\n", + "svm_predict_test = svm.predict(X_test)\n", + "train_accuracy = metrics.accuracy_score(Y_train,svm_predict_train)\n", + "test_accuracy = metrics.accuracy_score(Y_test,svm_predict_test)\n", + "\n", + "print('Training accuracy: %0.2f%%' % (train_accuracy*100))\n", + "print('Testing accuracy: %0.2f%%' % (test_accuracy*100))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Q4:\n", + "Please adjust the parameters of SVM to increase the testing accuracy, and print the training accuracy and test accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training accuracy: 98.08%\n", + "Testing accuracy: 94.50%\n" + ] + } + ], + "source": [ + "# TODO:use SVM with another group of parameters\n", + "from sklearn.svm import SVC\n", + "\n", + "svm = SVC(max_iter=5000)\n", + "svm.fit(X_train,Y_train)\n", + "svm_predict_train = svm.predict(X_train)\n", + "svm_predict_test = svm.predict(X_test)\n", + "train_accuracy = metrics.accuracy_score(Y_train,svm_predict_train)\n", + "test_accuracy = metrics.accuracy_score(Y_test,svm_predict_test)\n", + "\n", + "print('Training accuracy: %0.2f%%' % (train_accuracy*100))\n", + "print('Testing accuracy: %0.2f%%' % (test_accuracy*100))" + ] + } + ], + "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.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/.ipynb_checkpoints/pytorch-checkpoint.ipynb b/.ipynb_checkpoints/pytorch-checkpoint.ipynb new file mode 100644 index 0000000..56bd7ec --- /dev/null +++ b/.ipynb_checkpoints/pytorch-checkpoint.ipynb @@ -0,0 +1,221 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Pytorch Tutorial" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pytorch is a popular deep learning framework and it's easy to get started." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "import torch.utils.data as data\n", + "import torchvision\n", + "import torchvision.transforms as transforms\n", + "from torch.autograd import Variable\n", + "from tqdm import tqdm\n", + "import time\n", + "\n", + "BATCH_SIZE = 128\n", + "NUM_EPOCHS = 10" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, we read the mnist data, preprocess them and encapsulate them into dataloader form." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# preprocessing\n", + "normalize = transforms.Normalize(mean=[.5], std=[.5])\n", + "transform = transforms.Compose([transforms.ToTensor(), normalize])\n", + "\n", + "# download and load the data\n", + "train_dataset = torchvision.datasets.MNIST(root='./mnist/', train=True, transform=transform, download=True)\n", + "test_dataset = torchvision.datasets.MNIST(root='./mnist/', train=False, transform=transform, download=False)\n", + "\n", + "# encapsulate them into dataloader form\n", + "train_loader = data.DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True, drop_last=True)\n", + "test_loader = data.DataLoader(test_dataset, batch_size=BATCH_SIZE, shuffle=False, drop_last=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Then, we define the model, object function and optimizer that we use to classify." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "class SimpleNet(nn.Module):\n", + "# TODO:define model\n", + " def __init__(self):\n", + " super(SimpleNet,self).__init__()\n", + " self.conv1 = torch.nn.Sequential(\n", + " torch.nn.Conv2d(1,32,3,1,1),\n", + " torch.nn.ReLU(),\n", + " torch.nn.MaxPool2d(2)\n", + " )\n", + " self.conv2 = torch.nn.Sequential(\n", + " torch.nn.Conv2d(32,64,3,1,1),\n", + " torch.nn.ReLU(),\n", + " torch.nn.MaxPool2d(2)\n", + " )\n", + " self.conv3 = torch.nn.Sequential(\n", + " torch.nn.Conv2d(64,64,3,1,1),\n", + " torch.nn.ReLU(),\n", + " torch.nn.MaxPool2d(2)\n", + " )\n", + " self.dense = torch.nn.Sequential(\n", + " torch.nn.Linear(64*3*3,128),\n", + " torch.nn.ReLU(),\n", + " torch.nn.Linear(128,10)\n", + " )\n", + " \n", + " def forward(self,x):\n", + " conv1_out = self.conv1(x)\n", + " conv2_out = self.conv2(conv1_out)\n", + " conv3_out = self.conv3(conv2_out)\n", + " res = conv3_out.view(conv3_out.size(0),-1)\n", + " out = self.dense(res)\n", + " return out\n", + " \n", + "model = SimpleNet()\n", + "\n", + "# TODO:define loss function and optimiter\n", + "criterion = torch.nn.CrossEntropyLoss()\n", + "optimizer = torch.optim.Adam(model.parameters())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we can start to train and evaluate!" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 7%|▋ | 34/468 [00:08<01:42, 4.22it/s]\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;31m# TODO:forward + backward + optimize\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mimages\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mVariable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimages\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mVariable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlabels\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimages\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0mloss\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcriterion\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mout\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mlabels\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mtrain_loss\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0mloss\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitem\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.6/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m 530\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 531\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 532\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 533\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 534\u001b[0m \u001b[0mhook_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 26\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 27\u001b[0;31m \u001b[0mconv1_out\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconv1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 28\u001b[0m \u001b[0mconv2_out\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconv2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconv1_out\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 29\u001b[0m \u001b[0mconv3_out\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconv3\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconv2_out\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.6/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m 530\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 531\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 532\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 533\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 534\u001b[0m \u001b[0mhook_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.6/site-packages/torch/nn/modules/container.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, input)\u001b[0m\n\u001b[1;32m 98\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 99\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mmodule\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 100\u001b[0;31m \u001b[0minput\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodule\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 101\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 102\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.6/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m 530\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 531\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 532\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 533\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 534\u001b[0m \u001b[0mhook_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.6/site-packages/torch/nn/modules/pooling.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, input)\u001b[0m\n\u001b[1;32m 139\u001b[0m return F.max_pool2d(input, self.kernel_size, self.stride,\n\u001b[1;32m 140\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpadding\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdilation\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mceil_mode\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 141\u001b[0;31m self.return_indices)\n\u001b[0m\u001b[1;32m 142\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 143\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.6/site-packages/torch/_jit_internal.py\u001b[0m in \u001b[0;36mfn\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 179\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mif_true\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 181\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mif_false\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 182\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 183\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mif_true\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__doc__\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mif_false\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__doc__\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.6/site-packages/torch/nn/functional.py\u001b[0m in \u001b[0;36m_max_pool2d\u001b[0;34m(input, kernel_size, stride, padding, dilation, ceil_mode, return_indices)\u001b[0m\n\u001b[1;32m 486\u001b[0m \u001b[0mstride\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjit\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mannotate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 487\u001b[0m return torch.max_pool2d(\n\u001b[0;32m--> 488\u001b[0;31m input, kernel_size, stride, padding, dilation, ceil_mode)\n\u001b[0m\u001b[1;32m 489\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 490\u001b[0m max_pool2d = boolean_dispatch(\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "# train and evaluate\n", + "for epoch in range(NUM_EPOCHS):\n", + " train_loss = 0\n", + " train_acc = 0\n", + " for images,labels in tqdm(train_loader): \n", + " # TODO:forward + backward + optimize\n", + " images, labels = Variable(images),Variable(labels)\n", + " out = model(images)\n", + " loss = criterion(out,labels)\n", + " train_loss += loss.item()\n", + " predict = torch.max(out,1)[1]\n", + " train_correct = (predict == labels).sum()\n", + " train_acc += train_correct.item()\n", + " optimizer.zero_grad()\n", + " loss.backward()\n", + " optimizer.step()\n", + " print('Train loss:{:.6f},accuracy:{:.6f}'.format(train_loss/(len(train_dataset)),train_acc/(len(train_dataset)))) \n", + " \n", + " # evaluate\n", + " # TODO:calculate the accuracy using traning and testing dataset\n", + " model.eval()\n", + " test_loss = 0\n", + " test_acc = 0\n", + " for images, labels in tqdm(test_loader):\n", + " images, labels = Variable(images),Variable(labels)\n", + " out = model(images)\n", + " loss = criterion(out, labels)\n", + " test_loss += loss.item()\n", + " predict = torch.max(out,1)[1]\n", + " test_correct = (predict == labels).sum()\n", + " test_acc += test_correct.item()\n", + " print('Test loss:{:.6f},accuracy:{:.6f}'.format(test_loss/(len(test_dataset)),test_acc/(len(test_dataset)))) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Q5:\n", + "Please print the training and testing accuracy." + ] + } + ], + "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.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/keras.ipynb b/keras.ipynb index 9dca96b..fa0b602 100644 --- a/keras.ipynb +++ b/keras.ipynb @@ -16,20 +16,21 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "import keras\n", "from keras.datasets import mnist\n", "from keras.models import Sequential\n", - "from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D\n", + "from keras.layers import Dense,Activation, Dropout, Flatten, Conv2D, MaxPooling2D\n", "\n", "BATCH_SIZE = 128\n", "NUM_CLASSES = 10\n", - "NUM_EPOCHS = 10" + "NUM_EPOCHS = 10\n", + "nb_filters = 32\n", + "pool_size = (2,2)\n", + "kernel_size = (3,3)" ] }, { @@ -41,10 +42,8 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, + "execution_count": 4, + "metadata": {}, "outputs": [], "source": [ "# download and load the data (split them between train and test sets)\n", @@ -73,23 +72,39 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(60000, 28, 28, 1) (60000, 10) (10000, 28, 28, 1) (10000, 10)\n", + "WARNING:tensorflow:From /home/luna/.local/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py:4070: The name tf.nn.max_pool is deprecated. Please use tf.nn.max_pool2d instead.\n", + "\n" + ] + } + ], "source": [ + "print(x_train.shape,y_train.shape,x_test.shape,y_test.shape)\n", + "\n", "# define the model\n", "model = Sequential()\n", - "model.add(...)\n", - "model.add(...)\n", - "...\n", - "...\n", - "...\n", - "model.add(...)\n", + "model.add(Conv2D(nb_filters,kernel_size,input_shape=input_shape,padding='valid')) \n", + "model.add(Activation('relu'))\n", + "model.add(Conv2D(nb_filters,kernel_size))\n", + "model.add(Activation('relu'))\n", + "model.add(MaxPooling2D(pool_size=pool_size))\n", + "model.add(Dropout(0.25))\n", + "model.add(Flatten())\n", + "model.add(Dense(128))\n", + "model.add(Activation('relu'))\n", + "model.add(Dropout(0.5))\n", + "model.add(Dense(NUM_CLASSES))\n", + "model.add(Activation('softmax'))\n", "\n", "# define the object function, optimizer and metrics\n", - "model.compile(...)" + "model.compile(loss = 'categorical_crossentropy',optimizer='adadelta',metrics=['accuracy'])" ] }, { @@ -101,34 +116,68 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": { - "collapsed": true + "scrolled": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:From /home/luna/.local/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py:422: The name tf.global_variables is deprecated. Please use tf.compat.v1.global_variables instead.\n", + "\n", + "Train on 60000 samples, validate on 10000 samples\n", + "Epoch 1/10\n", + "60000/60000 [==============================] - 87s 1ms/step - loss: 0.2938 - accuracy: 0.9104 - val_loss: 0.0648 - val_accuracy: 0.9800\n", + "Epoch 2/10\n", + "60000/60000 [==============================] - 82s 1ms/step - loss: 0.1007 - accuracy: 0.9706 - val_loss: 0.0467 - val_accuracy: 0.9842\n", + "Epoch 3/10\n", + "60000/60000 [==============================] - 80s 1ms/step - loss: 0.0759 - accuracy: 0.9767 - val_loss: 0.0386 - val_accuracy: 0.9872\n", + "Epoch 4/10\n", + "60000/60000 [==============================] - 88s 1ms/step - loss: 0.0639 - accuracy: 0.9814 - val_loss: 0.0373 - val_accuracy: 0.9880\n", + "Epoch 5/10\n", + "60000/60000 [==============================] - 85s 1ms/step - loss: 0.0557 - accuracy: 0.9837 - val_loss: 0.0313 - val_accuracy: 0.9891\n", + "Epoch 6/10\n", + "60000/60000 [==============================] - 85s 1ms/step - loss: 0.0502 - accuracy: 0.9847 - val_loss: 0.0330 - val_accuracy: 0.9896\n", + "Epoch 7/10\n", + "60000/60000 [==============================] - 84s 1ms/step - loss: 0.0481 - accuracy: 0.9857 - val_loss: 0.0303 - val_accuracy: 0.9900\n", + "Epoch 8/10\n", + "60000/60000 [==============================] - 82s 1ms/step - loss: 0.0434 - accuracy: 0.9870 - val_loss: 0.0304 - val_accuracy: 0.9906\n", + "Epoch 9/10\n", + "60000/60000 [==============================] - 82s 1ms/step - loss: 0.0391 - accuracy: 0.9881 - val_loss: 0.0271 - val_accuracy: 0.9909\n", + "Epoch 10/10\n", + "60000/60000 [==============================] - 82s 1ms/step - loss: 0.0366 - accuracy: 0.9888 - val_loss: 0.0311 - val_accuracy: 0.9901\n", + "60000/60000 [==============================] - 17s 288us/step\n", + "Training loss: 0.0156, Training accuracy: 99.50%\n", + "10000/10000 [==============================] - 3s 285us/step\n", + "Testing loss: 0.0311, Testing accuracy: 99.01%\n" + ] + } + ], "source": [ "# train\n", - "model.fit(...)\n", + "model.fit(x_train,y_train,batch_size=BATCH_SIZE,epochs=NUM_EPOCHS,validation_data=(x_test,y_test))\n", "\n", "# evaluate\n", - "score_train = \n", - "print('Training loss: %.4f, Training accuracy: %.2f%%' % (...))\n", - "score_test = \n", - "print('Testing loss: %.4f, Testing accuracy: %.2f%%' % (...))" + "score_train,acc_train = model.evaluate(x_train,y_train,batch_size=BATCH_SIZE)\n", + "print('Training loss: %.4f, Training accuracy: %.2f%%' % (score_train,acc_train*100))\n", + "score_test,acc_test = model.evaluate(x_test,y_test,batch_size=BATCH_SIZE)\n", + "print('Testing loss: %.4f, Testing accuracy: %.2f%%' % (score_test,acc_test*100))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### Q6:\n", + "Q6:\n", "Please print the training and testing accuracy." ] } ], "metadata": { "kernelspec": { - "display_name": "Python [default]", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -142,7 +191,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.3" + "version": "3.6.9" } }, "nbformat": 4, diff --git a/mnist/MNIST/processed/test.pt b/mnist/MNIST/processed/test.pt new file mode 100644 index 0000000..5d9068d Binary files /dev/null and b/mnist/MNIST/processed/test.pt differ diff --git a/mnist/MNIST/processed/training.pt b/mnist/MNIST/processed/training.pt new file mode 100644 index 0000000..c99017c Binary files /dev/null and b/mnist/MNIST/processed/training.pt differ diff --git a/mnist/MNIST/raw/t10k-images-idx3-ubyte b/mnist/MNIST/raw/t10k-images-idx3-ubyte new file mode 100644 index 0000000..1170b2c Binary files /dev/null and b/mnist/MNIST/raw/t10k-images-idx3-ubyte differ diff --git a/mnist/MNIST/raw/t10k-images-idx3-ubyte.gz b/mnist/MNIST/raw/t10k-images-idx3-ubyte.gz new file mode 100644 index 0000000..5ace8ea Binary files /dev/null and b/mnist/MNIST/raw/t10k-images-idx3-ubyte.gz differ diff --git a/mnist/MNIST/raw/t10k-labels-idx1-ubyte b/mnist/MNIST/raw/t10k-labels-idx1-ubyte new file mode 100644 index 0000000..d1c3a97 Binary files /dev/null and b/mnist/MNIST/raw/t10k-labels-idx1-ubyte differ diff --git a/mnist/MNIST/raw/t10k-labels-idx1-ubyte.gz b/mnist/MNIST/raw/t10k-labels-idx1-ubyte.gz new file mode 100644 index 0000000..a7e1415 Binary files /dev/null and b/mnist/MNIST/raw/t10k-labels-idx1-ubyte.gz differ diff --git a/mnist/MNIST/raw/train-images-idx3-ubyte b/mnist/MNIST/raw/train-images-idx3-ubyte new file mode 100644 index 0000000..bbce276 Binary files /dev/null and b/mnist/MNIST/raw/train-images-idx3-ubyte differ diff --git a/mnist/MNIST/raw/train-images-idx3-ubyte.gz b/mnist/MNIST/raw/train-images-idx3-ubyte.gz new file mode 100644 index 0000000..b50e4b6 Binary files /dev/null and b/mnist/MNIST/raw/train-images-idx3-ubyte.gz differ diff --git a/mnist/MNIST/raw/train-labels-idx1-ubyte b/mnist/MNIST/raw/train-labels-idx1-ubyte new file mode 100644 index 0000000..d6b4c5d Binary files /dev/null and b/mnist/MNIST/raw/train-labels-idx1-ubyte differ diff --git a/mnist/MNIST/raw/train-labels-idx1-ubyte.gz b/mnist/MNIST/raw/train-labels-idx1-ubyte.gz new file mode 100644 index 0000000..707a576 Binary files /dev/null and b/mnist/MNIST/raw/train-labels-idx1-ubyte.gz differ diff --git a/numpy_matplotlib_sklearn.ipynb b/numpy_matplotlib_sklearn.ipynb index 067ad74..a4b34e2 100644 --- a/numpy_matplotlib_sklearn.ipynb +++ b/numpy_matplotlib_sklearn.ipynb @@ -18,11 +18,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { "scrolled": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2 (2, 3) 6 int64 \n" + ] + } + ], "source": [ "import numpy as np\n", "\n", @@ -54,9 +62,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "import matplotlib.pyplot as plt\n", "\n", @@ -75,9 +96,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "def f(x):\n", " return np.sin(np.pi*x)\n", @@ -106,11 +140,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": { "scrolled": true }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "img = np.arange(0, 1, 1/32/32) # define an 1D array with 32x32 elements gradually increasing\n", "img = img.reshape(32, 32) # reshape it into 32x32 array, the array represents a 32x32 image,\n", @@ -132,11 +179,48 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": { "scrolled": false }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "from sklearn.datasets import fetch_openml\n", "\n", @@ -164,7 +248,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -185,19 +269,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": { "scrolled": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training accuracy: 97.58%\n", + "Testing accuracy: 88.10%\n" + ] + } + ], "source": [ "# TODO:use logistic regression\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn import metrics\n", "\n", - "\n", - "\n", - "\n", + "lr = LogisticRegression(max_iter=400)\n", + "lr.fit(X_train,Y_train)\n", + "lr_predict_train = lr.predict(X_train)\n", + "lr_predict_test = lr.predict(X_test)\n", + "train_accuracy = metrics.accuracy_score(Y_train,lr_predict_train)\n", + "test_accuracy = metrics.accuracy_score(Y_test,lr_predict_test)\n", "\n", "print('Training accuracy: %0.2f%%' % (train_accuracy*100))\n", "print('Testing accuracy: %0.2f%%' % (test_accuracy*100))" @@ -213,16 +309,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training accuracy: 81.53%\n", + "Testing accuracy: 81.90%\n" + ] + } + ], "source": [ "# TODO:use naive bayes\n", "from sklearn.naive_bayes import BernoulliNB\n", "\n", - "\n", - "\n", - "\n", + "nb = BernoulliNB()\n", + "nb.fit(X_train,Y_train)\n", + "nb_predict_train = nb.predict(X_train)\n", + "nb_predict_test = nb.predict(X_test)\n", + "train_accuracy = metrics.accuracy_score(Y_train,nb_predict_train)\n", + "test_accuracy = metrics.accuracy_score(Y_test,nb_predict_test)\n", "\n", "print('Training accuracy: %0.2f%%' % (train_accuracy*100))\n", "print('Testing accuracy: %0.2f%%' % (test_accuracy*100))" @@ -238,16 +346,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training accuracy: 97.82%\n", + "Testing accuracy: 85.10%\n" + ] + } + ], "source": [ "# TODO:use support vector machine\n", "from sklearn.svm import LinearSVC\n", "\n", - "\n", - "\n", - "\n", + "svm = LinearSVC(max_iter=5000)\n", + "svm.fit(X_train,Y_train)\n", + "svm_predict_train = svm.predict(X_train)\n", + "svm_predict_test = svm.predict(X_test)\n", + "train_accuracy = metrics.accuracy_score(Y_train,svm_predict_train)\n", + "test_accuracy = metrics.accuracy_score(Y_test,svm_predict_test)\n", "\n", "print('Training accuracy: %0.2f%%' % (train_accuracy*100))\n", "print('Testing accuracy: %0.2f%%' % (test_accuracy*100))" @@ -263,15 +383,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training accuracy: 98.08%\n", + "Testing accuracy: 94.50%\n" + ] + } + ], "source": [ "# TODO:use SVM with another group of parameters\n", + "from sklearn.svm import SVC\n", "\n", - "\n", - "\n", - "\n", + "svm = SVC(max_iter=5000)\n", + "svm.fit(X_train,Y_train)\n", + "svm_predict_train = svm.predict(X_train)\n", + "svm_predict_test = svm.predict(X_test)\n", + "train_accuracy = metrics.accuracy_score(Y_train,svm_predict_train)\n", + "test_accuracy = metrics.accuracy_score(Y_test,svm_predict_test)\n", "\n", "print('Training accuracy: %0.2f%%' % (train_accuracy*100))\n", "print('Testing accuracy: %0.2f%%' % (test_accuracy*100))" @@ -294,7 +427,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.4" + "version": "3.6.9" } }, "nbformat": 4, diff --git a/pytorch.ipynb b/pytorch.ipynb index f98ce37..56bd7ec 100644 --- a/pytorch.ipynb +++ b/pytorch.ipynb @@ -16,10 +16,8 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "import torch\n", @@ -27,6 +25,7 @@ "import torch.utils.data as data\n", "import torchvision\n", "import torchvision.transforms as transforms\n", + "from torch.autograd import Variable\n", "from tqdm import tqdm\n", "import time\n", "\n", @@ -43,10 +42,8 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "# preprocessing\n", @@ -71,24 +68,48 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, + "execution_count": 34, + "metadata": {}, "outputs": [], "source": [ "class SimpleNet(nn.Module):\n", "# TODO:define model\n", - "\n", - "\n", - "\n", - "\n", + " def __init__(self):\n", + " super(SimpleNet,self).__init__()\n", + " self.conv1 = torch.nn.Sequential(\n", + " torch.nn.Conv2d(1,32,3,1,1),\n", + " torch.nn.ReLU(),\n", + " torch.nn.MaxPool2d(2)\n", + " )\n", + " self.conv2 = torch.nn.Sequential(\n", + " torch.nn.Conv2d(32,64,3,1,1),\n", + " torch.nn.ReLU(),\n", + " torch.nn.MaxPool2d(2)\n", + " )\n", + " self.conv3 = torch.nn.Sequential(\n", + " torch.nn.Conv2d(64,64,3,1,1),\n", + " torch.nn.ReLU(),\n", + " torch.nn.MaxPool2d(2)\n", + " )\n", + " self.dense = torch.nn.Sequential(\n", + " torch.nn.Linear(64*3*3,128),\n", + " torch.nn.ReLU(),\n", + " torch.nn.Linear(128,10)\n", + " )\n", + " \n", + " def forward(self,x):\n", + " conv1_out = self.conv1(x)\n", + " conv2_out = self.conv2(conv1_out)\n", + " conv3_out = self.conv3(conv2_out)\n", + " res = conv3_out.view(conv3_out.size(0),-1)\n", + " out = self.dense(res)\n", + " return out\n", " \n", "model = SimpleNet()\n", "\n", "# TODO:define loss function and optimiter\n", - "criterion = \n", - "optimizer = " + "criterion = torch.nn.CrossEntropyLoss()\n", + "optimizer = torch.optim.Adam(model.parameters())" ] }, { @@ -100,28 +121,71 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": { - "collapsed": true, "scrolled": true }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 7%|▋ | 34/468 [00:08<01:42, 4.22it/s]\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;31m# TODO:forward + backward + optimize\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mimages\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mVariable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimages\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mVariable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlabels\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimages\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0mloss\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcriterion\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mout\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mlabels\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mtrain_loss\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0mloss\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitem\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.6/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m 530\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 531\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 532\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 533\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 534\u001b[0m \u001b[0mhook_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 26\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 27\u001b[0;31m \u001b[0mconv1_out\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconv1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 28\u001b[0m \u001b[0mconv2_out\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconv2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconv1_out\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 29\u001b[0m \u001b[0mconv3_out\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconv3\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconv2_out\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.6/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m 530\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 531\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 532\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 533\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 534\u001b[0m \u001b[0mhook_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.6/site-packages/torch/nn/modules/container.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, input)\u001b[0m\n\u001b[1;32m 98\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 99\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mmodule\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 100\u001b[0;31m \u001b[0minput\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodule\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 101\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 102\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.6/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m 530\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 531\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 532\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 533\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 534\u001b[0m \u001b[0mhook_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.6/site-packages/torch/nn/modules/pooling.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, input)\u001b[0m\n\u001b[1;32m 139\u001b[0m return F.max_pool2d(input, self.kernel_size, self.stride,\n\u001b[1;32m 140\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpadding\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdilation\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mceil_mode\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 141\u001b[0;31m self.return_indices)\n\u001b[0m\u001b[1;32m 142\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 143\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.6/site-packages/torch/_jit_internal.py\u001b[0m in \u001b[0;36mfn\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 179\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mif_true\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 181\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mif_false\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 182\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 183\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mif_true\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__doc__\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mif_false\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__doc__\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.6/site-packages/torch/nn/functional.py\u001b[0m in \u001b[0;36m_max_pool2d\u001b[0;34m(input, kernel_size, stride, padding, dilation, ceil_mode, return_indices)\u001b[0m\n\u001b[1;32m 486\u001b[0m \u001b[0mstride\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjit\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mannotate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 487\u001b[0m return torch.max_pool2d(\n\u001b[0;32m--> 488\u001b[0;31m input, kernel_size, stride, padding, dilation, ceil_mode)\n\u001b[0m\u001b[1;32m 489\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 490\u001b[0m max_pool2d = boolean_dispatch(\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], "source": [ "# train and evaluate\n", "for epoch in range(NUM_EPOCHS):\n", - " for images, labels in tqdm(train_loader):\n", + " train_loss = 0\n", + " train_acc = 0\n", + " for images,labels in tqdm(train_loader): \n", " # TODO:forward + backward + optimize\n", - " \n", - " \n", - " \n", - " \n", + " images, labels = Variable(images),Variable(labels)\n", + " out = model(images)\n", + " loss = criterion(out,labels)\n", + " train_loss += loss.item()\n", + " predict = torch.max(out,1)[1]\n", + " train_correct = (predict == labels).sum()\n", + " train_acc += train_correct.item()\n", + " optimizer.zero_grad()\n", + " loss.backward()\n", + " optimizer.step()\n", + " print('Train loss:{:.6f},accuracy:{:.6f}'.format(train_loss/(len(train_dataset)),train_acc/(len(train_dataset)))) \n", " \n", " # evaluate\n", " # TODO:calculate the accuracy using traning and testing dataset\n", - " \n", - " \n", - " \n", - " \n" + " model.eval()\n", + " test_loss = 0\n", + " test_acc = 0\n", + " for images, labels in tqdm(test_loader):\n", + " images, labels = Variable(images),Variable(labels)\n", + " out = model(images)\n", + " loss = criterion(out, labels)\n", + " test_loss += loss.item()\n", + " predict = torch.max(out,1)[1]\n", + " test_correct = (predict == labels).sum()\n", + " test_acc += test_correct.item()\n", + " print('Test loss:{:.6f},accuracy:{:.6f}'.format(test_loss/(len(test_dataset)),test_acc/(len(test_dataset)))) " ] }, { @@ -135,7 +199,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python [default]", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -149,7 +213,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.3" + "version": "3.6.9" } }, "nbformat": 4,