|
26 | 26 | "cell_type": "code",
|
27 | 27 | "execution_count": 2,
|
28 | 28 | "metadata": {},
|
| 29 | + "outputs": [], |
| 30 | + "source": [ |
| 31 | + "# Force one-gpu\n", |
| 32 | + "os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"0\"" |
| 33 | + ] |
| 34 | + }, |
| 35 | + { |
| 36 | + "cell_type": "code", |
| 37 | + "execution_count": 3, |
| 38 | + "metadata": {}, |
29 | 39 | "outputs": [
|
30 | 40 | {
|
31 | 41 | "name": "stdout",
|
|
34 | 44 | "OS: linux\n",
|
35 | 45 | "Python: 3.5.2 |Anaconda custom (64-bit)| (default, Jul 2 2016, 17:53:06) \n",
|
36 | 46 | "[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]\n",
|
37 |
| - "Numpy: 1.13.3\n", |
38 |
| - "CNTK: 2.2\n", |
39 |
| - "GPU: ['Tesla K80']\n" |
| 47 | + "Numpy: 1.14.1\n", |
| 48 | + "CNTK: 2.4\n", |
| 49 | + "GPU: ['Tesla P100-PCIE-16GB', 'Tesla P100-PCIE-16GB']\n", |
| 50 | + "CUDA Version 8.0.61\n", |
| 51 | + "CuDNN Version 6.0.21\n" |
40 | 52 | ]
|
41 | 53 | }
|
42 | 54 | ],
|
|
45 | 57 | "print(\"Python: \", sys.version)\n",
|
46 | 58 | "print(\"Numpy: \", np.__version__)\n",
|
47 | 59 | "print(\"CNTK: \", cntk.__version__)\n",
|
48 |
| - "print(\"GPU: \", get_gpu_name())" |
| 60 | + "print(\"GPU: \", get_gpu_name())\n", |
| 61 | + "print(get_cuda_version())\n", |
| 62 | + "print(\"CuDNN Version \", get_cudnn_version())" |
49 | 63 | ]
|
50 | 64 | },
|
51 | 65 | {
|
52 | 66 | "cell_type": "code",
|
53 |
| - "execution_count": 3, |
| 67 | + "execution_count": 4, |
54 | 68 | "metadata": {},
|
55 | 69 | "outputs": [],
|
56 | 70 | "source": [
|
57 |
| - "def create_symbol():\n", |
| 71 | + "def create_symbol(n_classes=N_CLASSES):\n", |
58 | 72 | " # Weight initialiser from uniform distribution\n",
|
59 | 73 | " # Activation (unless states) is None\n",
|
60 | 74 | " with cntk.layers.default_options(init = cntk.glorot_uniform(), activation = cntk.relu):\n",
|
|
70 | 84 | " \n",
|
71 | 85 | " x = Dense(512)(x)\n",
|
72 | 86 | " x = Dropout(0.5)(x)\n",
|
73 |
| - " x = Dense(N_CLASSES, activation=None)(x)\n", |
| 87 | + " x = Dense(n_classes, activation=None)(x)\n", |
74 | 88 | " return x"
|
75 | 89 | ]
|
76 | 90 | },
|
77 | 91 | {
|
78 | 92 | "cell_type": "code",
|
79 |
| - "execution_count": 4, |
| 93 | + "execution_count": 5, |
80 | 94 | "metadata": {},
|
81 | 95 | "outputs": [],
|
82 | 96 | "source": [
|
83 |
| - "def init_model(m):\n", |
| 97 | + "def init_model(m, labels, lr=LR, momentum=MOMENTUM):\n", |
84 | 98 | " # Loss (dense labels); check if support for sparse labels\n",
|
85 | 99 | " loss = cntk.cross_entropy_with_softmax(m, labels) \n",
|
86 | 100 | " # Momentum SGD\n",
|
87 | 101 | " # https://github.com/Microsoft/CNTK/blob/master/Manual/Manual_How_to_use_learners.ipynb\n",
|
88 | 102 | " # unit_gain=False: momentum_direction = momentum*old_momentum_direction + gradient\n",
|
89 | 103 | " # if unit_gain=True then ...(1-momentum)*gradient\n",
|
90 | 104 | " learner = cntk.momentum_sgd(m.parameters,\n",
|
91 |
| - " lr=cntk.learning_rate_schedule(LR, cntk.UnitType.minibatch) ,\n", |
92 |
| - " momentum=cntk.momentum_schedule(MOMENTUM), \n", |
| 105 | + " lr=cntk.learning_rate_schedule(lr, cntk.UnitType.minibatch) ,\n", |
| 106 | + " momentum=cntk.momentum_schedule(momentum), \n", |
93 | 107 | " unit_gain=False)\n",
|
94 | 108 | " trainer = cntk.Trainer(m, (loss, cntk.classification_error(m, labels)), [learner])\n",
|
95 | 109 | " return trainer"
|
96 | 110 | ]
|
97 | 111 | },
|
98 | 112 | {
|
99 | 113 | "cell_type": "code",
|
100 |
| - "execution_count": 5, |
| 114 | + "execution_count": 6, |
101 | 115 | "metadata": {},
|
102 | 116 | "outputs": [
|
103 | 117 | {
|
|
108 | 122 | "Preparing test set...\n",
|
109 | 123 | "(50000, 3, 32, 32) (10000, 3, 32, 32) (50000, 10) (10000, 10)\n",
|
110 | 124 | "float32 float32 float32 float32\n",
|
111 |
| - "CPU times: user 833 ms, sys: 553 ms, total: 1.39 s\n", |
112 |
| - "Wall time: 1.38 s\n" |
| 125 | + "CPU times: user 671 ms, sys: 576 ms, total: 1.25 s\n", |
| 126 | + "Wall time: 1.25 s\n" |
113 | 127 | ]
|
114 | 128 | }
|
115 | 129 | ],
|
|
126 | 140 | },
|
127 | 141 | {
|
128 | 142 | "cell_type": "code",
|
129 |
| - "execution_count": 6, |
| 143 | + "execution_count": 7, |
130 | 144 | "metadata": {},
|
131 | 145 | "outputs": [
|
132 | 146 | {
|
133 | 147 | "name": "stdout",
|
134 | 148 | "output_type": "stream",
|
135 | 149 | "text": [
|
136 |
| - "CPU times: user 22.6 ms, sys: 28.6 ms, total: 51.2 ms\n", |
137 |
| - "Wall time: 76.1 ms\n" |
| 150 | + "CPU times: user 24 ms, sys: 32 ms, total: 56 ms\n", |
| 151 | + "Wall time: 69 ms\n" |
138 | 152 | ]
|
139 | 153 | }
|
140 | 154 | ],
|
|
149 | 163 | },
|
150 | 164 | {
|
151 | 165 | "cell_type": "code",
|
152 |
| - "execution_count": 7, |
| 166 | + "execution_count": 8, |
153 | 167 | "metadata": {},
|
154 | 168 | "outputs": [
|
155 | 169 | {
|
156 | 170 | "name": "stdout",
|
157 | 171 | "output_type": "stream",
|
158 | 172 | "text": [
|
159 |
| - "CPU times: user 72.1 ms, sys: 224 ms, total: 297 ms\n", |
160 |
| - "Wall time: 303 ms\n" |
| 173 | + "CPU times: user 119 ms, sys: 116 ms, total: 235 ms\n", |
| 174 | + "Wall time: 236 ms\n" |
161 | 175 | ]
|
162 | 176 | }
|
163 | 177 | ],
|
164 | 178 | "source": [
|
165 | 179 | "%%time\n",
|
166 |
| - "trainer = init_model(sym)" |
| 180 | + "trainer = init_model(sym, labels)" |
167 | 181 | ]
|
168 | 182 | },
|
169 | 183 | {
|
170 | 184 | "cell_type": "code",
|
171 |
| - "execution_count": 8, |
| 185 | + "execution_count": 9, |
172 | 186 | "metadata": {},
|
173 | 187 | "outputs": [
|
174 | 188 | {
|
175 | 189 | "name": "stdout",
|
176 | 190 | "output_type": "stream",
|
177 | 191 | "text": [
|
178 |
| - "Epoch 1 | Accuracy: 0.562500\n", |
| 192 | + "Epoch 1 | Accuracy: 0.468750\n", |
179 | 193 | "Epoch 2 | Accuracy: 0.640625\n",
|
180 |
| - "Epoch 3 | Accuracy: 0.625000\n", |
181 |
| - "Epoch 4 | Accuracy: 0.703125\n", |
182 |
| - "Epoch 5 | Accuracy: 0.703125\n", |
183 |
| - "Epoch 6 | Accuracy: 0.765625\n", |
184 |
| - "Epoch 7 | Accuracy: 0.859375\n", |
185 |
| - "Epoch 8 | Accuracy: 0.796875\n", |
186 |
| - "Epoch 9 | Accuracy: 0.781250\n", |
187 |
| - "Epoch 10 | Accuracy: 0.796875\n", |
188 |
| - "CPU times: user 2min 19s, sys: 21.4 s, total: 2min 40s\n", |
189 |
| - "Wall time: 2min 43s\n" |
| 194 | + "Epoch 3 | Accuracy: 0.609375\n", |
| 195 | + "Epoch 4 | Accuracy: 0.578125\n", |
| 196 | + "Epoch 5 | Accuracy: 0.812500\n", |
| 197 | + "Epoch 6 | Accuracy: 0.781250\n", |
| 198 | + "Epoch 7 | Accuracy: 0.671875\n", |
| 199 | + "Epoch 8 | Accuracy: 0.843750\n", |
| 200 | + "Epoch 9 | Accuracy: 0.796875\n", |
| 201 | + "Epoch 10 | Accuracy: 0.843750\n", |
| 202 | + "CPU times: user 40.3 s, sys: 13.1 s, total: 53.3 s\n", |
| 203 | + "Wall time: 53.2 s\n" |
190 | 204 | ]
|
191 | 205 | }
|
192 | 206 | ],
|
193 | 207 | "source": [
|
194 | 208 | "%%time \n",
|
195 |
| - "# 163s\n", |
196 |
| - "# Train model\n", |
| 209 | + "# Main training loop: 53s\n", |
197 | 210 | "for j in range(EPOCHS):\n",
|
198 | 211 | " for data, label in yield_mb(x_train, y_train, BATCHSIZE, shuffle=True):\n",
|
199 | 212 | " trainer.train_minibatch({features: data, labels: label})\n",
|
|
204 | 217 | },
|
205 | 218 | {
|
206 | 219 | "cell_type": "code",
|
207 |
| - "execution_count": 9, |
| 220 | + "execution_count": 10, |
208 | 221 | "metadata": {},
|
209 | 222 | "outputs": [
|
210 | 223 | {
|
211 | 224 | "name": "stdout",
|
212 | 225 | "output_type": "stream",
|
213 | 226 | "text": [
|
214 |
| - "CPU times: user 850 ms, sys: 337 ms, total: 1.19 s\n", |
215 |
| - "Wall time: 1.4 s\n" |
| 227 | + "CPU times: user 291 ms, sys: 88.9 ms, total: 379 ms\n", |
| 228 | + "Wall time: 408 ms\n" |
216 | 229 | ]
|
217 | 230 | }
|
218 | 231 | ],
|
219 | 232 | "source": [
|
220 | 233 | "%%time\n",
|
221 |
| - "# Predict and then score accuracy\n", |
222 |
| - "# (We don't need softmax -> monotonic function)\n", |
| 234 | + "# Main evaluation loop: 343ms\n", |
223 | 235 | "n_samples = (y_test.shape[0]//BATCHSIZE)*BATCHSIZE\n",
|
224 | 236 | "y_guess = np.zeros(n_samples, dtype=np.int)\n",
|
225 | 237 | "y_truth = np.argmax(y_test[:n_samples], axis=-1)\n",
|
|
232 | 244 | },
|
233 | 245 | {
|
234 | 246 | "cell_type": "code",
|
235 |
| - "execution_count": 10, |
| 247 | + "execution_count": 11, |
236 | 248 | "metadata": {},
|
237 | 249 | "outputs": [
|
238 | 250 | {
|
239 | 251 | "name": "stdout",
|
240 | 252 | "output_type": "stream",
|
241 | 253 | "text": [
|
242 |
| - "Accuracy: 0.780649038462\n" |
| 254 | + "Accuracy: 0.7701322115384616\n" |
243 | 255 | ]
|
244 | 256 | }
|
245 | 257 | ],
|
|
251 | 263 | "metadata": {
|
252 | 264 | "anaconda-cloud": {},
|
253 | 265 | "kernelspec": {
|
254 |
| - "display_name": "Python [default]", |
| 266 | + "display_name": "Python 3", |
255 | 267 | "language": "python",
|
256 | 268 | "name": "python3"
|
257 | 269 | },
|
|
0 commit comments