{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import fastbook\n", "fastbook.setup_book()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from fastbook import *\n", "from fastai.vision.all import *\n", "import os" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAswAAALgCAYAAACAvyFXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABIeUlEQVR4nO3de/hVdZ0v8A9xEQUURM0LJnhBQyN1PDmC3LLIS2kXJ2sEK2Yqu1gem/GSxWWczlRq2vUwds7RUrOLR03TEFMCL6k5qaOGlzBGPYWmgSYJ/FDOHz42k/n9rB9rsdm//eP1ep7zPGd4z17ru9de37U/sx9802fdunXrAgAAeEWvavcCAACgJzMwAwBAwsAMAAAJAzMAACQMzAAAkDAwAwBAwsAMAAAJAzMAACQMzAAAkDAwAwBAwsDcYS699NI44YQTYsKECbHllltGnz59Ytq0ae1eFtDAKaecEoccckjsvPPOsfnmm8fWW28d++23X8yZMyeeeuqpdi8PqGHkyJHRp0+fV/x/22+/fbuXx3rqs27dunXtXgTdt++++8bdd98dgwcPjhEjRsT9998fxx57bFx00UXtXhpQ04ABA2L//fePMWPGxHbbbRcrV66MW2+9Ne64447Ycccd49Zbb42dd9653csE1sPIkSNjxYoVceKJJ/5FNnjw4PiHf/iHjb8oauvX7gWwfs4555wYMWJE7L777rFw4cKYMmVKu5cENPTMM8/EwIED/+LPTz/99Pgf/+N/xL/8y7/EN77xjTasDGhi6NChMXv27HYvgw3AX8noMFOmTIk99tgj+vTp0+6lABvIKw3LERHvfve7IyLioYce2pjLAeBl/MIM0ENdddVVERExduzYNq8EqGP16tVx0UUXxSOPPBKDBg2KsWPHxsSJE6Nv377tXhrrycAM0EOcddZZ8eyzz8bTTz8dd9xxR9x0000xduzYOPXUU9u9NKCGZcuWxfTp0//sz0aNGhXnn39+TJo0qU2rog4DM0APcdZZZ8Xjjz/+p//50EMPjQsuuCC23XbbNq4KqOMDH/hATJgwIfbee+8YMmRIPPzww/G1r30tzjvvvDjssMPiZz/7Wbz+9a9v9zLpJn+HGaCHWLZsWaxbty6WLVsWl112WTz88MOx3377xS9+8Yt2Lw1YT7NmzYo3vvGN8epXvzq22GKL2GeffWLu3Llx0kknxXPPPec/BuwwBmaAHubVr351vOMd74j58+fHU089Fccdd1y7lwRsIMcff3xERCxatKjNK2F9GJgBeqhddtklxowZE/fdd188+eST7V4OsAG89FesVq5c2eaVsD4MzAA92G9+85uICP9VPfQSt956a0RE7Lrrrm1eCevDwAzQRg8++GA8/fTTf/HnL7zwQpx++unxxBNPxLhx42LYsGFtWB1Qx+LFi1/xF+SlS5fGxz/+8YiImDZt2sZeFg1oyegwV1xxRVxxxRUR8eJ/IBQR8bOf/Sze//73R0TENttsE2eddVabVgesr2uuuSZOO+20OPjgg2PUqFExfPjwePzxx2PhwoXx8MMPx/bbbx/f/OY3271MYD1873vfi7PPPjsmTpwYu+yySwwZMiSWLFkSV199daxatSoOP/xw/zR2h+mzbt26de1eBN03e/bsmDNnTjHfZZddYunSpRtvQUAj9957b8ydOzduuummeOyxx2LFihUxaNCgGD16dBxxxBHxiU98Irbeeut2LxNYDwsXLoy5c+fGnXfeGcuWLYuVK1fG0KFDY999943p06fH9OnT/Yu9HcbADAAACX+HGQAAEgZmAABIGJgBACBhYAYAgISBGQAAEgZmAABIGJgBACDR7X/pT8H2i1pxHaqqsF/1qvL/XfPCCy/Uel3VazPZNai6Ptk5s9f27ds3Pe7atWvTfGPrlHrz7B5p1X2Zfc5NrluT49bd103WW/f6Val7HZo82zrlfm+qU95nv37lr/bnn3++9nGz53B23Kp7K9sLTdbbCr1pn2T3SUT979VWzR6t0t3PxS/MAACQMDADAEDCwAwAAAkDMwAAJAzMAACQMDADAECiz7pu9mlsKrVyVfVldStuelqFVKvWVHWftKpWp1XXt66eVh9U0qRWrhVaVXPUKv379y9mXV1dG3El3VO3ErLJHsqeqVXH7Wn7qKetpyT7LJtUfvW052yVut+PrdrXTer+svW2qu4vO2eTe6HueltFrRwAAGwABmYAAEgYmAEAIGFgBgCAhIEZAAASBmYAAEgYmAEAIKGHeT1lPYqt6oite+2bdIY26XfO9LT+xVbpDX2tTV6bdXQ2+Zxb1Y/ajn7iunusqkc3e22n3Jc9Vadcv+weqdrzrehTrvr3DbJz9rRr3qS7uFXfqz1Nq/49i1bRwwwAABuAgRkAABIG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cccdY7PNNouRI0fGiSeeGMuXL2/30lhP/dq9ALpv3333jVmzZr1iduONN8YNN9wQhx122EZeFbAhbLXVVnHiiSf+xZ8PHjx44y8GaGzJkiUxbty4eOKJJ+Koo46KvfbaK26//fb48pe/HPPmzYubb745hg8f3u5l0k191q1bt67di6C5gw46KG699db44Q9/GEceeWS7lwOsh5EjR0ZExNKlS9u6DmDDectb3hLz58+Pr3zlK3HCCSf86c9POumkOOecc+LDH/5wzJ07t40rZH0YmHuBe+65J8aOHRs77bRT/Md//Ie/lgEdxsAMvcuSJUti9913j5EjR8aSJUviVa/6z78B+4c//CF22GGHWLduXTzxxBMxaNCgNq6U7vJXMnqB8847LyIi/u7v/s6wDB1q9erVcdFFF8UjjzwSgwYNirFjx8bEiRPtaehACxYsiIiIqVOn/tmwHBExZMiQGD9+fMyfPz9uvfXWOOSQQ9qxRNaTgbnDPffcc3HRRRdF37594+///u/bvRygpmXLlsX06dP/7M9GjRoV559/fkyaNKlNqwLqeOCBByIiYvTo0a+Y77HHHjF//vx48MEHDcwdQktGh/v+978fK1asiEMPPTR23nnndi8HqOEDH/hAXH/99bFs2bJYuXJl3HPPPfHhD384li5dGocddljcfffd7V4isB6efvrpiHjxP+Z9JS/9+YoVKzbWkmjIL8wd7qW/jvHhD3+4zSsB6np5+80+++wTc+fOjcGDB8fZZ58ds2fPjssvv7xNqwPAL8wd7L777otbbrklRowYEYcffni7lwNsYMcff3xERCxatKjNKwHWx0u/IL/0S/PLvfTnQ4cO3VhLoiEDcwfzH/tB77bttttGRMTKlSvbvBJgfey5554REfHggw++Yv7QQw9FRPnvONPzqJXrUKtWrYodd9wxnnnmmfj1r3/t7y9DL3TttdfGoYceGq997Wvjl7/8ZbuXA3STWrnexy/MHeoHP/hBLF++PA477DDDMnSwxYsXv+IvyEuXLo2Pf/zjERExbdq0jb0soIHddtstpk6dGkuXLo2vf/3rf5bNmjUrVq5cGdOnTzcsdxC/MHeoCRMmxE033RRXXnllvO1tb2v3coCaZs+eHWeffXZMnDgxdtlllxgyZEgsWbIkrr766li1alUcfvjhcfnll8eAAQPavVRgPbz8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5rOeto+6ux6/MAMAQMLADAAACQMzAAAkDMwAAJAwMAMAQMLADAAAiW7XymX1Iu2oCKmqVsrqZLLalze84Q3pca+88spiNnz48GJ24YUXFrNPfepT6TmffPLJNC9pUgVY97V1K4mq9O/fP82zGqB26Gm1OSVN9nV2j2RZkzqirFZun332qXXOiPx5ktXnZdeoVc+o6667Lj3u29/+9mL23HPPFbMm90KWN6k462m1mZ2yr7PnZXbfRdSv8mtVBWBWF3nxxRenrz3yyCNrn7ek6vpV1XGWzJs3L83POuusYvbTn/601nratb86tS7SL8wAAJAwMAMAQMLADAAACQMzAAAkDMwAAJAwMAMAQMLADAAAibwodAPJujbrdrI26ZIcP358MfvhD3+YHnfo0KHF7P777y9mn/nMZ4pZVc9y3evXpM+wVV2IdfsXq3qWe2LXZCdo0oeZ5VlW936OiLjnnnuK2ete97piVtWJnN1fVa8tqbp+/+///b9iNnv27GJ26aWXpsfNupbrqnovdT9Te7M1qr4fM6149lf1q2fn/OMf/1jMzj333LpLSjuas3t25cqV6XHnzJlTzLJ9ct5556XHrTpvSav2WKu+O3oyvzADAEDCwAwAAAkDMwAAJAzMAACQMDADAEDCwAwAAIk+67rZ71FVC9NJVqxYUcy22mqr9LXZ5TrhhBOK2de//vVi1uTa1q3viqiu8KK+TqnNace+blIBOGrUqGL2oQ99qJgdcMAB6XHf+MY3FrO61+iLX/ximn/jG98oZo899lgxs2/bx76G3qe7+9ovzAAAkDAwAwBAwsAMAAAJAzMAACQMzAAAkDAwAwBAou21cnUrpqoq03bddddidsoppxSzd73rXelxb7/99mI2Y8aMYvbb3/62mDWpKso+l06pQOqNOuXaZ/uo6j3069evmK1du3aDryeisyrVmryXbF9XPYs76Rp1mk7Z12rloPvUygEAwAZgYAYAgISBGQAAEgZmAABIGJgBACBhYAYAgES3a+WyCqms/q2JrJapVdVJVXU82eUaOHBgMVu1alXtNdWt3mvyXmimU65tp9VP1X0ONfk86u4/eh/7GnoftXIAALABGJgBACBhYAYAgISBGQAAEgZmAABIGJgBACBhYAYAgES3e5ib9Dpm3alr166tdcysGzUi72nO3kur+p0z2fWJyK9RO7qqqdYb+lqzeyui/v3ViudBU3W7lpu8l+z6ZvdPp9xbvVGnXHs9zNB9epgBAGADMDADAEDCwAwAAAkDMwAAJAzMAACQMDADAECi27VyAACwKfILMwAAJAzMAACQMDADAEDCwAwAAAkDMwAAJAzMAACQMDADAEDCwAwAAAkDMwAAJAzMAACQMDADAEDCwAwAAAkDMwAAJAzMAACQMDADAEDCwAwAAAkDMwAAJAzMAACQMDB3oMceeyxmzJgRO+64Y2y22WYxcuTIOPHEE2P58uXtXhpQw7p16+Kb3/xmHHjggTF48OAYNGhQHHDAATF37tx44YUX2r08oIZLL700TjjhhJgwYUJsueWW0adPn5g2bVq7l0VNfdatW7eu3Yug+5YsWRLjxo2LJ554Io466qjYa6+94vbbb48FCxbEnnvuGTfffHMMHz683csE1sOxxx4b3/nOd2K77baLI488MrbYYou47rrrYvHixTF9+vT49re/3e4lAutp3333jbvvvjsGDx4cI0aMiPvvvz+OPfbYuOiii9q9NGro1+4FsH4++tGPxhNPPBFf+cpX4oQTTvjTn5900klxzjnnxOmnnx5z585t4wqB9XH55ZfHd77znRg1alTcfvvtsc0220RExJo1a+Jd73pXXHjhhfH2t7893vnOd7Z5pcD6OOecc2LEiBGx++67x8KFC2PKlCntXhIN+CsZHWTJkiUxf/78GDlyZHzsYx/7s2zOnDkxaNCguPDCC2PlypVtWiGwvi6//PKIiPjUpz71p2E5ImLAgAFxxhlnRETE1772tbasDahvypQpsccee0SfPn3avRQ2AANzB1mwYEFEREydOjVe9ao//+iGDBkS48ePjz/+8Y9x6623tmN5QA3Lli2LiIhdd931L7KX/uzGG2+MNWvWbNR1AfCfDMwd5IEHHoiIiNGjR79ivscee0RExIMPPrjR1gQ089Kvyr/+9a//Inv44YcjImLt2rV/+v8DsPEZmDvI008/HRERW2211SvmL/35ihUrNtaSgIaOOOKIiIj40pe+FL///e//9OddXV0xa9asP/3PWnAA2sd/9AfQRu95z3viwgsvjGuvvTbGjBkTRx11VAwcODB+8pOfxG9/+9t4zWteE4888shf/DUsADYeT+AO8tIvyC/90vxyL/350KFDN9aSgIb69u0bV111VXz+85+PbbfdNr71rW/Ft771rdhjjz3illtuiSFDhkRExHbbbdfmlQJsuvzC3EH23HPPiCj/HeWHHnooIsp/xxnomfr37x+nnHJKnHLKKX/256tWrYqHHnoottlmmxg1alSbVgeAX5g7yEsdjvPnz/+Lf/3rD3/4Q9x8882xxRZbxF//9V+3Y3nABvbd73431qxZE+9973vbvRSATZqBuYPstttuMXXq1Fi6dGl8/etf/7Ns1qxZsXLlypg+fXoMGjSoTSsE6njmmWf+4s/uuuuu+Md//McYNmxYnHrqqW1YFQAv8U9jd5iX/9PYr33ta+O2226LBQsWxOjRo+OWW27xT2NDhznwwANj8803j3322SeGDBkSixcvjquvvjo233zzuOqqq2LSpEntXiKwnq644oq44oorIuLFvvVrr702dt1115gwYUJEvFgpedZZZ7VxhawPA3MHevTRR2PmzJkxb968eOqpp2KHHXaId7zjHTFr1qwYNmxYu5cHrKczzzwzvvvd78aSJUviueeei5122ikOO+ywOO2002LEiBHtXh5Qw+zZs2POnDnFfJdddomlS5duvAXRiIEZAAAS/g4zAAAkDMwAAJAwMAMAQMLADAAACQMzAAAkDMwAAJAwMAMAQKJfd/8X+/Tp08p19BivelX+f0O88MILtV6bva5Kdu2b1Gi34rhV90l23FZdv3bolHrzTWVfd5q+ffsWs+eff34jruRFTZ6LvYl93Vla8Z3S5Dsu047Zo1X7utOeF939zPzCDAAACQMzAAAkDMwAAJAwMAMAQMLADAAACQMzAAAkul0rt6moqjvJKmWy12avq6qpaVX9TV2tqrzqaVUz9B6tqoJqsseqqpdaoV+/8iN/7dq1xazq+tStqMyeJRHtqdCj92jFd0rVXqhb8Va11lY8L5pcnyZzQKuqclvNL8wAAJAwMAMAQMLADAAACQMzAAAkDMwAAJAwMAMAQMLADAAAiT7rull616pO305Tt2OxJ/YOtmJNVV2R2XGb9LVm174d17cnd0n+V/b1i7L7K7unu7q6WrGctuiJz6i6z9tWsa97j1Z8l1ep++84tEq7etB72rOmu+f0CzMAACQMzAAAkDAwAwBAwsAMAAAJAzMAACQMzAAAkOjX7gX0NFWVMXWrX5pUpfTrV/6YsvW0qqamSdVT9tosq6q3UaNEpkl9UpZl92zVns/yVtWpZdehSYVU3fVmz7ama6L3a1Jj2o4a2Oy1Vd9hWZ5dh7Vr1xazVu2vqs+lHRV6G4JfmAEAIGFgBgCAhIEZAAASBmYAAEgYmAEAIGFgBgCARJ913exIUdtVrVVVUHVVfWbZR7/vvvsWszlz5hSzI488Mj3nV7/61WL2iU98ophV1U9l1Tnt0KR6aGPaVPZ1k/fZqs+ybnVVqyqb6tZXVuWtqt5rh562npJNZV9XqbvHWlUrl2nyfZ1pUiXZquvQ02al7r4XvzADAEDCwAwAAAkDMwAAJAzMAACQMDADAEDCwAwAAIm8q4sNpqoKKlO3vqXqdVllzN57713MDj/88GJWVVOTVdxk2lE1Q+/RZC/UrVYaMGBAes41a9bUOmfVXqhb2dSkmrHuNar6XLJrmF0/Ng1NqtiyGsUmeyE77ujRo4vZtddemx73n//5n4vZN7/5zWJW9Z2cadX169Tvc78wAwBAwsAMAAAJAzMAACQMzAAAkDAwAwBAwsAMAAAJAzMAACT0ML9M1i0YkfcL9rRuwTe84Q1p/t73vreYHXfcccUsu0ZVnY9Zr2OT7tm6PbBsGqr6v7P7tm5H88CBA9NzTpgwoZi96U1vKmZV/c7ZM+roo48uZrvuumsxu/3229Nzfu5znytmWb/s6tWr0+PqWibTpIe5SddyJjvumWeeWcx22mmn9Ljjx48vZv/6r/9avbBXUPXvQ2Tfuz1t3tkY/MIMAAAJAzMAACQMzAAAkDAwAwBAwsAMAAAJAzMAACTUyr1Mk6qZrKIlq2CpqsbJ8tGjRxezK6+8Mj3uNttsU8yyGq7sGlXVd7Wq/k2tHJmqusPMbrvtVsw++9nPFrMpU6akxx0xYkQxy9ZbVQWVyfZCV1dXMfurv/qr9LhXXHFFMbv88suL2YwZM9LjPv3002nOpq2q2qzud3Ld10XU/+6sklUs1q2+bFINp1YOAAD4MwZmAABIGJgBACBhYAYAgISBGQAAEgZmAABIqJV7marKpqxKpW51XFXt2bbbblvMPvWpTxWzrDYuImLVqlXF7PHHHy9mWR1Wq1RV76mOq6c31fFl72WHHXZIX7v33nsXs/POO6+Y7bzzzsWs6lmSVUz161d+NLeqzqluNVWVI444opiNGzcufe2Pf/zj2uel92tyX7ZKq+rqHnnkkVrryZ7jTb5Xm7yXTuUXZgAASBiYAQAgYWAGAICEgRkAABIGZgAASBiYAQAgYWAGAICEHuaXaUd/4Oabb57mP/jBD4rZhAkTillVj+5HPvKRYnbhhRcWs1/96lfFbNddd03PmfU+boq9ju3WpIc56wrOXvv8888Xs/79+6fn7OrqqnXOj370o+lxTzvttDQvyd5L1rMcEfGTn/ykmC1durSYZf3pERFXX311MXv/+99fzLK+5GHDhqXnzK599plWXSPIVD2j6vY0t+r7Jjtu375909defvnlxawdnfl1/92JiM7r+H+JX5gBACBhYAYAgISBGQAAEgZmAABIGJgBACBhYAYAgIRauZdpUodStxZtzpw56TknTpxYzP7whz8Us9mzZ6fHveqqq4rZ0KFDi1n2PrPar4iIyy67rJhl1yg7Z9VrKWtS71O3EizbY01qxiZPnlzMTj755PS1da9DVq23YMGC9LVHHXVUMdtiiy2KWVZlFxGxevXqWms66aSTitlhhx2WnnPSpEnF7Pe//30xe/jhh9PjNqk9pPdr8r1Q996qmhGy787ddtutmM2bNy897uLFi4tZ3dmjqsouuw7ZcXvr3vQLMwAAJAzMAACQMDADAEDCwAwAAAkDMwAAJAzMAACQUCv3Mk3qUPr371/Msoq3adOmpcfNqraymrYvfelL6XGzepx3v/vdxWzkyJG1jhkRcc8996R5iVq51sju9+x+jsgrBLO6oqpatEx2HwwYMKCYVe3r7LjPPvtsMfvEJz5RzL71rW+l58zWlNVFNjFo0KBi9v73v7+YjRkzJj1u9l7e/OY3F7MlS5akx4UmWlFLWPW67bffvphl+6iqYjH7jqv7/Vf1XlpRy9fJ/MIMAAAJAzMAACQMzAAAkDAwAwBAwsAMAAAJAzMAACTUyq2nzTffvJidc845xezDH/5wMauqYLnmmmuK2YknnljMsmqviLzeK6vZyqpmqs5ZVTtXklXrVR23t1bctFpWGxeR3yPZvZXdI01qjg499NBillXOReT31/e///1illXHVb2Xunuh6rg77rhjMbvggguKWVV1XCb7XPbbb79idu+996bHza6RKkma3APZ8yu776r27dve9rZar616L3Xfazv2UG+tgfULMwAAJAzMAACQMDADAEDCwAwAAAkDMwAAJAzMAACQMDADAEBCD/N6es1rXlPMdt9992J2/PHHF7MjjzwyPeeMGTOK2YoVK9LXZrJ+xqxHsaoTOVPV01yXruV6mnweWddyJuvgbNJdfOONNxazD3zgA+lxBw4cWMwOPvjgYnbxxRcXs//zf/5Pes66PbCDBg1Kj3vyyScXs6wTuUlf67PPPlvM5s+fn74206l9rfR8de+tbbfdNs2/8IUvFLPsmVm3lz0iol+/8ihX9zkdkX8/NDlup/ILMwAAJAzMAACQMDADAEDCwAwAAAkDMwAAJAzMAACQUCv3MkOGDEnzT37yk8VswYIFxWzy5MnFbPr06ek5f//736d5XVmF13vf+95ittlmmxWzRx55JD3nypUri1mTCpuskkflXFmrqoGyyrSszqmqWin7LC+//PJidvTRR6fH/du//dtiNnr06GI2cuTIYvae97wnPWdWz5hdh/vvvz89brbe/v371zrn+eefn57z7LPPLmbLli2rdc6q3L6mSivun+z7L6L+vr7iiitqrScif4432Sd1q+6qzln3+6Hd/MIMAAAJAzMAACQMzAAAkDAwAwBAwsAMAAAJAzMAACTUyr3M0KFD0/wjH/lIMctq5U444YRitnz58sp1lTSpZ/n2t79dzLIavKw25xvf+EZ6zhUrVqR5SZO6MerJav4i8iqjutVxrfocv/SlL6X5EUccUcwGDx5czPr1Kz9Cq/Zf3dfusssu6XGz6riurq5iln3e8+bNS8/54IMPpnmJfUsrZd+P2fMre0Zleygi30dN6iIz2T7KrkHV/su+65sctydXx2X8wgwAAAkDMwAAJAzMAACQMDADAEDCwAwAAAkDMwAAJAzMAACQ2CA9zFkfX0TeuZd1FmY9iVWy4x544IHF7JBDDkmPe8455xSzpUuXFrP77rsvPW5d2bWdOHFi+tp3vetdxWyzzTYrZlmX5CWXXJKeM9OkU7od3b69XZP9l2nH5/Fv//ZvaT58+PBi9slPfrKYXXvttcVs9erV6TnnzJlTzN761rcWsy233DI9bva5Zc/FLFu5cmXtczbZm/Y1marZo+4zLLu3mvybAHfddVcxu/vuuyvXVUerOo87tUu5Cb8wAwBAwsAMAAAJAzMAACQMzAAAkDAwAwBAwsAMAACJbtfK9e/fv5h1dXW15LVNKoWyypNp06YVs6222io9bt3XZu+lX7/8Y1i7dm0x++u//utidv7556fHHThwYDHL1nvVVVcVsyeeeCI9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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "pattern_get_class = re.compile(r'origin_data/MNIST_data/train/train_\\d+_(\\d).jpg')\n", "path = './origin_data/MNIST_data/train'\n", "fnames = get_image_files(path)\n", "\n", "dls = ImageDataLoaders.from_path_re(\n", " path, fnames, pattern_get_class, valid_pct=0.2, seed=42, item_tfms=Resize(28))\n", "dls.show_batch()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\xuyax\\anaconda3\\envs\\tesseract\\lib\\site-packages\\torchvision\\models\\_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.\n", " warnings.warn(\n", "c:\\Users\\xuyax\\anaconda3\\envs\\tesseract\\lib\\site-packages\\torchvision\\models\\_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=ResNet34_Weights.IMAGENET1K_V1`. You can also use `weights=ResNet34_Weights.DEFAULT` to get the most up-to-date weights.\n", " warnings.warn(msg)\n" ] }, { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_losserror_ratetime
00.7161980.4887280.15350002:11
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_losserror_ratetime
00.0942920.0552680.01841708:30
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "learn = vision_learner(dls, resnet34, metrics=error_rate)\n", "learn.fine_tune(1)\n", "learn.export('model.pkl')" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAARGVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAAcoAMABAAAAAEAAAAcAAAAAGS99KIAAAElSURBVHic7ZOxioMwGIBjwVgcBHFxc3XQKbg4uvoE7g4dnHwCZzefoX0FxVHI6iiItCAuLoLgIlVQbysc13KxOhxcvzGELx9/EgA+/CkghLIs7yzVdZ1l2Z/rB3IFRVEPBcdxtm2rqtr3/aYu3/fneW7btuu6pmkcx3l5PKHRMAyGYY7HI03T1+s1z/P7/b6pked50zTJ9xPN1HXdoijeTXoBxvh2uxmGsadUEIQ4jqdpOp1Oe3ohhGma1nV9OPw+MdJ3Oo7j5XJhGGZZlt2kAABJkpIkIZGuIE1TRVFIdpKWapoWhmGWZRuqviOKoud5u+kAAKqqWpZFcukPnvx9hFDXdVVVIYQQQmVZRlG0quOJlGXZIAgghBjj8/k8DMMq44d/zhce+2HcZnzrUQAAAABJRU5ErkJggg==", "text/plain": [ "PILImage mode=RGB size=28x28" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# path = '4.jpg'\n", "path = '5.png'\n", "img = PILImage.create(path)\n", "img" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "('3',\n", " TensorBase(3),\n", " TensorBase([6.3668e-07, 1.2593e-05, 4.9185e-05, 9.0997e-01, 8.6236e-06, 8.9614e-02, 2.0983e-06, 2.7297e-04, 2.3416e-05, 4.7457e-05]))" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "learn.predict(img)" ] } ], "metadata": { "kernelspec": { "display_name": "tesseract", "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.9.15" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "c8334dffe72b6a881969c3515475442b0cf3f3c8c06d8151aebf952bb4134fbe" } } }, "nbformat": 4, "nbformat_minor": 2 }