1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%load_ext autoreload\n",
"%autoreload 2\n",
"\n",
"%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"from importlib.util import find_spec\n",
"if find_spec(\"text_recognizer\") is None:\n",
" import sys\n",
" sys.path.append('..')\n",
"\n",
"from text_recognizer.data.emnist import EMNIST"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"EMNIST Dataset\n",
"Num classes: 83\n",
"Mapping: ['<b>', '<s>', '</s>', '<p>', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ' ', '!', '\"', '#', '&', \"'\", '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '?']\n",
"Dims: (1, 28, 28)\n",
"Train/val/test sizes: 260276, 65070, 54028\n",
"Batch x stats: (torch.Size([128, 1, 28, 28]), torch.float32, tensor(0.), tensor(0.1673), tensor(0.3277), tensor(1.))\n",
"Batch y stats: (torch.Size([128]), torch.int64, tensor(4), tensor(65))\n",
"\n"
]
}
],
"source": [
"data = EMNIST()\n",
"data.prepare_data()\n",
"data.setup()\n",
"print(data)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"torch.Size([128, 1, 28, 28]) torch.float32 tensor(0.) tensor(0.2204) tensor(0.3593) tensor(1.)\n",
"torch.Size([128]) torch.int64 tensor(4) tensor(4)\n"
]
}
],
"source": [
"x, y = next(iter(data.test_dataloader()))\n",
"print(x.shape, x.dtype, x.min(), x.mean(), x.std(), x.max())\n",
"print(y.shape, y.dtype, y.min(), y.max())"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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js30eIcccki47ZSSy37+85+7bN68eS6LlkLesmVLuJ0m0DQ1HC2pHTU8/s3f/E14/xUrVrjs05/+tMsWLlzosqxLXY8ePdplZ599dnjbXr16uez111/PtJ0y4S0PAACQW94JRZL0WzN73Mz8eTqSzGyqmc0zM//fB6AY3rWOqWGUADWMhsv7lsexKaXlZjZU0r1m9qeU0twdb5BSmi5puiSZmT92CTTeu9YxNYwSoIbRcLmOUKSUllc+r5Q0W9IR1RgUUE/UMcqOGkYRdPkIhZntLmmXlNL6ytcflvS1qo2syUWrrI0aNcplF1xwgcvGjx/vspNOOincTtT4s2TJEpfde++9LsvanFRm3aWOo3rbc889w9vut99+LvvgBz/osqOOOsplxx57rMsGDRqUaTztrRwYNWWecMIJLosa7P7+7//eZQsWLMi0jbIoew1Hv/fTTz/dZV/84hdddvHFF4ePOXv2bJe9+eabXRhdm6heoxqMXsOleJXOW265xWVlf83N85bHMEmzK090T0n/mVK6pyqjAuqHOkbZUcMohC5PKFJKL0h6bxXHAtQddYyyo4ZRFJw2CgAAcmNCAQAAcuPy5Q0SXYo3WmVwypQpLhs+fHjm7fz3f/+3y6IVBV955ZXMj4ni6N27t8ui+thrr71c1l5D26RJkzI9ZrTtel2SeciQIS6LmkSj1RX/8R//0WWrVzfFApOlFNXM+973Ppf913/9l8tuvfXW8DGzXso+WpEzalb+7Gc/67KojqLXdUm69tprXRY1apYdRygAAEBuTCgAAEBuTCgAAEBuTCgAAEBuNGVWWZ8+fVy29957uyxaAfNTn/qUy6KV16LLL99+++3heP75n//ZZX/+859dlmcVOdRHdMnvU0891WVf+tKXXBY1MbbX3Bs1W2YVrfS3du1al0UruEaXQ5filTYj0biPOMKvQD1w4ECX0ZRZLFF9HH744S77yle+Et4/68qnhx12mMui5t5XX33VZTfffLPLzj333HA769evzzSesuMIBQAAyI0JBQAAyI0JBQAAyI0JBQAAyI2mzC5qb0W0s88+22VR41y0Ambfvn1dtmHDBpdFlx+/5pprwvE8//zzLivzpZq7i6jBMKqjadOmuSxaZTBaEbAzNm7c6LJnn33WZffee6/LotVaoybgqJlUko4++miXRZeTjlZHjC5p/tpr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\n",
"text/plain": [
"<Figure size 648x648 with 9 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure(figsize=(9, 9))\n",
"for i in range(9):\n",
" ax = fig.add_subplot(3, 3, i + 1)\n",
" rand_i = np.random.randint(len(data.data_test))\n",
" image, label = data.data_test[rand_i]\n",
" ax.imshow(image.reshape(28, 28), cmap='gray')\n",
" ax.set_title(data.mapping[label])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.1"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
|