diff --git a/main/experiments/graph_drawing/november_2018/classif_end_to_end_subsample_conv_hand_with_augment/classif_end_to_end_subsample_conv_hand.ipynb b/main/experiments/graph_drawing/november_2018/classif_end_to_end_subsample_conv_hand_with_augment/classif_end_to_end_subsample_conv_hand.ipynb index f06991180829096d2cf5d7bcf19265885b97a66b..86e52a11743afadeabe47a50394fc239d8b0719e 100644 --- a/main/experiments/graph_drawing/november_2018/classif_end_to_end_subsample_conv_hand_with_augment/classif_end_to_end_subsample_conv_hand.ipynb +++ b/main/experiments/graph_drawing/november_2018/classif_end_to_end_subsample_conv_hand_with_augment/classif_end_to_end_subsample_conv_hand.ipynb @@ -9,7 +9,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "2018-11-12 13:00:51,016 [20064] DEBUG matplotlib.backends: backend module://ipykernel.pylab.backend_inline version unknown\n" + "2018-11-21 16:40:40,775 [24133] DEBUG matplotlib.backends: backend module://ipykernel.pylab.backend_inline version unknown\n" ] } ], @@ -42,7 +42,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -77,6 +77,7 @@ " <th>training_time</th>\n", " <th>val_acc</th>\n", " <th>val_eval_time</th>\n", + " <th>file_timestamp</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", @@ -85,322 +86,343 @@ " <td>64</td>\n", " <td>64</td>\n", " <td>None</td>\n", - " <td>1</td>\n", - " <td>svhn</td>\n", + " <td>50</td>\n", + " <td>mnist</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.196694</td>\n", - " <td>3.208492</td>\n", - " <td>13886.173297</td>\n", - " <td>0.1881</td>\n", - " <td>1.850464</td>\n", + " <td>0.899000</td>\n", + " <td>0.064964</td>\n", + " <td>26350.607944</td>\n", + " <td>0.8969</td>\n", + " <td>0.115967</td>\n", + " <td>1542209490</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>64</td>\n", - " <td>4</td>\n", + " <td>8</td>\n", " <td>None</td>\n", - " <td>1</td>\n", - " <td>cifar10</td>\n", + " <td>50</td>\n", + " <td>svhn</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.100000</td>\n", - " <td>3.628797</td>\n", - " <td>15535.717329</td>\n", - " <td>0.1006</td>\n", - " <td>5.754008</td>\n", + " <td>0.196694</td>\n", + " <td>3.221060</td>\n", + " <td>153978.042774</td>\n", + " <td>0.1881</td>\n", + " <td>1.785691</td>\n", + " <td>1542242240</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>64</td>\n", " <td>64</td>\n", " <td>None</td>\n", - " <td>1</td>\n", - " <td>mnist</td>\n", + " <td>50</td>\n", + " <td>cifar10</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.980800</td>\n", - " <td>0.067135</td>\n", - " <td>743.633713</td>\n", - " <td>0.9794</td>\n", - " <td>0.071094</td>\n", + " <td>0.857200</td>\n", + " <td>3.840925</td>\n", + " <td>35606.153394</td>\n", + " <td>0.8645</td>\n", + " <td>5.962165</td>\n", + " <td>1542228549</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>64</td>\n", - " <td>8</td>\n", + " <td>256</td>\n", " <td>None</td>\n", - " <td>1</td>\n", - " <td>mnist</td>\n", + " <td>50</td>\n", + " <td>svhn</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.953400</td>\n", - " <td>0.055799</td>\n", - " <td>907.542290</td>\n", - " <td>0.9486</td>\n", - " <td>0.102491</td>\n", + " <td>0.196694</td>\n", + " <td>10.474136</td>\n", + " <td>116107.833837</td>\n", + " <td>0.1881</td>\n", + " <td>6.086989</td>\n", + " <td>1542266269</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>64</td>\n", - " <td>16</td>\n", + " <td>512</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>svhn</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.196694</td>\n", - " <td>2.950274</td>\n", - " <td>11086.446670</td>\n", - " <td>0.1881</td>\n", - " <td>1.672408</td>\n", + " <td>0.949370</td>\n", + " <td>4.025452</td>\n", + " <td>75948.217098</td>\n", + " <td>0.9427</td>\n", + " <td>2.080920</td>\n", + " <td>1542266919</td>\n", " </tr>\n", " <tr>\n", " <th>5</th>\n", " <td>64</td>\n", " <td>512</td>\n", " <td>None</td>\n", - " <td>1</td>\n", - " <td>mnist</td>\n", + " <td>50</td>\n", + " <td>cifar10</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.975600</td>\n", - " <td>0.251814</td>\n", - " <td>1553.871543</td>\n", - " <td>0.9680</td>\n", - " <td>0.282160</td>\n", + " <td>0.871200</td>\n", + " <td>4.787930</td>\n", + " <td>56967.586779</td>\n", + " <td>0.8787</td>\n", + " <td>7.037983</td>\n", + " <td>1542231301</td>\n", " </tr>\n", " <tr>\n", " <th>6</th>\n", " <td>64</td>\n", - " <td>128</td>\n", + " <td>4</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>mnist</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.981100</td>\n", - " <td>0.172114</td>\n", - " <td>1250.739039</td>\n", - " <td>0.9792</td>\n", - " <td>0.223121</td>\n", + " <td>0.550200</td>\n", + " <td>0.033261</td>\n", + " <td>12351.705050</td>\n", + " <td>0.5486</td>\n", + " <td>0.068031</td>\n", + " <td>1542199505</td>\n", " </tr>\n", " <tr>\n", " <th>7</th>\n", " <td>64</td>\n", " <td>8</td>\n", " <td>None</td>\n", - " <td>1</td>\n", - " <td>cifar10</td>\n", + " <td>50</td>\n", + " <td>mnist</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.100000</td>\n", - " <td>3.588938</td>\n", - " <td>16039.019309</td>\n", - " <td>0.0947</td>\n", - " <td>5.784028</td>\n", + " <td>0.812400</td>\n", + " <td>0.070989</td>\n", + " <td>13508.359984</td>\n", + " <td>0.8031</td>\n", + " <td>0.077030</td>\n", + " <td>1542202109</td>\n", " </tr>\n", " <tr>\n", " <th>8</th>\n", " <td>64</td>\n", - " <td>256</td>\n", + " <td>8</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>cifar10</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.100000</td>\n", - " <td>1.338811</td>\n", - " <td>25427.858178</td>\n", - " <td>0.1006</td>\n", - " <td>1.951765</td>\n", + " <td>0.771400</td>\n", + " <td>3.931015</td>\n", + " <td>52235.161493</td>\n", + " <td>0.7742</td>\n", + " <td>6.280008</td>\n", + " <td>1542226665</td>\n", " </tr>\n", " <tr>\n", " <th>9</th>\n", " <td>64</td>\n", - " <td>128</td>\n", + " <td>4</td>\n", " <td>None</td>\n", - " <td>1</td>\n", - " <td>svhn</td>\n", + " <td>50</td>\n", + " <td>cifar10</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.196694</td>\n", - " <td>3.169210</td>\n", - " <td>16867.399688</td>\n", - " <td>0.1881</td>\n", - " <td>1.771410</td>\n", + " <td>0.416900</td>\n", + " <td>3.507496</td>\n", + " <td>50602.315975</td>\n", + " <td>0.4124</td>\n", + " <td>5.679052</td>\n", + " <td>1542215637</td>\n", " </tr>\n", " <tr>\n", " <th>10</th>\n", " <td>64</td>\n", - " <td>512</td>\n", + " <td>128</td>\n", " <td>None</td>\n", - " <td>1</td>\n", - " <td>svhn</td>\n", + " <td>50</td>\n", + " <td>cifar10</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.196694</td>\n", - " <td>12.052618</td>\n", - " <td>61869.212071</td>\n", - " <td>0.1881</td>\n", - " <td>6.758391</td>\n", + " <td>0.866000</td>\n", + " <td>4.048859</td>\n", + " <td>52158.011988</td>\n", + " <td>0.8743</td>\n", + " <td>6.378982</td>\n", + " <td>1542230395</td>\n", " </tr>\n", " <tr>\n", " <th>11</th>\n", " <td>64</td>\n", - " <td>16</td>\n", + " <td>128</td>\n", " <td>None</td>\n", - " <td>1</td>\n", - " <td>mnist</td>\n", + " <td>50</td>\n", + " <td>svhn</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.977400</td>\n", - " <td>0.047079</td>\n", - " <td>709.143471</td>\n", - " <td>0.9740</td>\n", - " <td>0.058902</td>\n", + " <td>0.949639</td>\n", + " <td>9.729126</td>\n", + " <td>74122.297888</td>\n", + " <td>0.9451</td>\n", + " <td>5.790046</td>\n", + " <td>1542264179</td>\n", " </tr>\n", " <tr>\n", " <th>12</th>\n", " <td>64</td>\n", - " <td>512</td>\n", + " <td>4</td>\n", " <td>None</td>\n", - " <td>1</td>\n", - " <td>cifar10</td>\n", + " <td>50</td>\n", + " <td>svhn</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.100300</td>\n", - " <td>1.599234</td>\n", - " <td>15467.515219</td>\n", - " <td>0.1027</td>\n", - " <td>2.256960</td>\n", + " <td>0.196694</td>\n", + " <td>3.032919</td>\n", + " <td>153685.657897</td>\n", + " <td>0.1881</td>\n", + " <td>1.741903</td>\n", + " <td>1542235855</td>\n", " </tr>\n", " <tr>\n", " <th>13</th>\n", " <td>64</td>\n", " <td>256</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>mnist</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.981000</td>\n", - " <td>0.316930</td>\n", - " <td>1750.582823</td>\n", - " <td>0.9796</td>\n", - " <td>0.320844</td>\n", + " <td>0.893000</td>\n", + " <td>0.159199</td>\n", + " <td>13036.495552</td>\n", + " <td>0.8919</td>\n", + " <td>0.163529</td>\n", + " <td>1542213923</td>\n", " </tr>\n", " <tr>\n", " <th>14</th>\n", " <td>64</td>\n", - " <td>8</td>\n", + " <td>128</td>\n", " <td>None</td>\n", - " <td>1</td>\n", - " <td>svhn</td>\n", + " <td>50</td>\n", + " <td>mnist</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.196694</td>\n", - " <td>3.106948</td>\n", - " <td>10786.248278</td>\n", - " <td>0.1881</td>\n", - " <td>1.732185</td>\n", + " <td>0.891800</td>\n", + " <td>0.172438</td>\n", + " <td>18421.614211</td>\n", + " <td>0.8869</td>\n", + " <td>0.222979</td>\n", + " <td>1542211961</td>\n", " </tr>\n", " <tr>\n", " <th>15</th>\n", " <td>64</td>\n", - " <td>4</td>\n", + " <td>64</td>\n", " <td>None</td>\n", - " <td>1</td>\n", - " <td>mnist</td>\n", + " <td>50</td>\n", + " <td>svhn</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.550400</td>\n", - " <td>0.079746</td>\n", - " <td>947.165308</td>\n", - " <td>0.5396</td>\n", - " <td>0.085806</td>\n", + " <td>0.196694</td>\n", + " <td>3.062441</td>\n", + " <td>72432.295633</td>\n", + " <td>0.1881</td>\n", + " <td>2.894550</td>\n", + " <td>1542259094</td>\n", " </tr>\n", " <tr>\n", " <th>16</th>\n", " <td>64</td>\n", - " <td>16</td>\n", + " <td>256</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>cifar10</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.100000</td>\n", - " <td>1.098922</td>\n", - " <td>6856.143636</td>\n", - " <td>0.1006</td>\n", - " <td>1.634924</td>\n", + " <td>0.868800</td>\n", + " <td>4.033883</td>\n", + " <td>55950.356706</td>\n", + " <td>0.8736</td>\n", + " <td>6.381946</td>\n", + " <td>1542231096</td>\n", " </tr>\n", " <tr>\n", " <th>17</th>\n", " <td>64</td>\n", - " <td>64</td>\n", + " <td>512</td>\n", " <td>None</td>\n", - " <td>1</td>\n", - " <td>cifar10</td>\n", + " <td>50</td>\n", + " <td>mnist</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.100000</td>\n", - " <td>3.969165</td>\n", - " <td>18917.706158</td>\n", - " <td>0.0947</td>\n", - " <td>6.365395</td>\n", + " <td>0.888600</td>\n", + " <td>0.561707</td>\n", + " <td>12977.160620</td>\n", + " <td>0.8778</td>\n", + " <td>0.575028</td>\n", + " <td>1542215550</td>\n", " </tr>\n", " <tr>\n", " <th>18</th>\n", " <td>64</td>\n", - " <td>128</td>\n", + " <td>16</td>\n", " <td>None</td>\n", - " <td>1</td>\n", - " <td>cifar10</td>\n", + " <td>50</td>\n", + " <td>svhn</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.100000</td>\n", - " <td>1.360681</td>\n", - " <td>9864.623720</td>\n", - " <td>0.0947</td>\n", - " <td>1.949636</td>\n", + " <td>0.196694</td>\n", + " <td>2.846475</td>\n", + " <td>72815.976671</td>\n", + " <td>0.1881</td>\n", + " <td>1.661851</td>\n", + " <td>1542255462</td>\n", " </tr>\n", " <tr>\n", " <th>19</th>\n", " <td>64</td>\n", - " <td>256</td>\n", + " <td>16</td>\n", " <td>None</td>\n", - " <td>1</td>\n", - " <td>svhn</td>\n", + " <td>50</td>\n", + " <td>mnist</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.196694</td>\n", - " <td>11.152896</td>\n", - " <td>45104.915969</td>\n", - " <td>0.1881</td>\n", - " <td>6.566199</td>\n", + " <td>0.843900</td>\n", + " <td>0.056367</td>\n", + " <td>10432.334221</td>\n", + " <td>0.8413</td>\n", + " <td>0.090400</td>\n", + " <td>1542205108</td>\n", " </tr>\n", " <tr>\n", " <th>20</th>\n", " <td>64</td>\n", - " <td>4</td>\n", + " <td>16</td>\n", " <td>None</td>\n", - " <td>1</td>\n", - " <td>svhn</td>\n", + " <td>50</td>\n", + " <td>cifar10</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.196694</td>\n", - " <td>10.198356</td>\n", - " <td>24755.796742</td>\n", - " <td>0.1881</td>\n", - " <td>6.264580</td>\n", + " <td>0.114000</td>\n", + " <td>1.127676</td>\n", + " <td>32099.498744</td>\n", + " <td>0.1219</td>\n", + " <td>1.698693</td>\n", + " <td>1542226974</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ - " --batch-size --nys-size --out-dim --subs-every dataset kernel test_acc test_eval_time training_time val_acc val_eval_time\n", - "0 64 64 None 1 svhn chi2_cpd 0.196694 3.208492 13886.173297 0.1881 1.850464\n", - "1 64 4 None 1 cifar10 chi2_cpd 0.100000 3.628797 15535.717329 0.1006 5.754008\n", - "2 64 64 None 1 mnist chi2_cpd 0.980800 0.067135 743.633713 0.9794 0.071094\n", - "3 64 8 None 1 mnist chi2_cpd 0.953400 0.055799 907.542290 0.9486 0.102491\n", - "4 64 16 None 1 svhn chi2_cpd 0.196694 2.950274 11086.446670 0.1881 1.672408\n", - "5 64 512 None 1 mnist chi2_cpd 0.975600 0.251814 1553.871543 0.9680 0.282160\n", - "6 64 128 None 1 mnist chi2_cpd 0.981100 0.172114 1250.739039 0.9792 0.223121\n", - "7 64 8 None 1 cifar10 chi2_cpd 0.100000 3.588938 16039.019309 0.0947 5.784028\n", - "8 64 256 None 1 cifar10 chi2_cpd 0.100000 1.338811 25427.858178 0.1006 1.951765\n", - "9 64 128 None 1 svhn chi2_cpd 0.196694 3.169210 16867.399688 0.1881 1.771410\n", - "10 64 512 None 1 svhn chi2_cpd 0.196694 12.052618 61869.212071 0.1881 6.758391\n", - "11 64 16 None 1 mnist chi2_cpd 0.977400 0.047079 709.143471 0.9740 0.058902\n", - "12 64 512 None 1 cifar10 chi2_cpd 0.100300 1.599234 15467.515219 0.1027 2.256960\n", - "13 64 256 None 1 mnist chi2_cpd 0.981000 0.316930 1750.582823 0.9796 0.320844\n", - "14 64 8 None 1 svhn chi2_cpd 0.196694 3.106948 10786.248278 0.1881 1.732185\n", - "15 64 4 None 1 mnist chi2_cpd 0.550400 0.079746 947.165308 0.5396 0.085806\n", - "16 64 16 None 1 cifar10 chi2_cpd 0.100000 1.098922 6856.143636 0.1006 1.634924\n", - "17 64 64 None 1 cifar10 chi2_cpd 0.100000 3.969165 18917.706158 0.0947 6.365395\n", - "18 64 128 None 1 cifar10 chi2_cpd 0.100000 1.360681 9864.623720 0.0947 1.949636\n", - "19 64 256 None 1 svhn chi2_cpd 0.196694 11.152896 45104.915969 0.1881 6.566199\n", - "20 64 4 None 1 svhn chi2_cpd 0.196694 10.198356 24755.796742 0.1881 6.264580" + " --batch-size --nys-size --out-dim --subs-every dataset kernel test_acc test_eval_time training_time val_acc val_eval_time file_timestamp\n", + "0 64 64 None 50 mnist chi2_cpd 0.899000 0.064964 26350.607944 0.8969 0.115967 1542209490\n", + "1 64 8 None 50 svhn chi2_cpd 0.196694 3.221060 153978.042774 0.1881 1.785691 1542242240\n", + "2 64 64 None 50 cifar10 chi2_cpd 0.857200 3.840925 35606.153394 0.8645 5.962165 1542228549\n", + "3 64 256 None 50 svhn chi2_cpd 0.196694 10.474136 116107.833837 0.1881 6.086989 1542266269\n", + "4 64 512 None 50 svhn chi2_cpd 0.949370 4.025452 75948.217098 0.9427 2.080920 1542266919\n", + "5 64 512 None 50 cifar10 chi2_cpd 0.871200 4.787930 56967.586779 0.8787 7.037983 1542231301\n", + "6 64 4 None 50 mnist chi2_cpd 0.550200 0.033261 12351.705050 0.5486 0.068031 1542199505\n", + "7 64 8 None 50 mnist chi2_cpd 0.812400 0.070989 13508.359984 0.8031 0.077030 1542202109\n", + "8 64 8 None 50 cifar10 chi2_cpd 0.771400 3.931015 52235.161493 0.7742 6.280008 1542226665\n", + "9 64 4 None 50 cifar10 chi2_cpd 0.416900 3.507496 50602.315975 0.4124 5.679052 1542215637\n", + "10 64 128 None 50 cifar10 chi2_cpd 0.866000 4.048859 52158.011988 0.8743 6.378982 1542230395\n", + "11 64 128 None 50 svhn chi2_cpd 0.949639 9.729126 74122.297888 0.9451 5.790046 1542264179\n", + "12 64 4 None 50 svhn chi2_cpd 0.196694 3.032919 153685.657897 0.1881 1.741903 1542235855\n", + "13 64 256 None 50 mnist chi2_cpd 0.893000 0.159199 13036.495552 0.8919 0.163529 1542213923\n", + "14 64 128 None 50 mnist chi2_cpd 0.891800 0.172438 18421.614211 0.8869 0.222979 1542211961\n", + "15 64 64 None 50 svhn chi2_cpd 0.196694 3.062441 72432.295633 0.1881 2.894550 1542259094\n", + "16 64 256 None 50 cifar10 chi2_cpd 0.868800 4.033883 55950.356706 0.8736 6.381946 1542231096\n", + "17 64 512 None 50 mnist chi2_cpd 0.888600 0.561707 12977.160620 0.8778 0.575028 1542215550\n", + "18 64 16 None 50 svhn chi2_cpd 0.196694 2.846475 72815.976671 0.1881 1.661851 1542255462\n", + "19 64 16 None 50 mnist chi2_cpd 0.843900 0.056367 10432.334221 0.8413 0.090400 1542205108\n", + "20 64 16 None 50 cifar10 chi2_cpd 0.114000 1.127676 32099.498744 0.1219 1.698693 1542226974" ] }, "metadata": {}, @@ -428,7 +450,7 @@ " df = df.drop([c], axis=1)\n", " return df\n", "\n", - "DIRNAME_BIG = \"/home/luc/Resultats/Deepstrom/november_2018/classif_end_to_end_subsample_conv_hand\"\n", + "DIRNAME_BIG = \"/home/luc/Resultats/Deepstrom/november_2018/end_to_end_subsample_conv_hand_with_augment\"\n", "FILENAME_BIG = \"gathered_results.csv\"\n", "df = build_df()\n", "display(df)" @@ -436,7 +458,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -471,123 +493,131 @@ " <th>training_time</th>\n", " <th>val_acc</th>\n", " <th>val_eval_time</th>\n", + " <th>file_timestamp</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", - " <th>6</th>\n", + " <th>0</th>\n", + " <td>64</td>\n", " <td>64</td>\n", - " <td>128</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>mnist</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.9811</td>\n", - " <td>0.172114</td>\n", - " <td>1250.739039</td>\n", - " <td>0.9792</td>\n", - " <td>0.223121</td>\n", + " <td>0.8990</td>\n", + " <td>0.064964</td>\n", + " <td>26350.607944</td>\n", + " <td>0.8969</td>\n", + " <td>0.115967</td>\n", + " <td>1542209490</td>\n", " </tr>\n", " <tr>\n", " <th>13</th>\n", " <td>64</td>\n", " <td>256</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>mnist</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.9810</td>\n", - " <td>0.316930</td>\n", - " <td>1750.582823</td>\n", - " <td>0.9796</td>\n", - " <td>0.320844</td>\n", + " <td>0.8930</td>\n", + " <td>0.159199</td>\n", + " <td>13036.495552</td>\n", + " <td>0.8919</td>\n", + " <td>0.163529</td>\n", + " <td>1542213923</td>\n", " </tr>\n", " <tr>\n", - " <th>2</th>\n", - " <td>64</td>\n", + " <th>14</th>\n", " <td>64</td>\n", + " <td>128</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>mnist</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.9808</td>\n", - " <td>0.067135</td>\n", - " <td>743.633713</td>\n", - " <td>0.9794</td>\n", - " <td>0.071094</td>\n", + " <td>0.8918</td>\n", + " <td>0.172438</td>\n", + " <td>18421.614211</td>\n", + " <td>0.8869</td>\n", + " <td>0.222979</td>\n", + " <td>1542211961</td>\n", " </tr>\n", " <tr>\n", - " <th>11</th>\n", + " <th>17</th>\n", " <td>64</td>\n", - " <td>16</td>\n", + " <td>512</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>mnist</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.9774</td>\n", - " <td>0.047079</td>\n", - " <td>709.143471</td>\n", - " <td>0.9740</td>\n", - " <td>0.058902</td>\n", + " <td>0.8886</td>\n", + " <td>0.561707</td>\n", + " <td>12977.160620</td>\n", + " <td>0.8778</td>\n", + " <td>0.575028</td>\n", + " <td>1542215550</td>\n", " </tr>\n", " <tr>\n", - " <th>5</th>\n", + " <th>19</th>\n", " <td>64</td>\n", - " <td>512</td>\n", + " <td>16</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>mnist</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.9756</td>\n", - " <td>0.251814</td>\n", - " <td>1553.871543</td>\n", - " <td>0.9680</td>\n", - " <td>0.282160</td>\n", + " <td>0.8439</td>\n", + " <td>0.056367</td>\n", + " <td>10432.334221</td>\n", + " <td>0.8413</td>\n", + " <td>0.090400</td>\n", + " <td>1542205108</td>\n", " </tr>\n", " <tr>\n", - " <th>3</th>\n", + " <th>7</th>\n", " <td>64</td>\n", " <td>8</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>mnist</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.9534</td>\n", - " <td>0.055799</td>\n", - " <td>907.542290</td>\n", - " <td>0.9486</td>\n", - " <td>0.102491</td>\n", + " <td>0.8124</td>\n", + " <td>0.070989</td>\n", + " <td>13508.359984</td>\n", + " <td>0.8031</td>\n", + " <td>0.077030</td>\n", + " <td>1542202109</td>\n", " </tr>\n", " <tr>\n", - " <th>15</th>\n", + " <th>6</th>\n", " <td>64</td>\n", " <td>4</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>mnist</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.5504</td>\n", - " <td>0.079746</td>\n", - " <td>947.165308</td>\n", - " <td>0.5396</td>\n", - " <td>0.085806</td>\n", + " <td>0.5502</td>\n", + " <td>0.033261</td>\n", + " <td>12351.705050</td>\n", + " <td>0.5486</td>\n", + " <td>0.068031</td>\n", + " <td>1542199505</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ - " --batch-size --nys-size --out-dim --subs-every dataset kernel test_acc test_eval_time training_time val_acc val_eval_time\n", - "6 64 128 None 1 mnist chi2_cpd 0.9811 0.172114 1250.739039 0.9792 0.223121\n", - "13 64 256 None 1 mnist chi2_cpd 0.9810 0.316930 1750.582823 0.9796 0.320844\n", - "2 64 64 None 1 mnist chi2_cpd 0.9808 0.067135 743.633713 0.9794 0.071094\n", - "11 64 16 None 1 mnist chi2_cpd 0.9774 0.047079 709.143471 0.9740 0.058902\n", - "5 64 512 None 1 mnist chi2_cpd 0.9756 0.251814 1553.871543 0.9680 0.282160\n", - "3 64 8 None 1 mnist chi2_cpd 0.9534 0.055799 907.542290 0.9486 0.102491\n", - "15 64 4 None 1 mnist chi2_cpd 0.5504 0.079746 947.165308 0.5396 0.085806" + " --batch-size --nys-size --out-dim --subs-every dataset kernel test_acc test_eval_time training_time val_acc val_eval_time file_timestamp\n", + "0 64 64 None 50 mnist chi2_cpd 0.8990 0.064964 26350.607944 0.8969 0.115967 1542209490\n", + "13 64 256 None 50 mnist chi2_cpd 0.8930 0.159199 13036.495552 0.8919 0.163529 1542213923\n", + "14 64 128 None 50 mnist chi2_cpd 0.8918 0.172438 18421.614211 0.8869 0.222979 1542211961\n", + "17 64 512 None 50 mnist chi2_cpd 0.8886 0.561707 12977.160620 0.8778 0.575028 1542215550\n", + "19 64 16 None 50 mnist chi2_cpd 0.8439 0.056367 10432.334221 0.8413 0.090400 1542205108\n", + "7 64 8 None 50 mnist chi2_cpd 0.8124 0.070989 13508.359984 0.8031 0.077030 1542202109\n", + "6 64 4 None 50 mnist chi2_cpd 0.5502 0.033261 12351.705050 0.5486 0.068031 1542199505" ] }, - "execution_count": 8, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -598,7 +628,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -633,123 +663,131 @@ " <th>training_time</th>\n", " <th>val_acc</th>\n", " <th>val_eval_time</th>\n", + " <th>file_timestamp</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", - " <th>12</th>\n", + " <th>5</th>\n", " <td>64</td>\n", " <td>512</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>cifar10</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.1003</td>\n", - " <td>1.599234</td>\n", - " <td>15467.515219</td>\n", - " <td>0.1027</td>\n", - " <td>2.256960</td>\n", + " <td>0.8712</td>\n", + " <td>4.787930</td>\n", + " <td>56967.586779</td>\n", + " <td>0.8787</td>\n", + " <td>7.037983</td>\n", + " <td>1542231301</td>\n", " </tr>\n", " <tr>\n", - " <th>7</th>\n", + " <th>16</th>\n", " <td>64</td>\n", - " <td>8</td>\n", + " <td>256</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>cifar10</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.1000</td>\n", - " <td>3.588938</td>\n", - " <td>16039.019309</td>\n", - " <td>0.0947</td>\n", - " <td>5.784028</td>\n", + " <td>0.8688</td>\n", + " <td>4.033883</td>\n", + " <td>55950.356706</td>\n", + " <td>0.8736</td>\n", + " <td>6.381946</td>\n", + " <td>1542231096</td>\n", " </tr>\n", " <tr>\n", - " <th>17</th>\n", - " <td>64</td>\n", + " <th>10</th>\n", " <td>64</td>\n", + " <td>128</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>cifar10</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.1000</td>\n", - " <td>3.969165</td>\n", - " <td>18917.706158</td>\n", - " <td>0.0947</td>\n", - " <td>6.365395</td>\n", + " <td>0.8660</td>\n", + " <td>4.048859</td>\n", + " <td>52158.011988</td>\n", + " <td>0.8743</td>\n", + " <td>6.378982</td>\n", + " <td>1542230395</td>\n", " </tr>\n", " <tr>\n", - " <th>18</th>\n", + " <th>2</th>\n", + " <td>64</td>\n", " <td>64</td>\n", - " <td>128</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>cifar10</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.1000</td>\n", - " <td>1.360681</td>\n", - " <td>9864.623720</td>\n", - " <td>0.0947</td>\n", - " <td>1.949636</td>\n", + " <td>0.8572</td>\n", + " <td>3.840925</td>\n", + " <td>35606.153394</td>\n", + " <td>0.8645</td>\n", + " <td>5.962165</td>\n", + " <td>1542228549</td>\n", " </tr>\n", " <tr>\n", - " <th>1</th>\n", + " <th>8</th>\n", " <td>64</td>\n", - " <td>4</td>\n", + " <td>8</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>cifar10</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.1000</td>\n", - " <td>3.628797</td>\n", - " <td>15535.717329</td>\n", - " <td>0.1006</td>\n", - " <td>5.754008</td>\n", + " <td>0.7714</td>\n", + " <td>3.931015</td>\n", + " <td>52235.161493</td>\n", + " <td>0.7742</td>\n", + " <td>6.280008</td>\n", + " <td>1542226665</td>\n", " </tr>\n", " <tr>\n", - " <th>8</th>\n", + " <th>9</th>\n", " <td>64</td>\n", - " <td>256</td>\n", + " <td>4</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>cifar10</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.1000</td>\n", - " <td>1.338811</td>\n", - " <td>25427.858178</td>\n", - " <td>0.1006</td>\n", - " <td>1.951765</td>\n", + " <td>0.4169</td>\n", + " <td>3.507496</td>\n", + " <td>50602.315975</td>\n", + " <td>0.4124</td>\n", + " <td>5.679052</td>\n", + " <td>1542215637</td>\n", " </tr>\n", " <tr>\n", - " <th>16</th>\n", + " <th>20</th>\n", " <td>64</td>\n", " <td>16</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>cifar10</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.1000</td>\n", - " <td>1.098922</td>\n", - " <td>6856.143636</td>\n", - " <td>0.1006</td>\n", - " <td>1.634924</td>\n", + " <td>0.1140</td>\n", + " <td>1.127676</td>\n", + " <td>32099.498744</td>\n", + " <td>0.1219</td>\n", + " <td>1.698693</td>\n", + " <td>1542226974</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ - " --batch-size --nys-size --out-dim --subs-every dataset kernel test_acc test_eval_time training_time val_acc val_eval_time\n", - "12 64 512 None 1 cifar10 chi2_cpd 0.1003 1.599234 15467.515219 0.1027 2.256960\n", - "7 64 8 None 1 cifar10 chi2_cpd 0.1000 3.588938 16039.019309 0.0947 5.784028\n", - "17 64 64 None 1 cifar10 chi2_cpd 0.1000 3.969165 18917.706158 0.0947 6.365395\n", - "18 64 128 None 1 cifar10 chi2_cpd 0.1000 1.360681 9864.623720 0.0947 1.949636\n", - "1 64 4 None 1 cifar10 chi2_cpd 0.1000 3.628797 15535.717329 0.1006 5.754008\n", - "8 64 256 None 1 cifar10 chi2_cpd 0.1000 1.338811 25427.858178 0.1006 1.951765\n", - "16 64 16 None 1 cifar10 chi2_cpd 0.1000 1.098922 6856.143636 0.1006 1.634924" + " --batch-size --nys-size --out-dim --subs-every dataset kernel test_acc test_eval_time training_time val_acc val_eval_time file_timestamp\n", + "5 64 512 None 50 cifar10 chi2_cpd 0.8712 4.787930 56967.586779 0.8787 7.037983 1542231301\n", + "16 64 256 None 50 cifar10 chi2_cpd 0.8688 4.033883 55950.356706 0.8736 6.381946 1542231096\n", + "10 64 128 None 50 cifar10 chi2_cpd 0.8660 4.048859 52158.011988 0.8743 6.378982 1542230395\n", + "2 64 64 None 50 cifar10 chi2_cpd 0.8572 3.840925 35606.153394 0.8645 5.962165 1542228549\n", + "8 64 8 None 50 cifar10 chi2_cpd 0.7714 3.931015 52235.161493 0.7742 6.280008 1542226665\n", + "9 64 4 None 50 cifar10 chi2_cpd 0.4169 3.507496 50602.315975 0.4124 5.679052 1542215637\n", + "20 64 16 None 50 cifar10 chi2_cpd 0.1140 1.127676 32099.498744 0.1219 1.698693 1542226974" ] }, - "execution_count": 9, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -760,7 +798,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -795,123 +833,131 @@ " <th>training_time</th>\n", " <th>val_acc</th>\n", " <th>val_eval_time</th>\n", + " <th>file_timestamp</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", - " <th>0</th>\n", - " <td>64</td>\n", + " <th>11</th>\n", " <td>64</td>\n", + " <td>128</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>svhn</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.196694</td>\n", - " <td>3.208492</td>\n", - " <td>13886.173297</td>\n", - " <td>0.1881</td>\n", - " <td>1.850464</td>\n", + " <td>0.949639</td>\n", + " <td>9.729126</td>\n", + " <td>74122.297888</td>\n", + " <td>0.9451</td>\n", + " <td>5.790046</td>\n", + " <td>1542264179</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>64</td>\n", - " <td>16</td>\n", + " <td>512</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>svhn</td>\n", " <td>chi2_cpd</td>\n", - " <td>0.196694</td>\n", - " <td>2.950274</td>\n", - " <td>11086.446670</td>\n", - " <td>0.1881</td>\n", - " <td>1.672408</td>\n", + " <td>0.949370</td>\n", + " <td>4.025452</td>\n", + " <td>75948.217098</td>\n", + " <td>0.9427</td>\n", + " <td>2.080920</td>\n", + " <td>1542266919</td>\n", " </tr>\n", " <tr>\n", - " <th>9</th>\n", + " <th>1</th>\n", " <td>64</td>\n", - " <td>128</td>\n", + " <td>8</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>svhn</td>\n", " <td>chi2_cpd</td>\n", " <td>0.196694</td>\n", - " <td>3.169210</td>\n", - " <td>16867.399688</td>\n", + " <td>3.221060</td>\n", + " <td>153978.042774</td>\n", " <td>0.1881</td>\n", - " <td>1.771410</td>\n", + " <td>1.785691</td>\n", + " <td>1542242240</td>\n", " </tr>\n", " <tr>\n", - " <th>10</th>\n", + " <th>3</th>\n", " <td>64</td>\n", - " <td>512</td>\n", + " <td>256</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>svhn</td>\n", " <td>chi2_cpd</td>\n", " <td>0.196694</td>\n", - " <td>12.052618</td>\n", - " <td>61869.212071</td>\n", + " <td>10.474136</td>\n", + " <td>116107.833837</td>\n", " <td>0.1881</td>\n", - " <td>6.758391</td>\n", + " <td>6.086989</td>\n", + " <td>1542266269</td>\n", " </tr>\n", " <tr>\n", - " <th>14</th>\n", + " <th>12</th>\n", " <td>64</td>\n", - " <td>8</td>\n", + " <td>4</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>svhn</td>\n", " <td>chi2_cpd</td>\n", " <td>0.196694</td>\n", - " <td>3.106948</td>\n", - " <td>10786.248278</td>\n", + " <td>3.032919</td>\n", + " <td>153685.657897</td>\n", " <td>0.1881</td>\n", - " <td>1.732185</td>\n", + " <td>1.741903</td>\n", + " <td>1542235855</td>\n", " </tr>\n", " <tr>\n", - " <th>19</th>\n", + " <th>15</th>\n", + " <td>64</td>\n", " <td>64</td>\n", - " <td>256</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>svhn</td>\n", " <td>chi2_cpd</td>\n", " <td>0.196694</td>\n", - " <td>11.152896</td>\n", - " <td>45104.915969</td>\n", + " <td>3.062441</td>\n", + " <td>72432.295633</td>\n", " <td>0.1881</td>\n", - " <td>6.566199</td>\n", + " <td>2.894550</td>\n", + " <td>1542259094</td>\n", " </tr>\n", " <tr>\n", - " <th>20</th>\n", + " <th>18</th>\n", " <td>64</td>\n", - " <td>4</td>\n", + " <td>16</td>\n", " <td>None</td>\n", - " <td>1</td>\n", + " <td>50</td>\n", " <td>svhn</td>\n", " <td>chi2_cpd</td>\n", " <td>0.196694</td>\n", - " <td>10.198356</td>\n", - " <td>24755.796742</td>\n", + " <td>2.846475</td>\n", + " <td>72815.976671</td>\n", " <td>0.1881</td>\n", - " <td>6.264580</td>\n", + " <td>1.661851</td>\n", + " <td>1542255462</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ - " --batch-size --nys-size --out-dim --subs-every dataset kernel test_acc test_eval_time training_time val_acc val_eval_time\n", - "0 64 64 None 1 svhn chi2_cpd 0.196694 3.208492 13886.173297 0.1881 1.850464\n", - "4 64 16 None 1 svhn chi2_cpd 0.196694 2.950274 11086.446670 0.1881 1.672408\n", - "9 64 128 None 1 svhn chi2_cpd 0.196694 3.169210 16867.399688 0.1881 1.771410\n", - "10 64 512 None 1 svhn chi2_cpd 0.196694 12.052618 61869.212071 0.1881 6.758391\n", - "14 64 8 None 1 svhn chi2_cpd 0.196694 3.106948 10786.248278 0.1881 1.732185\n", - "19 64 256 None 1 svhn chi2_cpd 0.196694 11.152896 45104.915969 0.1881 6.566199\n", - "20 64 4 None 1 svhn chi2_cpd 0.196694 10.198356 24755.796742 0.1881 6.264580" + " --batch-size --nys-size --out-dim --subs-every dataset kernel test_acc test_eval_time training_time val_acc val_eval_time file_timestamp\n", + "11 64 128 None 50 svhn chi2_cpd 0.949639 9.729126 74122.297888 0.9451 5.790046 1542264179\n", + "4 64 512 None 50 svhn chi2_cpd 0.949370 4.025452 75948.217098 0.9427 2.080920 1542266919\n", + "1 64 8 None 50 svhn chi2_cpd 0.196694 3.221060 153978.042774 0.1881 1.785691 1542242240\n", + "3 64 256 None 50 svhn chi2_cpd 0.196694 10.474136 116107.833837 0.1881 6.086989 1542266269\n", + "12 64 4 None 50 svhn chi2_cpd 0.196694 3.032919 153685.657897 0.1881 1.741903 1542235855\n", + "15 64 64 None 50 svhn chi2_cpd 0.196694 3.062441 72432.295633 0.1881 2.894550 1542259094\n", + "18 64 16 None 50 svhn chi2_cpd 0.196694 2.846475 72815.976671 0.1881 1.661851 1542255462" ] }, - "execution_count": 10, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } diff --git a/main/experiments/graph_drawing/november_2018/classif_end_to_end_subsample_conv_hand_with_augment/mixed_results/no_conv_hand_vs_conv_hand.ipynb b/main/experiments/graph_drawing/november_2018/classif_end_to_end_subsample_conv_hand_with_augment/mixed_results/no_conv_hand_vs_conv_hand.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..ac9dc23b1c31514a00d8241ed658d802f4ca09b2 --- /dev/null +++ b/main/experiments/graph_drawing/november_2018/classif_end_to_end_subsample_conv_hand_with_augment/mixed_results/no_conv_hand_vs_conv_hand.ipynb @@ -0,0 +1,1383 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2018-11-21 16:42:20,843 [24184] DEBUG matplotlib.backends: backend module://ipykernel.pylab.backend_inline version unknown\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "import matplotlib\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import pathlib\n", + "import os\n", + "\n", + "from skluc.main.utils import logger\n", + "\n", + "matplotlib.rcParams.update({'font.size': 14})\n", + "pd.set_option('display.expand_frame_repr', False)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def build_df(dirname, filename):\n", + " filepath = os.path.join(dirname, filename)\n", + " df = pd.read_csv(filepath)\n", + " df = df.apply(pd.to_numeric, errors=\"ignore\")\n", + " df = df.drop_duplicates()\n", + " col_to_delete = ['--batch-size', '--chi-square-PD-kernel', '--chi-square-kernel',\n", + " '--cifar10', '--cifar100', '--exp-chi-square-kernel',\n", + " '--intercept-constant', '--laplacian-kernel', '--linear-kernel',\n", + " '--mnist', '--quiet', '--rbf-kernel',\n", + " '--sigmoid-kernel', '--stacked-kernel', '--sumed-kernel', '--svhn',\n", + " '--tensorboard', '--validation-size',\n", + " 'deepfriedconvnet', 'deepstrom','dense', \"--gamma\", \"--nb-stack\", \n", + " \"--non-linear\", \"--non-linearity\", \"--num-epoch\", \"--seed\",\n", + " \"--train-size\", \"--second-layer-size\", \"activation_function\",\n", + " \"deepstrom_activation\", \"--real-fastfood\", \"--real-nystrom\"\n", + " ]\n", + " for c in col_to_delete:\n", + " try:\n", + " df = df.drop([c], axis=1)\n", + " except KeyError as e:\n", + " print(\"pass\", e)\n", + "\n", + " return df" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "DIRNAME = \"/home/luc/Resultats/Deepstrom/november_2018/end_to_end_with_augment\"\n", + "FILENAME = \"gathered_results.csv\"\n", + "df_no_conv_hand = build_df(DIRNAME, FILENAME)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "pass \"['deepfriedconvnet'] not found in axis\"\n", + "pass \"['dense'] not found in axis\"\n", + "pass \"['--nb-stack'] not found in axis\"\n", + "pass \"['--second-layer-size'] not found in axis\"\n", + "pass \"['--real-fastfood'] not found in axis\"\n" + ] + } + ], + "source": [ + "DIRNAME = \"/home/luc/Resultats/Deepstrom/november_2018/end_to_end_subsample_conv_hand_with_augment\"\n", + "FILENAME = \"gathered_results.csv\"\n", + "df_conv_hand = build_df(DIRNAME, FILENAME)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>--nys-size</th>\n", + " <th>--out-dim</th>\n", + " <th>dataset</th>\n", + " <th>kernel</th>\n", + " <th>network</th>\n", + " <th>test_acc</th>\n", + " <th>test_eval_time</th>\n", + " <th>training_time</th>\n", + " <th>val_acc</th>\n", + " <th>val_eval_time</th>\n", + " <th>file_timestamp</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>None</td>\n", + " <td>64</td>\n", + " <td>svhn</td>\n", + " <td>None</td>\n", + " <td>dense</td>\n", + " <td>0.9458981443334509</td>\n", + " <td>10.34985876083374</td>\n", + " <td>114540.45786070824</td>\n", + " <td>0.9479000031948089</td>\n", + " <td>6.307359933853149</td>\n", + " <td>1542112063</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>None</td>\n", + " <td>128</td>\n", + " <td>svhn</td>\n", + " <td>None</td>\n", + " <td>dense</td>\n", + " <td>0.9500648246871101</td>\n", + " <td>9.564645528793335</td>\n", + " <td>118978.64107084274</td>\n", + " <td>0.9454999923706054</td>\n", + " <td>5.882847309112549</td>\n", + " <td>1542112081</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>svhn</td>\n", + " <td>None</td>\n", + " <td>deepfriedconvnet</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>1542128113</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>None</td>\n", + " <td>16</td>\n", + " <td>cifar10</td>\n", + " <td>None</td>\n", + " <td>dense</td>\n", + " <td>0.8750999987125396</td>\n", + " <td>3.556856632232666</td>\n", + " <td>51417.4389526844</td>\n", + " <td>0.8725000023841858</td>\n", + " <td>5.722635269165039</td>\n", + " <td>1542093242</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>cifar10</td>\n", + " <td>None</td>\n", + " <td>deepfriedconvnet</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>1542128044</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5</th>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>mnist</td>\n", + " <td>None</td>\n", + " <td>deepfriedconvnet</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>1542128021</td>\n", + " </tr>\n", + " <tr>\n", + " <th>6</th>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>mnist</td>\n", + " <td>None</td>\n", + " <td>deepfriedconvnet</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>1542128036</td>\n", + " </tr>\n", + " <tr>\n", + " <th>7</th>\n", + " <td>None</td>\n", + " <td>1024</td>\n", + " <td>svhn</td>\n", + " <td>None</td>\n", + " <td>dense</td>\n", + " <td>0.9470370301493892</td>\n", + " <td>10.098342180252075</td>\n", + " <td>119093.35198688507</td>\n", + " <td>0.9433000087738037</td>\n", + " <td>6.1705663204193115</td>\n", + " <td>1542112171</td>\n", + " </tr>\n", + " <tr>\n", + " <th>8</th>\n", + " <td>4</td>\n", + " <td>None</td>\n", + " <td>cifar10</td>\n", + " <td>chi2_cpd</td>\n", + " <td>deepstrom</td>\n", + " <td>0.8697000086307526</td>\n", + " <td>3.9117791652679443</td>\n", + " <td>56443.23889231682</td>\n", + " <td>0.8759000062942505</td>\n", + " <td>6.313701391220093</td>\n", + " <td>1542144666</td>\n", + " </tr>\n", + " <tr>\n", + " <th>9</th>\n", + " <td>4</td>\n", + " <td>None</td>\n", + " <td>mnist</td>\n", + " <td>chi2_cpd</td>\n", + " <td>deepstrom</td>\n", + " <td>0.7988000035285949</td>\n", + " <td>0.05095171928405762</td>\n", + " <td>10202.119398117065</td>\n", + " <td>0.8037999987602233</td>\n", + " <td>0.09100127220153809</td>\n", + " <td>1542128137</td>\n", + " </tr>\n", + " <tr>\n", + " <th>10</th>\n", + " <td>8</td>\n", + " <td>None</td>\n", + " <td>cifar10</td>\n", + " <td>chi2_cpd</td>\n", + " <td>deepstrom</td>\n", + " <td>0.8703999996185303</td>\n", + " <td>3.6414413452148438</td>\n", + " <td>57386.47595191002</td>\n", + " <td>0.8709000051021576</td>\n", + " <td>5.832661390304565</td>\n", + " <td>1542144697</td>\n", + " </tr>\n", + " <tr>\n", + " <th>11</th>\n", + " <td>None</td>\n", + " <td>16</td>\n", + " <td>mnist</td>\n", + " <td>None</td>\n", + " <td>dense</td>\n", + " <td>0.9584999918937683</td>\n", + " <td>0.07531499862670898</td>\n", + " <td>18834.147827863693</td>\n", + " <td>0.9583999991416932</td>\n", + " <td>0.07740616798400879</td>\n", + " <td>1542093237</td>\n", + " </tr>\n", + " <tr>\n", + " <th>12</th>\n", + " <td>16</td>\n", + " <td>None</td>\n", + " <td>mnist</td>\n", + " <td>chi2_cpd</td>\n", + " <td>deepstrom</td>\n", + " <td>0.8655000030994415</td>\n", + " <td>0.060543060302734375</td>\n", + " <td>10251.9246032238</td>\n", + " <td>0.8617999970912933</td>\n", + " <td>0.1010580062866211</td>\n", + " <td>1542138349</td>\n", + " </tr>\n", + " <tr>\n", + " <th>13</th>\n", + " <td>4</td>\n", + " <td>None</td>\n", + " <td>svhn</td>\n", + " <td>chi2_cpd</td>\n", + " <td>deepstrom</td>\n", + " <td>0.9449722214981362</td>\n", + " <td>3.056546449661255</td>\n", + " <td>157415.13459396362</td>\n", + " <td>0.941399997472763</td>\n", + " <td>1.819403886795044</td>\n", + " <td>1542168358</td>\n", + " </tr>\n", + " <tr>\n", + " <th>14</th>\n", + " <td>None</td>\n", + " <td>64</td>\n", + " <td>cifar10</td>\n", + " <td>None</td>\n", + " <td>dense</td>\n", + " <td>0.8715999960899353</td>\n", + " <td>3.90252685546875</td>\n", + " <td>51397.38422727585</td>\n", + " <td>0.8755999982357026</td>\n", + " <td>6.284409046173096</td>\n", + " <td>1542093242</td>\n", + " </tr>\n", + " <tr>\n", + " <th>15</th>\n", + " <td>128</td>\n", + " <td>None</td>\n", + " <td>svhn</td>\n", + " <td>chi2_cpd</td>\n", + " <td>deepstrom</td>\n", + " <td>0.9461481416666949</td>\n", + " <td>3.6263587474823</td>\n", + " <td>83843.22896647453</td>\n", + " <td>0.9402000069618225</td>\n", + " <td>2.0779218673706055</td>\n", + " <td>1542183046</td>\n", + " </tr>\n", + " <tr>\n", + " <th>16</th>\n", + " <td>16</td>\n", + " <td>None</td>\n", + " <td>svhn</td>\n", + " <td>chi2_cpd</td>\n", + " <td>deepstrom</td>\n", + " <td>0.9448888897895813</td>\n", + " <td>3.1488840579986572</td>\n", + " <td>161223.36014437675</td>\n", + " <td>0.9398000001907348</td>\n", + " <td>1.856621503829956</td>\n", + " <td>1542173177</td>\n", + " </tr>\n", + " <tr>\n", + " <th>17</th>\n", + " <td>128</td>\n", + " <td>None</td>\n", + " <td>cifar10</td>\n", + " <td>chi2_cpd</td>\n", + " <td>deepstrom</td>\n", + " <td>0.8719999969005585</td>\n", + " <td>4.408368825912476</td>\n", + " <td>55802.59868788719</td>\n", + " <td>0.8729000091552734</td>\n", + " <td>6.515403985977173</td>\n", + " <td>1542149279</td>\n", + " </tr>\n", + " <tr>\n", + " <th>18</th>\n", + " <td>None</td>\n", + " <td>1024</td>\n", + " <td>cifar10</td>\n", + " <td>None</td>\n", + " <td>dense</td>\n", + " <td>0.8707000076770782</td>\n", + " <td>3.899188756942749</td>\n", + " <td>34750.86156606674</td>\n", + " <td>0.8687999963760376</td>\n", + " <td>6.288317680358887</td>\n", + " <td>1542093242</td>\n", + " </tr>\n", + " <tr>\n", + " <th>19</th>\n", + " <td>None</td>\n", + " <td>128</td>\n", + " <td>mnist</td>\n", + " <td>None</td>\n", + " <td>dense</td>\n", + " <td>0.9712999999523163</td>\n", + " <td>0.04774975776672363</td>\n", + " <td>18801.122860193253</td>\n", + " <td>0.9713999986648559</td>\n", + " <td>0.09031915664672852</td>\n", + " <td>1542093242</td>\n", + " </tr>\n", + " <tr>\n", + " <th>20</th>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>cifar10</td>\n", + " <td>None</td>\n", + " <td>deepfriedconvnet</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>1542128054</td>\n", + " </tr>\n", + " <tr>\n", + " <th>21</th>\n", + " <td>256</td>\n", + " <td>None</td>\n", + " <td>svhn</td>\n", + " <td>chi2_cpd</td>\n", + " <td>deepstrom</td>\n", + " <td>0.9472685147214819</td>\n", + " <td>14.435875177383423</td>\n", + " <td>129790.18364858627</td>\n", + " <td>0.940499997138977</td>\n", + " <td>7.935451030731201</td>\n", + " <td>1542196274</td>\n", + " </tr>\n", + " <tr>\n", + " <th>22</th>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>svhn</td>\n", + " <td>None</td>\n", + " <td>deepfriedconvnet</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>1542128100</td>\n", + " </tr>\n", + " <tr>\n", + " <th>23</th>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>svhn</td>\n", + " <td>None</td>\n", + " <td>deepfriedconvnet</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>1542128076</td>\n", + " </tr>\n", + " <tr>\n", + " <th>24</th>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>cifar10</td>\n", + " <td>None</td>\n", + " <td>deepfriedconvnet</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>1542128066</td>\n", + " </tr>\n", + " <tr>\n", + " <th>25</th>\n", + " <td>None</td>\n", + " <td>16</td>\n", + " <td>svhn</td>\n", + " <td>None</td>\n", + " <td>dense</td>\n", + " <td>0.9455648152916519</td>\n", + " <td>2.8233609199523926</td>\n", + " <td>71913.0057694912</td>\n", + " <td>0.943999993801117</td>\n", + " <td>1.6415505409240723</td>\n", + " <td>1542105209</td>\n", + " </tr>\n", + " <tr>\n", + " <th>26</th>\n", + " <td>128</td>\n", + " <td>None</td>\n", + " <td>mnist</td>\n", + " <td>chi2_cpd</td>\n", + " <td>deepstrom</td>\n", + " <td>0.8997999966144562</td>\n", + " <td>0.10766291618347168</td>\n", + " <td>12511.990970373154</td>\n", + " <td>0.8817000031471253</td>\n", + " <td>0.11288857460021973</td>\n", + " <td>1542142166</td>\n", + " </tr>\n", + " <tr>\n", + " <th>27</th>\n", + " <td>64</td>\n", + " <td>None</td>\n", + " <td>cifar10</td>\n", + " <td>chi2_cpd</td>\n", + " <td>deepstrom</td>\n", + " <td>0.8679000020027161</td>\n", + " <td>4.357625722885132</td>\n", + " <td>47625.56103491783</td>\n", + " <td>0.8693000018596649</td>\n", + " <td>6.8435378074646</td>\n", + " <td>1542148610</td>\n", + " </tr>\n", + " <tr>\n", + " <th>28</th>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>mnist</td>\n", + " <td>None</td>\n", + " <td>deepfriedconvnet</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>None</td>\n", + " <td>1542128029</td>\n", + " </tr>\n", + " <tr>\n", + " <th>29</th>\n", + " <td>8</td>\n", + " <td>None</td>\n", + " <td>mnist</td>\n", + " <td>chi2_cpd</td>\n", + " <td>deepstrom</td>\n", + " <td>0.8299999952316284</td>\n", + " <td>0.054628849029541016</td>\n", + " <td>10385.974974393845</td>\n", + " <td>0.8270999968051911</td>\n", + " <td>0.09607958793640137</td>\n", + " <td>1542128211</td>\n", + " </tr>\n", + " <tr>\n", + " <th>30</th>\n", + " <td>256</td>\n", + " <td>None</td>\n", + " <td>cifar10</td>\n", + " <td>chi2_cpd</td>\n", + " <td>deepstrom</td>\n", + " <td>0.8680999994277954</td>\n", + " <td>1.638434648513794</td>\n", + " <td>44774.475116968155</td>\n", + " <td>0.8678999960422515</td>\n", + " <td>2.325268268585205</td>\n", + " <td>1542154705</td>\n", + " </tr>\n", + " <tr>\n", + " <th>31</th>\n", + " <td>512</td>\n", + " <td>None</td>\n", + " <td>mnist</td>\n", + " <td>chi2_cpd</td>\n", + " <td>deepstrom</td>\n", + " <td>0.8584999978542328</td>\n", + " <td>0.3059966564178467</td>\n", + " <td>27894.391397476196</td>\n", + " <td>0.857099997997284</td>\n", + " <td>0.30718469619750977</td>\n", + " <td>1542143762</td>\n", + " </tr>\n", + " <tr>\n", + " <th>32</th>\n", + " <td>64</td>\n", + " <td>None</td>\n", + " <td>mnist</td>\n", + " <td>chi2_cpd</td>\n", + " <td>deepstrom</td>\n", + " <td>0.9003000020980835</td>\n", + " <td>0.10981917381286621</td>\n", + " <td>10661.762295007706</td>\n", + " <td>0.8931000113487244</td>\n", + " <td>0.13260126113891602</td>\n", + " <td>1542138607</td>\n", + " </tr>\n", + " <tr>\n", + " <th>33</th>\n", + " <td>8</td>\n", + " <td>None</td>\n", + " <td>svhn</td>\n", + " <td>chi2_cpd</td>\n", + " <td>deepstrom</td>\n", + " <td>0.950157399530764</td>\n", + " <td>3.156935930252075</td>\n", + " <td>157795.88800406456</td>\n", + " <td>0.9431999981403351</td>\n", + " <td>1.888800859451294</td>\n", + " <td>1542171673</td>\n", + " </tr>\n", + " <tr>\n", + " <th>34</th>\n", + " <td>16</td>\n", + " <td>None</td>\n", + " <td>cifar10</td>\n", + " <td>chi2_cpd</td>\n", + " <td>deepstrom</td>\n", + " <td>0.8763999938964844</td>\n", + " <td>1.166285514831543</td>\n", + " <td>36617.78374505043</td>\n", + " <td>0.8763000011444092</td>\n", + " <td>1.849858283996582</td>\n", + " <td>1542146397</td>\n", + " </tr>\n", + " <tr>\n", + " <th>35</th>\n", + " <td>512</td>\n", + " <td>None</td>\n", + " <td>svhn</td>\n", + " <td>chi2_cpd</td>\n", + " <td>deepstrom</td>\n", + " <td>0.9432222269199513</td>\n", + " <td>16.69476819038391</td>\n", + " <td>219266.66595840454</td>\n", + " <td>0.9396999895572662</td>\n", + " <td>8.49440312385559</td>\n", + " <td>1542196669</td>\n", + " </tr>\n", + " <tr>\n", + " <th>36</th>\n", + " <td>512</td>\n", + " <td>None</td>\n", + " <td>cifar10</td>\n", + " <td>chi2_cpd</td>\n", + " <td>deepstrom</td>\n", + " <td>0.8689000010490417</td>\n", + " <td>2.193476676940918</td>\n", + " <td>85243.51559782028</td>\n", + " <td>0.8681999981403351</td>\n", + " <td>2.8480000495910645</td>\n", + " <td>1542156968</td>\n", + " </tr>\n", + " <tr>\n", + " <th>37</th>\n", + " <td>256</td>\n", + " <td>None</td>\n", + " <td>mnist</td>\n", + " <td>chi2_cpd</td>\n", + " <td>deepstrom</td>\n", + " <td>0.8875000059604645</td>\n", + " <td>0.1719503402709961</td>\n", + " <td>24715.69637322426</td>\n", + " <td>0.8808999955654144</td>\n", + " <td>0.2258143424987793</td>\n", + " <td>1542143626</td>\n", + " </tr>\n", + " <tr>\n", + " <th>38</th>\n", + " <td>None</td>\n", + " <td>64</td>\n", + " <td>mnist</td>\n", + " <td>None</td>\n", + " <td>dense</td>\n", + " <td>0.9674999952316284</td>\n", + " <td>0.05219531059265137</td>\n", + " <td>18916.09988093376</td>\n", + " <td>0.9656000018119812</td>\n", + " <td>0.10185027122497559</td>\n", + " <td>1542093242</td>\n", + " </tr>\n", + " <tr>\n", + " <th>39</th>\n", + " <td>None</td>\n", + " <td>1024</td>\n", + " <td>mnist</td>\n", + " <td>None</td>\n", + " <td>dense</td>\n", + " <td>0.9822000086307525</td>\n", + " <td>0.0282437801361084</td>\n", + " <td>11942.309963703156</td>\n", + " <td>0.9835000038146973</td>\n", + " <td>0.05691170692443848</td>\n", + " <td>1542093243</td>\n", + " </tr>\n", + " <tr>\n", + " <th>40</th>\n", + " <td>None</td>\n", + " <td>128</td>\n", + " <td>cifar10</td>\n", + " <td>None</td>\n", + " <td>dense</td>\n", + " <td>0.8699000000953674</td>\n", + " <td>3.515281915664673</td>\n", + " <td>34945.89453077316</td>\n", + " <td>0.8782000064849853</td>\n", + " <td>5.652684450149536</td>\n", + " <td>1542093242</td>\n", + " </tr>\n", + " <tr>\n", + " <th>41</th>\n", + " <td>64</td>\n", + " <td>None</td>\n", + " <td>svhn</td>\n", + " <td>chi2_cpd</td>\n", + " <td>deepstrom</td>\n", + " <td>0.9463981500378361</td>\n", + " <td>3.4341957569122314</td>\n", + " <td>78279.07663154602</td>\n", + " <td>0.9418999910354614</td>\n", + " <td>1.9714641571044922</td>\n", + " <td>1542177149</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " --nys-size --out-dim dataset kernel network test_acc test_eval_time training_time val_acc val_eval_time file_timestamp\n", + "0 None 64 svhn None dense 0.9458981443334509 10.34985876083374 114540.45786070824 0.9479000031948089 6.307359933853149 1542112063\n", + "1 None 128 svhn None dense 0.9500648246871101 9.564645528793335 118978.64107084274 0.9454999923706054 5.882847309112549 1542112081\n", + "2 None None svhn None deepfriedconvnet None None None None None 1542128113\n", + "3 None 16 cifar10 None dense 0.8750999987125396 3.556856632232666 51417.4389526844 0.8725000023841858 5.722635269165039 1542093242\n", + "4 None None cifar10 None deepfriedconvnet None None None None None 1542128044\n", + "5 None None mnist None deepfriedconvnet None None None None None 1542128021\n", + "6 None None mnist None deepfriedconvnet None None None None None 1542128036\n", + "7 None 1024 svhn None dense 0.9470370301493892 10.098342180252075 119093.35198688507 0.9433000087738037 6.1705663204193115 1542112171\n", + "8 4 None cifar10 chi2_cpd deepstrom 0.8697000086307526 3.9117791652679443 56443.23889231682 0.8759000062942505 6.313701391220093 1542144666\n", + "9 4 None mnist chi2_cpd deepstrom 0.7988000035285949 0.05095171928405762 10202.119398117065 0.8037999987602233 0.09100127220153809 1542128137\n", + "10 8 None cifar10 chi2_cpd deepstrom 0.8703999996185303 3.6414413452148438 57386.47595191002 0.8709000051021576 5.832661390304565 1542144697\n", + "11 None 16 mnist None dense 0.9584999918937683 0.07531499862670898 18834.147827863693 0.9583999991416932 0.07740616798400879 1542093237\n", + "12 16 None mnist chi2_cpd deepstrom 0.8655000030994415 0.060543060302734375 10251.9246032238 0.8617999970912933 0.1010580062866211 1542138349\n", + "13 4 None svhn chi2_cpd deepstrom 0.9449722214981362 3.056546449661255 157415.13459396362 0.941399997472763 1.819403886795044 1542168358\n", + "14 None 64 cifar10 None dense 0.8715999960899353 3.90252685546875 51397.38422727585 0.8755999982357026 6.284409046173096 1542093242\n", + "15 128 None svhn chi2_cpd deepstrom 0.9461481416666949 3.6263587474823 83843.22896647453 0.9402000069618225 2.0779218673706055 1542183046\n", + "16 16 None svhn chi2_cpd deepstrom 0.9448888897895813 3.1488840579986572 161223.36014437675 0.9398000001907348 1.856621503829956 1542173177\n", + "17 128 None cifar10 chi2_cpd deepstrom 0.8719999969005585 4.408368825912476 55802.59868788719 0.8729000091552734 6.515403985977173 1542149279\n", + "18 None 1024 cifar10 None dense 0.8707000076770782 3.899188756942749 34750.86156606674 0.8687999963760376 6.288317680358887 1542093242\n", + "19 None 128 mnist None dense 0.9712999999523163 0.04774975776672363 18801.122860193253 0.9713999986648559 0.09031915664672852 1542093242\n", + "20 None None cifar10 None deepfriedconvnet None None None None None 1542128054\n", + "21 256 None svhn chi2_cpd deepstrom 0.9472685147214819 14.435875177383423 129790.18364858627 0.940499997138977 7.935451030731201 1542196274\n", + "22 None None svhn None deepfriedconvnet None None None None None 1542128100\n", + "23 None None svhn None deepfriedconvnet None None None None None 1542128076\n", + "24 None None cifar10 None deepfriedconvnet None None None None None 1542128066\n", + "25 None 16 svhn None dense 0.9455648152916519 2.8233609199523926 71913.0057694912 0.943999993801117 1.6415505409240723 1542105209\n", + "26 128 None mnist chi2_cpd deepstrom 0.8997999966144562 0.10766291618347168 12511.990970373154 0.8817000031471253 0.11288857460021973 1542142166\n", + "27 64 None cifar10 chi2_cpd deepstrom 0.8679000020027161 4.357625722885132 47625.56103491783 0.8693000018596649 6.8435378074646 1542148610\n", + "28 None None mnist None deepfriedconvnet None None None None None 1542128029\n", + "29 8 None mnist chi2_cpd deepstrom 0.8299999952316284 0.054628849029541016 10385.974974393845 0.8270999968051911 0.09607958793640137 1542128211\n", + "30 256 None cifar10 chi2_cpd deepstrom 0.8680999994277954 1.638434648513794 44774.475116968155 0.8678999960422515 2.325268268585205 1542154705\n", + "31 512 None mnist chi2_cpd deepstrom 0.8584999978542328 0.3059966564178467 27894.391397476196 0.857099997997284 0.30718469619750977 1542143762\n", + "32 64 None mnist chi2_cpd deepstrom 0.9003000020980835 0.10981917381286621 10661.762295007706 0.8931000113487244 0.13260126113891602 1542138607\n", + "33 8 None svhn chi2_cpd deepstrom 0.950157399530764 3.156935930252075 157795.88800406456 0.9431999981403351 1.888800859451294 1542171673\n", + "34 16 None cifar10 chi2_cpd deepstrom 0.8763999938964844 1.166285514831543 36617.78374505043 0.8763000011444092 1.849858283996582 1542146397\n", + "35 512 None svhn chi2_cpd deepstrom 0.9432222269199513 16.69476819038391 219266.66595840454 0.9396999895572662 8.49440312385559 1542196669\n", + "36 512 None cifar10 chi2_cpd deepstrom 0.8689000010490417 2.193476676940918 85243.51559782028 0.8681999981403351 2.8480000495910645 1542156968\n", + "37 256 None mnist chi2_cpd deepstrom 0.8875000059604645 0.1719503402709961 24715.69637322426 0.8808999955654144 0.2258143424987793 1542143626\n", + "38 None 64 mnist None dense 0.9674999952316284 0.05219531059265137 18916.09988093376 0.9656000018119812 0.10185027122497559 1542093242\n", + "39 None 1024 mnist None dense 0.9822000086307525 0.0282437801361084 11942.309963703156 0.9835000038146973 0.05691170692443848 1542093243\n", + "40 None 128 cifar10 None dense 0.8699000000953674 3.515281915664673 34945.89453077316 0.8782000064849853 5.652684450149536 1542093242\n", + "41 64 None svhn chi2_cpd deepstrom 0.9463981500378361 3.4341957569122314 78279.07663154602 0.9418999910354614 1.9714641571044922 1542177149" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(df_no_conv_hand)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>--nys-size</th>\n", + " <th>--out-dim</th>\n", + " <th>--subs-every</th>\n", + " <th>dataset</th>\n", + " <th>kernel</th>\n", + " <th>test_acc</th>\n", + " <th>test_eval_time</th>\n", + " <th>training_time</th>\n", + " <th>val_acc</th>\n", + " <th>val_eval_time</th>\n", + " <th>file_timestamp</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>64</td>\n", + " <td>None</td>\n", + " <td>50</td>\n", + " <td>mnist</td>\n", + " <td>chi2_cpd</td>\n", + " <td>0.899000</td>\n", + " <td>0.064964</td>\n", + " <td>26350.607944</td>\n", + " <td>0.8969</td>\n", + " <td>0.115967</td>\n", + " <td>1542209490</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>8</td>\n", + " <td>None</td>\n", + " <td>50</td>\n", + " <td>svhn</td>\n", + " <td>chi2_cpd</td>\n", + " <td>0.196694</td>\n", + " <td>3.221060</td>\n", + " <td>153978.042774</td>\n", + " <td>0.1881</td>\n", + " <td>1.785691</td>\n", + " <td>1542242240</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>64</td>\n", + " <td>None</td>\n", + " <td>50</td>\n", + " <td>cifar10</td>\n", + " <td>chi2_cpd</td>\n", + " <td>0.857200</td>\n", + " <td>3.840925</td>\n", + " <td>35606.153394</td>\n", + " <td>0.8645</td>\n", + " <td>5.962165</td>\n", + " <td>1542228549</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>256</td>\n", + " <td>None</td>\n", + " <td>50</td>\n", + " <td>svhn</td>\n", + " <td>chi2_cpd</td>\n", + " <td>0.196694</td>\n", + " <td>10.474136</td>\n", + " <td>116107.833837</td>\n", + " <td>0.1881</td>\n", + " <td>6.086989</td>\n", + " <td>1542266269</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>512</td>\n", + " <td>None</td>\n", + " <td>50</td>\n", + " <td>svhn</td>\n", + " <td>chi2_cpd</td>\n", + " <td>0.949370</td>\n", + " <td>4.025452</td>\n", + " <td>75948.217098</td>\n", + " <td>0.9427</td>\n", + " <td>2.080920</td>\n", + " <td>1542266919</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5</th>\n", + " <td>512</td>\n", + " <td>None</td>\n", + " <td>50</td>\n", + " <td>cifar10</td>\n", + " <td>chi2_cpd</td>\n", + " <td>0.871200</td>\n", + " <td>4.787930</td>\n", + " <td>56967.586779</td>\n", + " <td>0.8787</td>\n", + " <td>7.037983</td>\n", + " <td>1542231301</td>\n", + " </tr>\n", + " <tr>\n", + " <th>6</th>\n", + " <td>4</td>\n", + " <td>None</td>\n", + " <td>50</td>\n", + " <td>mnist</td>\n", + " <td>chi2_cpd</td>\n", + " <td>0.550200</td>\n", + " <td>0.033261</td>\n", + " <td>12351.705050</td>\n", + " <td>0.5486</td>\n", + " <td>0.068031</td>\n", + " <td>1542199505</td>\n", + " </tr>\n", + " <tr>\n", + " <th>7</th>\n", + " <td>8</td>\n", + " <td>None</td>\n", + " <td>50</td>\n", + " <td>mnist</td>\n", + " <td>chi2_cpd</td>\n", + " <td>0.812400</td>\n", + " <td>0.070989</td>\n", + " <td>13508.359984</td>\n", + " <td>0.8031</td>\n", + " <td>0.077030</td>\n", + " <td>1542202109</td>\n", + " </tr>\n", + " <tr>\n", + " <th>8</th>\n", + " <td>8</td>\n", + " <td>None</td>\n", + " <td>50</td>\n", + " <td>cifar10</td>\n", + " <td>chi2_cpd</td>\n", + " <td>0.771400</td>\n", + " <td>3.931015</td>\n", + " <td>52235.161493</td>\n", + " <td>0.7742</td>\n", + " <td>6.280008</td>\n", + " <td>1542226665</td>\n", + " </tr>\n", + " <tr>\n", + " <th>9</th>\n", + " <td>4</td>\n", + " <td>None</td>\n", + " <td>50</td>\n", + " <td>cifar10</td>\n", + " <td>chi2_cpd</td>\n", + " <td>0.416900</td>\n", + " <td>3.507496</td>\n", + " <td>50602.315975</td>\n", + " <td>0.4124</td>\n", + " <td>5.679052</td>\n", + " <td>1542215637</td>\n", + " </tr>\n", + " <tr>\n", + " <th>10</th>\n", + " <td>128</td>\n", + " <td>None</td>\n", + " <td>50</td>\n", + " <td>cifar10</td>\n", + " <td>chi2_cpd</td>\n", + " <td>0.866000</td>\n", + " <td>4.048859</td>\n", + " <td>52158.011988</td>\n", + " <td>0.8743</td>\n", + " <td>6.378982</td>\n", + " <td>1542230395</td>\n", + " </tr>\n", + " <tr>\n", + " <th>11</th>\n", + " <td>128</td>\n", + " <td>None</td>\n", + " <td>50</td>\n", + " <td>svhn</td>\n", + " <td>chi2_cpd</td>\n", + " <td>0.949639</td>\n", + " <td>9.729126</td>\n", + " <td>74122.297888</td>\n", + " <td>0.9451</td>\n", + " <td>5.790046</td>\n", + " <td>1542264179</td>\n", + " </tr>\n", + " <tr>\n", + " <th>12</th>\n", + " <td>4</td>\n", + " <td>None</td>\n", + " <td>50</td>\n", + " <td>svhn</td>\n", + " <td>chi2_cpd</td>\n", + " <td>0.196694</td>\n", + " <td>3.032919</td>\n", + " <td>153685.657897</td>\n", + " <td>0.1881</td>\n", + " <td>1.741903</td>\n", + " <td>1542235855</td>\n", + " </tr>\n", + " <tr>\n", + " <th>13</th>\n", + " <td>256</td>\n", + " <td>None</td>\n", + " <td>50</td>\n", + " <td>mnist</td>\n", + " <td>chi2_cpd</td>\n", + " <td>0.893000</td>\n", + " <td>0.159199</td>\n", + " <td>13036.495552</td>\n", + " <td>0.8919</td>\n", + " <td>0.163529</td>\n", + " <td>1542213923</td>\n", + " </tr>\n", + " <tr>\n", + " <th>14</th>\n", + " <td>128</td>\n", + " <td>None</td>\n", + " <td>50</td>\n", + " <td>mnist</td>\n", + " <td>chi2_cpd</td>\n", + " <td>0.891800</td>\n", + " <td>0.172438</td>\n", + " <td>18421.614211</td>\n", + " <td>0.8869</td>\n", + " <td>0.222979</td>\n", + " <td>1542211961</td>\n", + " </tr>\n", + " <tr>\n", + " <th>15</th>\n", + " <td>64</td>\n", + " <td>None</td>\n", + " <td>50</td>\n", + " <td>svhn</td>\n", + " <td>chi2_cpd</td>\n", + " <td>0.196694</td>\n", + " <td>3.062441</td>\n", + " <td>72432.295633</td>\n", + " <td>0.1881</td>\n", + " <td>2.894550</td>\n", + " <td>1542259094</td>\n", + " </tr>\n", + " <tr>\n", + " <th>16</th>\n", + " <td>256</td>\n", + " <td>None</td>\n", + " <td>50</td>\n", + " <td>cifar10</td>\n", + " <td>chi2_cpd</td>\n", + " <td>0.868800</td>\n", + " <td>4.033883</td>\n", + " <td>55950.356706</td>\n", + " <td>0.8736</td>\n", + " <td>6.381946</td>\n", + " <td>1542231096</td>\n", + " </tr>\n", + " <tr>\n", + " <th>17</th>\n", + " <td>512</td>\n", + " <td>None</td>\n", + " <td>50</td>\n", + " <td>mnist</td>\n", + " <td>chi2_cpd</td>\n", + " <td>0.888600</td>\n", + " <td>0.561707</td>\n", + " <td>12977.160620</td>\n", + " <td>0.8778</td>\n", + " <td>0.575028</td>\n", + " <td>1542215550</td>\n", + " </tr>\n", + " <tr>\n", + " <th>18</th>\n", + " <td>16</td>\n", + " <td>None</td>\n", + " <td>50</td>\n", + " <td>svhn</td>\n", + " <td>chi2_cpd</td>\n", + " <td>0.196694</td>\n", + " <td>2.846475</td>\n", + " <td>72815.976671</td>\n", + " <td>0.1881</td>\n", + " <td>1.661851</td>\n", + " <td>1542255462</td>\n", + " </tr>\n", + " <tr>\n", + " <th>19</th>\n", + " <td>16</td>\n", + " <td>None</td>\n", + " <td>50</td>\n", + " <td>mnist</td>\n", + " <td>chi2_cpd</td>\n", + " <td>0.843900</td>\n", + " <td>0.056367</td>\n", + " <td>10432.334221</td>\n", + " <td>0.8413</td>\n", + " <td>0.090400</td>\n", + " <td>1542205108</td>\n", + " </tr>\n", + " <tr>\n", + " <th>20</th>\n", + " <td>16</td>\n", + " <td>None</td>\n", + " <td>50</td>\n", + " <td>cifar10</td>\n", + " <td>chi2_cpd</td>\n", + " <td>0.114000</td>\n", + " <td>1.127676</td>\n", + " <td>32099.498744</td>\n", + " <td>0.1219</td>\n", + " <td>1.698693</td>\n", + " <td>1542226974</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " --nys-size --out-dim --subs-every dataset kernel test_acc test_eval_time training_time val_acc val_eval_time file_timestamp\n", + "0 64 None 50 mnist chi2_cpd 0.899000 0.064964 26350.607944 0.8969 0.115967 1542209490\n", + "1 8 None 50 svhn chi2_cpd 0.196694 3.221060 153978.042774 0.1881 1.785691 1542242240\n", + "2 64 None 50 cifar10 chi2_cpd 0.857200 3.840925 35606.153394 0.8645 5.962165 1542228549\n", + "3 256 None 50 svhn chi2_cpd 0.196694 10.474136 116107.833837 0.1881 6.086989 1542266269\n", + "4 512 None 50 svhn chi2_cpd 0.949370 4.025452 75948.217098 0.9427 2.080920 1542266919\n", + "5 512 None 50 cifar10 chi2_cpd 0.871200 4.787930 56967.586779 0.8787 7.037983 1542231301\n", + "6 4 None 50 mnist chi2_cpd 0.550200 0.033261 12351.705050 0.5486 0.068031 1542199505\n", + "7 8 None 50 mnist chi2_cpd 0.812400 0.070989 13508.359984 0.8031 0.077030 1542202109\n", + "8 8 None 50 cifar10 chi2_cpd 0.771400 3.931015 52235.161493 0.7742 6.280008 1542226665\n", + "9 4 None 50 cifar10 chi2_cpd 0.416900 3.507496 50602.315975 0.4124 5.679052 1542215637\n", + "10 128 None 50 cifar10 chi2_cpd 0.866000 4.048859 52158.011988 0.8743 6.378982 1542230395\n", + "11 128 None 50 svhn chi2_cpd 0.949639 9.729126 74122.297888 0.9451 5.790046 1542264179\n", + "12 4 None 50 svhn chi2_cpd 0.196694 3.032919 153685.657897 0.1881 1.741903 1542235855\n", + "13 256 None 50 mnist chi2_cpd 0.893000 0.159199 13036.495552 0.8919 0.163529 1542213923\n", + "14 128 None 50 mnist chi2_cpd 0.891800 0.172438 18421.614211 0.8869 0.222979 1542211961\n", + "15 64 None 50 svhn chi2_cpd 0.196694 3.062441 72432.295633 0.1881 2.894550 1542259094\n", + "16 256 None 50 cifar10 chi2_cpd 0.868800 4.033883 55950.356706 0.8736 6.381946 1542231096\n", + "17 512 None 50 mnist chi2_cpd 0.888600 0.561707 12977.160620 0.8778 0.575028 1542215550\n", + "18 16 None 50 svhn chi2_cpd 0.196694 2.846475 72815.976671 0.1881 1.661851 1542255462\n", + "19 16 None 50 mnist chi2_cpd 0.843900 0.056367 10432.334221 0.8413 0.090400 1542205108\n", + "20 16 None 50 cifar10 chi2_cpd 0.114000 1.127676 32099.498744 0.1219 1.698693 1542226974" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(df_conv_hand)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.concat([df_conv_hand, df_no_conv_hand], axis=0, ignore_index=True, sort=True)\n", + "df.loc[df[\"--subs-every\"] != 50., \"--subs-every\"] = 1\n", + "df.loc[df[\"network\"].isnull(), \"network\"] = \"deepstrom\"" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "nb_classes_datasets = {\n", + " \"svhn\": 10,\n", + " \"cifar10\": 10,\n", + " \"mnist\": 10,\n", + " \"cifar100\": 100\n", + "}\n", + "\n", + "nb_feature_convs = {\n", + " \"svhn\": 512,\n", + " \"cifar10\": 512,\n", + " \"mnist\": 16,\n", + " \"cifar100\": 512\n", + "}\n", + "\n", + "conv_status = {\n", + " 1: \"no_conv_hand\",\n", + " 50: \"conv_hand\"\n", + "}\n", + "\n", + "min_acc = 0\n", + "max_acc = 1" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "def post_processing_figures(f, ax, nbparamdeepstrom, subsample_sizes):\n", + " ax.set_ylim(min_acc, max_acc)\n", + " ax.set_ylabel(\"Accuracy\")\n", + " ax.set_xticks([1e4, 1e5, 1e6])\n", + " ax.set_xlabel(\"# Learnable Parameters\")\n", + " ax.legend(bbox_to_anchor=(0.5, -0.20), loc=\"upper center\", ncol=2)\n", + " ax.set_xticklabels([1e4, 1e5, 1e6])\n", + " ax.set_xscale(\"symlog\")\n", + "\n", + " ax_twin = ax.twiny()\n", + " ax_twin.set_xscale(\"symlog\")\n", + " ax_twin.set_xlim(ax.get_xlim())\n", + " ax_twin.set_xticks(sorted(nbparamdeepstrom))\n", + " ax_twin.set_xticklabels(sorted(subsample_sizes))\n", + " ax_twin.set_xlabel(\"Subsample Size\")\n", + " ax.set_title(\"{}\".format(DATANAME), y=1.2)\n", + "\n", + " f.set_size_inches(8, 6)\n", + " f.tight_layout()\n", + " f.subplots_adjust(bottom=0.3)\n", + "\n", + " out_name = \"end_to_end_{}\".format(DATANAME)\n", + " return\n", + " base_out_dir = os.path.abspath(__file__.split(\".\")[0])\n", + " base_out_dir_path = pathlib.Path(base_out_dir) / \"images\"\n", + " base_out_dir_path.mkdir(parents=True, exist_ok=True)\n", + " out_path = obase_out_dir_path / out_name\n", + " logger.debug(out_path)\n", + " f.savefig(out_path)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2018-11-22 14:42:53,138 [24184] DEBUG root: Nystrom possible sizes are: {64, 256, 512, 128, 4, 8, '8', '256', '16', '64', '512', 16, '128', '4'}\n", + "2018-11-22 14:42:53,139 [24184] DEBUG root: Kernel functions are: {'chi2_cpd'}\n", + "2018-11-22 14:42:53,141 [24184] DEBUG root: Compared network types are: {'deepfriedconvnet', 'deepstrom', 'dense'}\n", + "2018-11-22 14:42:53,142 [24184] DEBUG root: Tested representation dimension are: {'64', '16', '128', '1024'}\n", + "2018-11-22 14:42:53,143 [24184] DEBUG root: Tested sub every: {1.0, 50.0}\n", + "2018-11-22 14:42:53,218 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=sans-serif:style=normal:variant=normal:weight=normal:stretch=normal:size=12.0 to DejaVu Sans ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSans.ttf') with score of 0.050000\n", + "2018-11-22 14:42:53,249 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=sans-serif:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to DejaVu Sans ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSans.ttf') with score of 0.050000\n", + "2018-11-22 14:42:53,257 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=STIXGeneral:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to STIXGeneral ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/STIXGeneral.ttf') with score of 0.050000\n", + "2018-11-22 14:42:53,264 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=STIXGeneral:style=italic:variant=normal:weight=normal:stretch=normal:size=10.0 to STIXGeneral ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/STIXGeneralItalic.ttf') with score of 0.050000\n", + "2018-11-22 14:42:53,266 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=STIXGeneral:style=normal:variant=normal:weight=bold:stretch=normal:size=10.0 to STIXGeneral ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/STIXGeneralBol.ttf') with score of 0.000000\n", + "2018-11-22 14:42:53,274 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=STIXNonUnicode:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to STIXNonUnicode ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/STIXNonUni.ttf') with score of 0.050000\n", + "2018-11-22 14:42:53,282 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=STIXNonUnicode:style=italic:variant=normal:weight=normal:stretch=normal:size=10.0 to STIXNonUnicode ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/STIXNonUniIta.ttf') with score of 0.050000\n", + "2018-11-22 14:42:53,289 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=STIXNonUnicode:style=normal:variant=normal:weight=bold:stretch=normal:size=10.0 to STIXNonUnicode ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/STIXNonUniBol.ttf') with score of 0.000000\n", + "2018-11-22 14:42:53,294 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=STIXSizeOneSym:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to STIXSizeOneSym ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizOneSymReg.ttf') with score of 0.050000\n", + "2018-11-22 14:42:53,300 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=STIXSizeTwoSym:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to STIXSizeTwoSym ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizTwoSymReg.ttf') with score of 0.050000\n", + "2018-11-22 14:42:53,306 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=STIXSizeThreeSym:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to STIXSizeThreeSym ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizThreeSymReg.ttf') with score of 0.050000\n", + "2018-11-22 14:42:53,313 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=STIXSizeFourSym:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to STIXSizeFourSym ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizFourSymReg.ttf') with score of 0.050000\n", + "2018-11-22 14:42:53,319 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=STIXSizeFiveSym:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to STIXSizeFiveSym ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizFiveSymReg.ttf') with score of 0.050000\n", + "2018-11-22 14:42:53,332 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=cmsy10:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to cmsy10 ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/cmsy10.ttf') with score of 0.050000\n", + "2018-11-22 14:42:53,337 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=cmr10:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to cmr10 ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/cmr10.ttf') with score of 0.050000\n", + "2018-11-22 14:42:53,343 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=cmtt10:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to cmtt10 ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/cmtt10.ttf') with score of 0.050000\n", + "2018-11-22 14:42:53,349 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=cmmi10:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to cmmi10 ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/cmmi10.ttf') with score of 0.050000\n", + "2018-11-22 14:42:53,357 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=cmb10:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to cmb10 ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/cmb10.ttf') with score of 0.050000\n", + "2018-11-22 14:42:53,364 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=cmss10:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to cmss10 ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/cmss10.ttf') with score of 0.050000\n", + "2018-11-22 14:42:53,370 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=cmex10:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to cmex10 ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/cmex10.ttf') with score of 0.050000\n", + "2018-11-22 14:42:53,379 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=DejaVu Sans:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to DejaVu Sans ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSans.ttf') with score of 0.050000\n", + "2018-11-22 14:42:53,389 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=DejaVu Sans:style=italic:variant=normal:weight=normal:stretch=normal:size=10.0 to DejaVu Sans ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSans-Oblique.ttf') with score of 0.150000\n", + "2018-11-22 14:42:53,390 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=DejaVu Sans:style=normal:variant=normal:weight=bold:stretch=normal:size=10.0 to DejaVu Sans ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSans-Bold.ttf') with score of 0.000000\n", + "2018-11-22 14:42:53,398 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=DejaVu Sans Mono:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to DejaVu Sans Mono ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSansMono.ttf') with score of 0.050000\n", + "2018-11-22 14:42:53,404 [24184] DEBUG matplotlib.font_manager: findfont: Matching :family=DejaVu Sans Display:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to DejaVu Sans Display ('/home/luc/anaconda3/envs/ml/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSansDisplay.ttf') with score of 0.050000\n" + ] + }, + { + "data": { + "image/png": "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vcZVREREJBlUgyMiIiKJowRHREREEkcJjoiIiCSOEhwRERFJHCU4IiIikjhKcERERCRxlOCIiIhI4ijBERERkcRRgiMiIiKJowRHREREEkcJjoiIiCSOEhwRERFJHCU4IiIikjgVcQcgyTVt2rTuFRUVdwCDUDItIsUpBbxRW1t72fDhwz+MOxjJHSU4kjcVFRV37LPPPod269ZtTVlZmccdj4hIQ6lUylatWjXwgw8+uAM4Pe54JHf0q1ryaVC3bt3WK7kRkWJVVlbm3bp1W0eoaZYEUYIj+VSm5EZEil30OaXvw4TRCRUREZHEUYIjReFXTy/o8c/5Kzukz/vn/JUdfvX0gh5xxSQi2z204KGuJzx8wuGD7xk8/ISHTzj8oQUPdd3TbZaXlw8/5JBDBvbv3/+wgw8+eOD111/fo66uLhfhiijBkeIwZL/Om7718Mx+9UnOP3uuMFQAABuYSURBVOev7PCth2f2G7Jf5017st04P0DvvffeztOmTWtdkJ1l8Lvf/W6vCy+8cL9My4477rj+q1evLl+4cGHl6NGjD+rXr99h/fv3P+yGG27oHkc8SfOVr3zlgLvvvrtLrre7YMGCqgEDBhyW6+025aEFD3W9ccqN+6/evLrKcVZvXl1145Qb99/TJKdVq1apN998c97ChQvnPv/8828988wzna677rp9cxW3tGy6i0oK4juPzurz1gcb2u6qzN7tWtVcee+0AXu1q6r5aGN15f5d2275/XNv7/v7597OWP6gfTps+uWZR7y/q23Wf4ACLFu2rOKss87qt27duvLf/OY3y3f7YLL0xBNPdK6trV03fPjwLQ2X1dTUUFlZme8QGvXSSy8tBNi4cWPZr3/966XHHHPMpjVr1pQNHTp04Kmnnro+U8ySXD967Ud9Fq5Z2Oj78801b7arTdVa+rzquuqyn0/++QFPvP1Et0zr9O/Sf9MNR9+wy/dnul69etXecccd7xx11FEDf/3rXy9PpVJcffXVvV977bUO1dXVdvnll3/4ne98Z/Xf/va3Dj/96U/37dq1a82CBf+/vXuPaupKGwb+JCckIQaFBIQCQiDhJDkhXIqAZEAsIq8K7XxCYxAWOMxUuVSrWKauNb1pdWbROli1zhKr01YQO1hmScdrB15doEO7ah3kFsJNEOUShZBwSQi5fX848dUa8FKolNm/v1iH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\n", + "text/plain": [ + "<Figure size 576x432 with 2 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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PtMNGjQofuedd34wYcKEyptvvvmjZDLJVVddVf7SSy/1amhosC996UsrvvnNb1b/61//6nX99dcPLCsra1ywYEGPMWPG1D3yyCPvRyIRrrzyykFPPfVUn2g06kceeeTaO+64o+qjjz6KXXLJJXssXbq0EOCWW25ZfPzxx9e2tS7putSDI51Gr+JYol9pYeOKdfWF/UoLG3sVx9q1qyX1AfrnP/9552QySTwe57LLLisfPXr03hUVFZU33XRT/1Tb73//+7ukln/ta18bCMF/z0OHDh11xhlnDKmoqKg84YQThq1bty4CcOWVVw4aPnz4qIqKispLL720/JlnnimdOnVqn+9973vle+21V+WcOXOKxo8fP/Lqq68edOCBB4788Y9/vMs777xTeMghh1RUVFRUHnLIIRXvvvtuIQT//V9wwQW7H3TQQRXl5eVjHnvssZ4TJ04cMmzYsFFnnnnmkEzP7fnnny8ZO3bsXiNHjqwcM2bM3jU1NRGAjz/+uOBTn/rUnnvsscfoyy+/vDzttRizbNmy2B577NF42GGH1QH07ds3OXz48A2LFy8ubO01nD17dtGECRMqRo4cWVlZWbn3nDlziv71r3/1Gjdu3Mjjjjtu+PDhw0edf/75u6d6yW6//fZ+Q4YMGX3ggQeOfPnll3tu63s2fvz4kVdcccWgMWPG7D1kyJDRTz75ZE+Auro6O+uss4ZUVFRU7r333pX//Oc/e7W2jXg8zqWXXlpeUVFRWVFRUfmTn/xkZ4B//OMfvfbee+/KioqKyokTJw7ZsGGDpV6br33tawMrKyv3rqioqJwxY0ZxIpFg0KBBY6qrq6Op7e6+++6jlyxZ0uo/ic8//3zPsWPH7lVeXj4m1ZuzZs2ayCGHHFKR2va9997bB4LfrWHDho0699xz9xgxYsSoQw89dM/169cbwAsvvFAycuTIyv3222+vW265JWs9bFvSPNxsbfn2qqysbEgmkyxdujR222239e/du3di9uzZ82bNmjXvrrvuGjB//vxCgHnz5vX49a9/vWThwoVzFi9eXPTMM8/0XL58efTxxx/v++67785555135v70pz9dBnDZZZcN/vrXv7589uzZ8x5++OFFl19++ZD2rFk6L/XgSIfYWk8LbN4tdcmhQ5b97c2qAV8+Zs+Pjt17l3XtWUf6B+gDDzzQJ/UBumHDBjvwwAP3OuWUU9bOnTu3eOHChcVvvfXWPHfn2GOPHfHEE0/0HDZsWMMHH3xQ/Pvf//6D448/vnbixIlDbrrppgFXXXVV9eOPP973vffemx2JRKiuro72798/ceyxx64++eST11xyySU1qZ+/evXq6Ouvv74A4Oijjx5x/vnnr/zyl7+88rbbbut3xRVXDJ46deoigDVr1sReeeWVd+67774+55xzzp7PPvvs/AMOOGDDPvvss/fLL7/cY8KECRtS29y4caNdcMEFw6dMmbLoiCOOqFu1alWkZ8+eSYC5c+eWzJo1a26PHj2SI0aMGH3ttdcuHzFiRGOm12bBggWFc+fOLTniiCPWt/b6nX/++UOvvfbajydNmrS6rq7OEomEvf/++4Vvv/126YwZM2ZXVFQ0HH744XvefffdfY8++uj1N9xww8Dp06fPKysrS0yYMGHk6NGjt3mXYzwet7fffnveAw880Pv6668feMIJJ7zzs5/9bGeAd955Z+6MGTOKTzzxxD0XLVo0u6SkpMVZezfffPOADz/8sGjOnDlzCwoKWL58ebSurs4uu+yyoU8//fSCffbZp/70008fctNNNw34wQ9+sAKgf//+8blz58674YYbBtxwww27PPDAAx8ef/zxq6dMmdLnmmuuWfnss8+WlpeXNwwePDjeWt3Lly8veOONN+bPnDmz+PTTTx9xySWX1JSUlCQfe+yxhWVlZclly5bFDjrooL3OP//81QCLFy8uvvfee9+bMGHChyeeeOKwu+++u++VV1656gtf+MKQW2+9dfFJJ520/rLLLitv7eftiK31tBz14FFjqjdUtwi+/Xv0b/jLyX9Z0J61uAdv4dSpU3eaP39+yaOPPtoXYN26ddG5c+cWFxYW+pgxY2qHDx/eCDBq1Ki6RYsWFR599NHri4qKkueee+4eJ5100ppzzjlnDcBLL72007vvvtsjtf3169dHa2pqIn379k22Z93S+agHRzqFVLi55ez93vu/U0Z9dMvZ+72XfkxOe0r/AH3wwQf77bXXXpVjx47du6amJjZ37tziJ598cqdp06btVFlZWTlq1KjKRYsWFc+fP78YYNddd21IdW9feOGFK19++eWeZWVlidQH61133dUnFS4yOe+881alpmfMmFF66aWXrgK44oorVk2fPn1TD8dJJ520OhKJsP/++9f169evcfz4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\n", + "text/plain": [ + "<Figure size 576x432 with 2 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 576x432 with 2 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "method_names = set(df[\"network\"].values)\n", + "kernel_names = set(df[\"kernel\"].values)\n", + "kernel_names.remove(\"None\")\n", + "repr_dim = set(df[\"--out-dim\"].values)\n", + "repr_dim.remove(\"None\") # dtype: str\n", + "nys_size = set(df[\"--nys-size\"].values)\n", + "nys_size.remove(\"None\")\n", + "datasets = set(df[\"dataset\"])\n", + "subs_everies = set(df[\"--subs-every\"].values)\n", + "\n", + "logger.debug(\"Nystrom possible sizes are: {}\".format(nys_size))\n", + "logger.debug(\"Kernel functions are: {}\".format(kernel_names))\n", + "logger.debug(\"Compared network types are: {}\".format(method_names))\n", + "logger.debug(\"Tested representation dimension are: {}\".format(repr_dim))\n", + "logger.debug(f\"Tested sub every: {subs_everies}\")\n", + "\n", + "for DATANAME in datasets:\n", + " df_data = df[df[\"dataset\"] == DATANAME]\n", + " nb_classes_dataset = nb_classes_datasets[DATANAME]\n", + " nb_feature_conv = nb_feature_convs[DATANAME]\n", + " f, ax = plt.subplots()\n", + " for k_name in kernel_names:\n", + " df_kernel = df_data[df_data[\"kernel\"] == k_name]\n", + " for sub_every in subs_everies:\n", + " df_sub_every = df_kernel[df_kernel[\"--subs-every\"] == sub_every]\n", + " accuracies_kernel = df_sub_every[\"test_acc\"]\n", + " subsample_sizes_kernel = df_sub_every[\"--nys-size\"].astype(int)\n", + " np_param = (np.square(subsample_sizes_kernel) + # m x m\n", + " subsample_sizes_kernel * nb_classes_dataset) # m x c\n", + " sorted_idx = np.argsort(np_param.values)\n", + " xx = np_param.values[sorted_idx]\n", + " yy = accuracies_kernel.values[sorted_idx].astype(float)\n", + " ax.plot(xx, yy, marker=\"x\", label=f\"Deepstrom {k_name} - {conv_status[int(sub_every)]}\")\n", + " \n", + " df_dense = df_data[df_data[\"network\"] == \"dense\"]\n", + " accuracies_dense = df_dense[\"test_acc\"]\n", + " out_dim_dense = df_dense[\"--out-dim\"].astype(int)\n", + " np_param_dense = (nb_feature_conv * out_dim_dense + # d x D\n", + " out_dim_dense * nb_classes_dataset) # D x c\n", + " sorted_idx_dense = np.argsort(np_param_dense.values)\n", + " xx = np_param_dense.values[sorted_idx_dense]\n", + " yy = accuracies_dense.values[sorted_idx_dense].astype(float)\n", + " ax.plot(xx, yy, marker=\"o\", label=f\"Dense\")\n", + " post_processing_figures(f, ax, np_param, subsample_sizes_kernel)" + ] + }, + { + "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.6.6" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/main/experiments/graph_drawing/november_2018/classif_end_to_end_subsample_conv_hand_with_augment/mixed_results/no_conv_hand_vs_conv_hand.py b/main/experiments/graph_drawing/november_2018/classif_end_to_end_subsample_conv_hand_with_augment/mixed_results/no_conv_hand_vs_conv_hand.py new file mode 100644 index 0000000000000000000000000000000000000000..772b7b5098266b61fcfe0c9c1251370f62c50e92 --- /dev/null +++ b/main/experiments/graph_drawing/november_2018/classif_end_to_end_subsample_conv_hand_with_augment/mixed_results/no_conv_hand_vs_conv_hand.py @@ -0,0 +1,176 @@ + +# coding: utf-8 + +# In[1]: + + +import pandas as pd +import matplotlib +import matplotlib.pyplot as plt +import numpy as np +import pathlib +import os + +from skluc.main.utils import logger + +matplotlib.rcParams.update({'font.size': 14}) +pd.set_option('display.expand_frame_repr', False) + + +# In[7]: + + +def build_df(dirname, filename): + filepath = os.path.join(dirname, filename) + df = pd.read_csv(filepath) + df = df.apply(pd.to_numeric, errors="ignore") + df = df.drop_duplicates() + col_to_delete = ['--batch-size', '--chi-square-PD-kernel', '--chi-square-kernel', + '--cifar10', '--cifar100', '--exp-chi-square-kernel', + '--intercept-constant', '--laplacian-kernel', '--linear-kernel', + '--mnist', '--quiet', '--rbf-kernel', + '--sigmoid-kernel', '--stacked-kernel', '--sumed-kernel', '--svhn', + '--tensorboard', '--validation-size', + 'deepfriedconvnet', 'deepstrom','dense', "--gamma", "--nb-stack", + "--non-linear", "--non-linearity", "--num-epoch", "--seed", + "--train-size", "--second-layer-size", "activation_function", + "deepstrom_activation", "--real-fastfood", "--real-nystrom" + ] + for c in col_to_delete: + try: + df = df.drop([c], axis=1) + except KeyError as e: + print("pass", e) + + return df + + +# In[8]: + + +DIRNAME = "/home/luc/Resultats/Deepstrom/november_2018/end_to_end_with_augment" +FILENAME = "gathered_results.csv" +df_no_conv_hand = build_df(DIRNAME, FILENAME) + + +# In[9]: + + +DIRNAME = "/home/luc/Resultats/Deepstrom/november_2018/end_to_end_subsample_conv_hand_with_augment" +FILENAME = "gathered_results.csv" +df_conv_hand = build_df(DIRNAME, FILENAME) + + + +df = pd.concat([df_conv_hand, df_no_conv_hand], axis=0, ignore_index=True, sort=True) +df.loc[df["--subs-every"] != 50., "--subs-every"] = 1 +df.loc[df["network"].isnull(), "network"] = "deepstrom" + + +# In[40]: + + +nb_classes_datasets = { + "svhn": 10, + "cifar10": 10, + "mnist": 10, + "cifar100": 100 +} + +nb_feature_convs = { + "svhn": 512, + "cifar10": 512, + "mnist": 16, + "cifar100": 512 +} + +conv_status = { + 1: "no_conv_hand", + 50: "conv_hand" +} + +min_acc = 0 +max_acc = 1 + + +# In[41]: + + +def post_processing_figures(f, ax, nbparamdeepstrom, subsample_sizes): + ax.set_ylim(min_acc, max_acc) + ax.set_ylabel("Accuracy") + ax.set_xticks([1e4, 1e5, 1e6]) + ax.set_xlabel("# Learnable Parameters") + ax.legend(bbox_to_anchor=(0.5, -0.20), loc="upper center", ncol=2) + ax.set_xticklabels([1e4, 1e5, 1e6]) + ax.set_xscale("symlog") + + ax_twin = ax.twiny() + ax_twin.set_xscale("symlog") + ax_twin.set_xlim(ax.get_xlim()) + ax_twin.set_xticks(sorted(nbparamdeepstrom)) + ax_twin.set_xticklabels(sorted(subsample_sizes)) + ax_twin.set_xlabel("Subsample Size") + ax.set_title("{}".format(DATANAME), y=1.2) + + f.set_size_inches(8, 6) + f.tight_layout() + f.subplots_adjust(bottom=0.3) + + out_name = "end_to_end_{}".format(DATANAME) + base_out_dir = os.path.abspath(__file__.split(".")[0]) + base_out_dir_path = pathlib.Path(base_out_dir) / "images" + base_out_dir_path.mkdir(parents=True, exist_ok=True) + out_path = base_out_dir_path / out_name + logger.debug(out_path) + f.savefig(out_path) + + +# In[42]: + + +method_names = set(df["network"].values) +kernel_names = set(df["kernel"].values) +kernel_names.remove("None") +repr_dim = set(df["--out-dim"].values) +repr_dim.remove("None") # dtype: str +nys_size = set(df["--nys-size"].values) +nys_size.remove("None") +datasets = set(df["dataset"]) +subs_everies = set(df["--subs-every"].values) + +logger.debug("Nystrom possible sizes are: {}".format(nys_size)) +logger.debug("Kernel functions are: {}".format(kernel_names)) +logger.debug("Compared network types are: {}".format(method_names)) +logger.debug("Tested representation dimension are: {}".format(repr_dim)) +logger.debug(f"Tested sub every: {subs_everies}") + +for DATANAME in datasets: + df_data = df[df["dataset"] == DATANAME] + nb_classes_dataset = nb_classes_datasets[DATANAME] + nb_feature_conv = nb_feature_convs[DATANAME] + f, ax = plt.subplots() + for k_name in kernel_names: + df_kernel = df_data[df_data["kernel"] == k_name] + for sub_every in subs_everies: + df_sub_every = df_kernel[df_kernel["--subs-every"] == sub_every] + accuracies_kernel = df_sub_every["test_acc"] + subsample_sizes_kernel = df_sub_every["--nys-size"].astype(int) + np_param = (np.square(subsample_sizes_kernel) + # m x m + subsample_sizes_kernel * nb_classes_dataset) # m x c + sorted_idx = np.argsort(np_param.values) + xx = np_param.values[sorted_idx] + yy = accuracies_kernel.values[sorted_idx].astype(float) + ax.plot(xx, yy, marker="x", label=f"Deepstrom {k_name} - {conv_status[int(sub_every)]}") + + df_dense = df_data[df_data["network"] == "dense"] + accuracies_dense = df_dense["test_acc"] + out_dim_dense = df_dense["--out-dim"].astype(int) + np_param_dense = (nb_feature_conv * out_dim_dense + # d x D + out_dim_dense * nb_classes_dataset) # D x c + sorted_idx_dense = np.argsort(np_param_dense.values) + xx = np_param_dense.values[sorted_idx_dense] + yy = accuracies_dense.values[sorted_idx_dense].astype(float) + ax.plot(xx, yy, marker="o", label=f"Dense") + post_processing_figures(f, ax, np_param, subsample_sizes_kernel) +