{ "cells": [ { "cell_type": "code", "execution_count": 74, "metadata": { "ExecuteTime": { "end_time": "2018-10-21T07:56:11.075394Z", "start_time": "2018-10-21T07:56:11.041609Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/hegder/anaconda3/lib/python3.7/site-packages/ipyparallel/client/client.py:459: RuntimeWarning: \n", " Controller appears to be listening on localhost, but not on this machine.\n", " If this is true, you should specify Client(...,sshserver='you@Gamma')\n", " or instruct your controller to listen on an external IP.\n", " RuntimeWarning)\n" ] }, { "data": { "text/plain": [ "[0, 1, 2, 3, 4, 5, 6, 7]" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import ipyparallel as ipp\n", "\n", "rc = ipp.Client()\n", "dview = rc[:]\n", "\n", "rc.ids" ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "ExecuteTime": { "end_time": "2018-10-21T07:56:20.877563Z", "start_time": "2018-10-21T07:56:14.818972Z" }, "attributes": { "classes": [], "id": "", "n": "413" }, "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The autoreload extension is already loaded. To reload it, use:\n", " %reload_ext autoreload\n", "Dataset has been loaded\n", "[stdout:0] Dataset has been loaded\n", "[stdout:1] Dataset has been loaded\n", "[stdout:2] Dataset has been loaded\n", "[stdout:3] Dataset has been loaded\n", "[stdout:4] Dataset has been loaded\n", "[stdout:5] Dataset has been loaded\n", "[stdout:6] Dataset has been loaded\n", "[stdout:7] Dataset has been loaded\n" ] } ], "source": [ "%%px --local\n", "%load_ext autoreload\n", "%autoreload 2\n", "\n", "import numpy as np\n", "import mxnet as mx\n", "#import matplotlib.pyplot as plt\n", "import h5py\n", "from sklearn.model_selection import train_test_split\n", "# # # #import jtplot submodule from jupyterthemes\n", "# # # from jupyterthemes import jtplot\n", "# # # #currently installed theme will be used to\n", "# # # #set plot style if no arguments provided\n", "# # # jtplot.style()\n", "\n", "#now load this dataset \n", "h5f = h5py.File('./datasets/s8_sio2tio2_v2.h5','r')\n", "X = h5f['sizes'][:]\n", "Y = h5f['spectrum'][:]\n", "\n", "#create a train - test split of the dataset\n", "x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.4, random_state=42)\n", "# normalize inputs \n", "#x_test = (x_test - 50)/20 \n", "\n", "print(\"Dataset has been loaded\")\n", "\n", "\n", "\n", "# # Step1: Load the model in MXNet\n", "\n", "# # # Use the same prefix and epoch parameters we used in save_mxnet_model API.\n", "sym, arg_params, aux_params = mx.model.load_checkpoint(prefix='./models/my_mod_convprel', epoch=0)\n", "\n", "# We use the data_names and data_shapes returned by save_mxnet_model API.\n", "mod = mx.mod.Module(symbol=sym, \n", " data_names=['/first_input6'], \n", " context=mx.gpu(), \n", " label_names=None)\n", "mod.bind(for_training=False, \n", " data_shapes=[('/first_input6', (1,8))], \n", " label_shapes=mod._label_shapes)\n", "mod.set_params(arg_params, aux_params, allow_missing=True) \n", "\n", "\n", "#resnet - my_mod_bet input_21\n", "#fullycon - my_mod_fullycon first_input2\n", "#conv1d - my_mod_conv1d - first_input4\n", "#convprel - my_mod_convprel - first_input6" ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "ExecuteTime": { "end_time": "2018-10-21T07:56:42.662949Z", "start_time": "2018-10-21T07:56:42.561201Z" }, "code_folding": [], "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The autoreload extension is already loaded. To reload it, use:\n", " %reload_ext autoreload\n", "[stdout:0] \n", "The autoreload extension is already loaded. To reload it, use:\n", " %reload_ext autoreload\n", "[stdout:1] \n", "The autoreload extension is already loaded. To reload it, use:\n", " %reload_ext autoreload\n", "[stdout:2] \n", "The autoreload extension is already loaded. To reload it, use:\n", " %reload_ext autoreload\n", "[stdout:3] \n", "The autoreload extension is already loaded. To reload it, use:\n", " %reload_ext autoreload\n", "[stdout:4] \n", "The autoreload extension is already loaded. To reload it, use:\n", " %reload_ext autoreload\n", "[stdout:5] \n", "The autoreload extension is already loaded. To reload it, use:\n", " %reload_ext autoreload\n", "[stdout:6] \n", "The autoreload extension is already loaded. To reload it, use:\n", " %reload_ext autoreload\n", "[stdout:7] \n", "The autoreload extension is already loaded. To reload it, use:\n", " %reload_ext autoreload\n" ] } ], "source": [ "\n", "%%px --local\n", "%load_ext autoreload\n", "%autoreload 2\n", "\n", "\n", "#%%px --local\n", "import time\n", "import de2 as de\n", "import loss_defs as ld\n", "\n", "bnds = [(30, 70)]*8\n", "mats = np.array([3, 4, 3, 4, 3, 4, 3, 4])\n", "lams = np.linspace(300, 1200, 256)\n", "targ_spec = y_test[29]\n", "\n", "\n", "from sklearn.model_selection import ParameterGrid\n", "param_grid = {\n", " 'psize': [80, 160, 320], \n", " 'psnew': [20, 40],\n", " 'crossp': [0.4, 0.5, 0.6, 0.7, 0.8]\n", " }\n", "grid = ParameterGrid(param_grid) \n", "\n", "def dE_stat(psize,psnew,its_first,its_second,mut,crossp):\n", " return psize, psnew, crossp\n", "\n", "\n", "def de_stat(psize,psnew,its_first,its_second,mut,crossp):\n", " run_time_tot = []\n", " run_pmre = []\n", " reps = 20\n", " targ_spec2 = np.tile(targ_spec, (psize,1))\n", " for rep in range(reps):\n", "# print(rep)\n", " start = time.time()\n", " pop, f, b, hstry = de.de_g(\n", " fobj=ld.mxmod_arr_loss, \n", " bounds=bnds, \n", " mut=mut,\n", " crossp=crossp,\n", " popsize=psize, \n", " its=its_first, \n", " target=targ_spec2, \n", " mxmodel=mod) \n", " marg = int(psnew/5)\n", " pnew1 = pop[np.argsort(f)][:psnew-marg]\n", " pnew2 = pop[np.argsort(f)][psnew-marg:psnew]\n", " pnew = np.concatenate((pnew1, pnew2))\n", " b, c, hstry = de.de_c(\n", " fobj=ld.loss_func, \n", " bounds=bnds, \n", " pop=pnew, \n", " history=hstry, \n", " it_start=its_first, \n", " mut=mut,\n", " crossp=crossp,\n", " popsize=psnew, \n", " its=its_second, \n", " target=targ_spec, \n", " mats=mats, \n", " lams=lams)\n", " end = time.time()\n", " run_time_tot.append((end - start)/60.0)\n", " run_pmre.append(c)\n", " return np.mean(run_pmre), np.std(run_pmre), np.mean(run_time_tot)\n", " \n", " \n", "\n", "# pm, pstd, rmd = de_stat(psize=80,psnew=10,its_first=500,its_second=100,mut=0.8,crossp=0.7)\n", "\n", "\n", "# pm, pstd, rmd\n", "\n", "\n", "\n", "# print(grid)\n", "# for mem in grid:\n", "# for key in mem:\n", "# print(key, mem[key])" ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "ExecuteTime": { "end_time": "2018-10-21T07:56:47.477288Z", "start_time": "2018-10-21T07:56:47.446944Z" } }, "outputs": [], "source": [ "\n", "def ff(x):\n", " for pset in grid:\n", "# print(x,pset)\n", " pm, pstd, rmd = de_stat(psize=pset['psize'],\n", " psnew=pset['psnew'],\n", " its_first=500,\n", " its_second=300,\n", " mut=x,\n", " crossp=pset['crossp']\n", " )\n", " print(pm)\n", " print(pstd)\n", " print(rmd)\n", " \n", "\n", " \n", "#asyn = dview.map_async(ff,[0.5 ,0.6, 0.7, 0.8, 0.9, 1.0])\n", "#ff(0.5)" ] }, { "cell_type": "code", "execution_count": 130, "metadata": { "ExecuteTime": { "end_time": "2018-10-22T05:00:49.533990Z", "start_time": "2018-10-22T05:00:49.510783Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'crossp': 0.4, 'psize': 80, 'psnew': 20}\n", "{'crossp': 0.4, 'psize': 80, 'psnew': 40}\n", "{'crossp': 0.4, 'psize': 160, 'psnew': 20}\n", "{'crossp': 0.4, 'psize': 160, 'psnew': 40}\n", "{'crossp': 0.4, 'psize': 320, 'psnew': 20}\n", "{'crossp': 0.4, 'psize': 320, 'psnew': 40}\n", "{'crossp': 0.5, 'psize': 80, 'psnew': 20}\n", "{'crossp': 0.5, 'psize': 80, 'psnew': 40}\n", "{'crossp': 0.5, 'psize': 160, 'psnew': 20}\n", "{'crossp': 0.5, 'psize': 160, 'psnew': 40}\n", "{'crossp': 0.5, 'psize': 320, 'psnew': 20}\n", "{'crossp': 0.5, 'psize': 320, 'psnew': 40}\n", "{'crossp': 0.6, 'psize': 80, 'psnew': 20}\n", "{'crossp': 0.6, 'psize': 80, 'psnew': 40}\n", "{'crossp': 0.6, 'psize': 160, 'psnew': 20}\n", "{'crossp': 0.6, 'psize': 160, 'psnew': 40}\n", "{'crossp': 0.6, 'psize': 320, 'psnew': 20}\n", "{'crossp': 0.6, 'psize': 320, 'psnew': 40}\n", "{'crossp': 0.7, 'psize': 80, 'psnew': 20}\n", "{'crossp': 0.7, 'psize': 80, 'psnew': 40}\n", "{'crossp': 0.7, 'psize': 160, 'psnew': 20}\n", "{'crossp': 0.7, 'psize': 160, 'psnew': 40}\n", "{'crossp': 0.7, 'psize': 320, 'psnew': 20}\n", "{'crossp': 0.7, 'psize': 320, 'psnew': 40}\n", "{'crossp': 0.8, 'psize': 80, 'psnew': 20}\n", "{'crossp': 0.8, 'psize': 80, 'psnew': 40}\n", "{'crossp': 0.8, 'psize': 160, 'psnew': 20}\n", "{'crossp': 0.8, 'psize': 160, 'psnew': 40}\n", "{'crossp': 0.8, 'psize': 320, 'psnew': 20}\n", "{'crossp': 0.8, 'psize': 320, 'psnew': 40}\n" ] }, { "data": { "text/plain": [ "['1.1301009177342074\\n0.4433545102972204\\n1.9973992935816451\\n1.1978118829893494\\n0.5433340634490728\\n3.9798421380917235\\n1.185659489902775\\n0.5229318402795373\\n2.0346258413791656\\n1.0203257728233819\\n0.4328800961143291\\n3.9803607704242068\\n0.8853474755214226\\n0.39025710533254293\\n2.121337319811185\\n0.8745737336598876\\n0.40638905130018776\\n4.080368780096372\\n1.136967865218111\\n0.7886459836783719\\n1.98240611632665\\n0.9451676459183451\\n0.5277783073764761\\n3.9399721741676332\\n0.7844991253083601\\n0.3937610638148489\\n2.025443607966105\\n0.6734011736286509\\n0.38459689993557883\\n3.9778435484568284\\n0.8665278899250408\\n0.2808687757479037\\n2.1273476827144626\\n0.6177052586574329\\n0.4141066113118144\\n4.078616928458214\\n0.8431727544353352\\n0.47772518464230207\\n1.9905472344160078\\n0.6821490706154011\\n0.31851586692797107\\n3.930698614319165\\n0.9741885469798364\\n0.45336957655618887\\n2.0287005736430483\\n0.6115425799538209\\n0.37550525802655993\\n4.001479377945264\\n0.7581930624288347\\n0.4149121174683035\\n2.1657771613200505\\n0.5003284847773255\\n0.22693769160774208\\n4.100771123170853\\n1.1322626286374275\\n0.5668394011825106\\n1.9853009955088297\\n0.7048839807939428\\n0.3745864516786753\\n3.9648012067874276\\n0.9706146460076829\\n0.3379920481279331\\n2.0477495978275937\\n',\n", " '1.7131988937392013\\n0.6082128954795456\\n2.0491744035482404\\n1.428553914278536\\n0.44388601231540326\\n4.026420084039371\\n1.5048834539525133\\n0.6004320686610364\\n2.070323901772499\\n1.3652300738904153\\n0.5752924032686485\\n4.047638735373815\\n1.2851497406207808\\n0.4712458455064607\\n2.1543499658505123\\n1.288555356129053\\n0.5452378126342693\\n4.131543535788855\\n0.9432417286544486\\n0.5313847620273383\\n2.0169851638873415\\n0.8030433712227747\\n0.31333406582493717\\n4.0086458082993826\\n1.1686951362812092\\n0.6040593850525044\\n2.0561360931396484\\n0.7595931678749723\\n0.42018298238095614\\n4.037656965454419\\n0.7732462197198566\\n0.4620414649625118\\n2.159047302603722\\n0.6651366818299773\\n0.2803966031569508\\n4.1367970659335445\\n0.824422295237649\\n0.7076529292067809\\n2.014302611152331\\n0.8564287551514026\\n0.6148562094492818\\n3.9965210405985516\\n0.4473499595012697\\n0.16646244114187853\\n2.053109078407288\\n0.37511032775548486\\n0.17614920057713307\\n4.085001927614212\\n0.6445178124316505\\n0.42872612770061946\\n2.178273788094521\\n0.4119336017947929\\n0.48785875665465767\\n4.148923815488816\\n0.7786448683040762\\n0.2742240239185038\\n2.0203872082630796\\n0.521136124176807\\n0.4115570282511671\\n4.011512851119042\\n',\n", " '2.0202662132221905\\n0.5519051815259742\\n2.0411330630381896\\n1.9525635908247334\\n0.4583166928303958\\n4.0116366086403525\\n1.7012429992895874\\n0.5010234174726487\\n2.05347172955672\\n1.7794735270108073\\n0.5739565246000088\\n4.039100284576416\\n1.902040312708279\\n0.590235390140152\\n2.148336291710535\\n1.6673563120526818\\n0.4281516235207753\\n4.117947609623273\\n1.4679933732869754\\n0.5685233570933012\\n2.009277425805728\\n1.330104287115856\\n0.41177355987115677\\n3.9881768296162283\\n1.1120764811546153\\n0.42955289427517757\\n2.0460969281196593\\n1.1942387532132204\\n0.4225048603585446\\n4.010743747154871\\n1.0284985491354715\\n0.3424473998510573\\n2.147831897934278\\n1.123980288082146\\n0.36870879362771974\\n4.125135527253151\\n0.7935004790585237\\n0.5252221493847352\\n2.0050640877087913\\n0.7818966886214718\\n0.6288179172537995\\n3.9696685928106303\\n0.6226464225197723\\n0.32522284959667724\\n2.0490230011940005\\n0.574029498529265\\n0.30407601492058656\\n4.033687982757886\\n0.541954559225437\\n0.27005460245229534\\n2.1696400662263238\\n0.5700938502788664\\n0.39173414086767383\\n4.134017372131348\\n0.6021288481864203\\n0.38725450334791106\\n2.0064195338884994\\n0.41324773147036825\\n0.5100677628891538\\n3.996643919746081\\n0.46487812876084267\\n0.1537636300380001\\n2.054852497180303\\n',\n", " '2.602639688174307\\n0.6152539758296448\\n2.0382266837358474\\n2.3995031384104224\\n0.6499501393566456\\n3.994401550889015\\n2.259091084659232\\n0.602963186643796\\n2.056499874989192\\n2.2681213876612434\\n0.4265081657964298\\n4.004326575398446\\n2.3096017439957017\\n0.5134323378774367\\n2.1406100873152414\\n2.1120005176863494\\n0.5716520001785659\\n4.098231108983358\\n2.155047865321666\\n0.7828864333850875\\n2.000000069737434\\n1.9029291089921103\\n0.4880562531228881\\n3.9659101959069565\\n1.7560436174650165\\n0.5163746560252668\\n2.0408945826689404\\n1.7742001837634098\\n0.7116363757836313\\n4.014057552417119\\n1.6572583448338247\\n0.46828634379324824\\n2.145908726453781\\n1.4429123030339266\\n0.44481300142114194\\n4.108686197400092\\n1.27293922630886\\n0.5662818673094085\\n2.007237128416697\\n1.2525730503892467\\n0.42949140726891766\\n3.971129704713822\\n1.1580120839610792\\n0.5730705717740457\\n2.042637193799019\\n1.0180089852754766\\n0.45462010129597424\\n4.0452399456501\\n0.9660064584262674\\n0.39103967216922736\\n2.1698809492588045\\n0.8647390289764278\\n0.33405666162569775\\n4.120224125583968\\n0.6647269043229528\\n0.6437382980454738\\n2.00329375286897\\n0.4417670451100724\\n0.5577226088784789\\n3.980275276700655\\n0.41874189604338474\\n0.24675496299581018\\n2.050845455129941\\n',\n", " '2.6307611743968344\\n0.5994124514860908\\n2.056917774875959\\n2.9493241444314537\\n0.6988332871974442\\n4.03848379433155\\n2.67712050359448\\n0.633608073041573\\n2.090317832430203\\n2.4557335895738275\\n0.619746104257869\\n4.082432220975559\\n2.4134195710515063\\n0.4391665495051974\\n2.1765918880701065\\n2.5009232355992004\\n0.7942216982459094\\n4.158314067324002\\n2.3757615665940106\\n0.6851848114166125\\n2.0295646576086677\\n2.5493757955727503\\n0.7171438310712324\\n4.032332187692323\\n2.4745165382271272\\n0.43661841812721647\\n2.0768879582484563\\n2.4657203406497175\\n0.8146159751768044\\n4.070289845665296\\n2.0679838749140407\\n0.6254641198679652\\n2.1746263148387275\\n1.7817711663860212\\n0.6819213212511954\\n4.173110035260518\\n1.8388775615440633\\n0.5423864555419324\\n2.0317604217926664\\n1.760583437242597\\n0.521549606749657\\n4.030517698725063\\n1.7599683631112992\\n0.5916651463273739\\n2.0728580902020135\\n1.567926747054944\\n0.6097120447347657\\n4.120572570562362\\n1.3143828126429011\\n0.3698233916009302\\n2.196063496073087\\n1.2778303953645285\\n0.37419203007125834\\n4.166212813854218\\n0.6490895570574913\\n0.5796909499907695\\n2.0343200610081356\\n0.5878032768240684\\n0.3621230434736739\\n4.068542015552521\\n',\n", " '2.9633835944933495\\n0.4875300123238345\\n2.0318510516484585\\n3.1881074389096407\\n0.8280600156469394\\n4.002757206956545\\n2.857410062376154\\n0.6435796953353261\\n2.059861578543981\\n2.6423645770530033\\n0.6120867705147262\\n4.032538525462151\\n2.7043254624645554\\n0.6426567614916722\\n2.1510924446582793\\n2.6640555496411666\\n0.38322716764518094\\n4.115076087315877\\n2.733091179056284\\n0.6967074972645491\\n2.014158252080282\\n2.6019134216324846\\n0.7068171318506802\\n3.9874572998285296\\n2.766560901957191\\n0.8283306451797596\\n2.051886377533277\\n2.5181205384679832\\n0.6528456426506206\\n4.019296195308367\\n2.3271375845874696\\n0.6545213707715772\\n2.158896921674411\\n2.245444359591528\\n0.60293816246193\\n4.126529384851456\\n2.314663068393043\\n0.9068475563315698\\n2.010891869068146\\n2.480824669925902\\n0.8798013072783651\\n3.976544145941734\\n1.99336568212123\\n0.7963924566715616\\n2.0488390940427785\\n2.124499634384107\\n0.5403941964058783\\n4.041366489926975\\n2.2201468525691705\\n0.6541380762345363\\n2.174862318833669\\n1.6451138806443777\\n0.4261259116901617\\n4.130611274639765\\n2.20229291461707\\n0.9319309408962976\\n2.0137547518809633\\n1.663661681026971\\n1.0675678472170074\\n4.019456049601237\\n']" ] }, "execution_count": 130, "metadata": {}, "output_type": "execute_result" } ], "source": [ " for pset in grid:\n", " print(pset)\n", "asyn.stdout" ] }, { "cell_type": "code", "execution_count": 143, "metadata": { "ExecuteTime": { "end_time": "2018-10-22T15:38:41.947961Z", "start_time": "2018-10-22T15:38:41.920319Z" } }, "outputs": [], "source": [ "\n", "\n", "outs=[]\n", "for out in asyn.stdout:\n", " outs.append(out.splitlines())\n", "\n", "outs2 = sum(outs, [])\n", "\n", "outs_f = np.array([float(o) for o in outs2])\n", "outs_f\n", "\n", "a =np.reshape(outs_f, (int(outs_f.size/3),3))\n", "pm = a[:,0]\n", "pstd = a[:,1]\n", "rmd = a[:,2]\n", "\n", "# vals = np.array([float(mem[:-1]) for mem in asyn.stdout])\n", "#asyn.stdout\n", "#asyn.stdout" ] }, { "cell_type": "code", "execution_count": 186, "metadata": { "ExecuteTime": { "end_time": "2018-10-22T17:35:26.733572Z", "start_time": "2018-10-22T17:35:26.427873Z" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "from jupyterthemes import jtplot\n", "jtplot.style(grid=False, fscale=0.7)\n", "\n", "\n", "\n", "pm_80_20 = np.reshape(pm[::6], (6,5))/np.amax(pm)\n", "pm_80_40 = np.reshape(pm[1::6], (6,5))/np.amax(pm)\n", "pm_160_20 = np.reshape(pm[2::6], (6,5))/np.amax(pm)\n", "pm_160_40 = np.reshape(pm[3::6], (6,5))/np.amax(pm)\n", "pm_320_20 = np.reshape(pm[4::6], (6,5))/np.amax(pm)\n", "pm_320_40 = np.reshape(pm[5::6], (6,5))/np.amax(pm)\n", "\n", "fig = plt.figure(figsize=(9,6))\n", "\n", "ax = fig.add_subplot(231)\n", "d2 = ax.imshow(pm_80_20, cmap=\"hot_r\", interpolation='none', extent=[0.4, 0.8, 1.0, 0.5] )\n", "plt.xlabel('Crossover probability')\n", "plt.ylabel('Mutation')\n", "\n", "ax1 = fig.add_subplot(232)\n", "d2 = ax1.imshow(pm_160_20, cmap=\"hot_r\", interpolation='none', extent=[0.4, 0.8, 1.0, 0.5] )\n", "plt.xlabel('Crossover probability')\n", "plt.ylabel('Mutation')\n", "\n", "ax2 = fig.add_subplot(233)\n", "d2 = ax2.imshow(pm_320_20, cmap=\"hot_r\", interpolation='none', extent=[0.4, 0.8, 1.0, 0.5] )\n", "plt.xlabel('Crossover probability')\n", "plt.ylabel('Mutation')\n", "\n", "ax3 = fig.add_subplot(234)\n", "d2 = ax3.imshow(pm_80_40, cmap=\"hot_r\", interpolation='none', extent=[0.4, 0.8, 1.0, 0.5] )\n", "plt.xlabel('Crossover probability')\n", "plt.ylabel('Mutation')\n", "\n", "ax4 = fig.add_subplot(235)\n", "d2 = ax4.imshow(pm_160_40, cmap=\"hot_r\", interpolation='none', extent=[0.4, 0.8, 1.0, 0.5] )\n", "plt.xlabel('Crossover probability')\n", "plt.ylabel('Mutation')\n", "\n", "ax5 = fig.add_subplot(236)\n", "d2 = ax5.imshow(pm_320_40, cmap=\"hot_r\", interpolation='none', extent=[0.4, 0.8, 1.0, 0.5] )\n", "plt.xlabel('Crossover probability')\n", "plt.ylabel('Mutation')\n", "\n", "#plt.colorbar(mappable=d2)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2018-10-20T13:32:36.565912Z", "start_time": "2018-10-20T13:32:21.309964Z" }, "attributes": { "classes": [], "id": "", "n": "414" }, "scrolled": true }, "outputs": [], "source": [ "import time\n", "import de2 as de\n", "import loss_defs as ld\n", "\n", "bnds = [(30, 70)]*8\n", "mats = np.array([3, 4, 3, 4, 3, 4, 3, 4])\n", "lams = np.linspace(300, 1200, 256)\n", "targ_spec = y_test[29]\n", "\n", "psize = 320\n", "targ_spec2 = np.tile(targ_spec, (psize,1))\n", "its_first = 500\n", "psnew = 20\n", "its_second = 300\n", "reps = 100\n", "\n", "\n", "run_hist = []\n", "run_time1 = []\n", "run_time2 = []\n", "run_time_tot = []\n", "run_pmre = []\n", "run_best = []\n", "\n", "for rep in range(reps):\n", " print(\"iteration \", rep)\n", " start = time.time()\n", " pop, f, b, hstry = de.de_g(fobj=ld.mxmod_arr_loss, bounds=bnds, popsize=psize, its=its_first, target=targ_spec2, mxmodel=mod) \n", " #pop, f, b, hstry = de2(fobj=mxmod_arr_loss, bounds=bnds, popsize=psize, its=its_first) \n", " end1 = time.time()\n", " marg = int(psnew/5)\n", " pnew1 = pop[np.argsort(f)][:psnew-marg]\n", " pnew2 = pop[np.argsort(f)][psnew-marg:psnew]\n", " pnew = np.concatenate((pnew1, pnew2))\n", " #b, c, hstry = de_stage2(fobj=loss_func, bounds=bnds, popint=pnew, history=hstry, itprev=its_first, popsize=psnew, its=its_second)\n", " # b, c, hstry = de.de_c(fobj=loss_func, bounds=bnds, popsize=80, its=500)\n", " b, c, hstry = de.de_c(fobj=ld.loss_func, bounds=bnds, pop=pnew, history=hstry, it_start=its_first, popsize=psnew, its=its_second, target=targ_spec, mats=mats, lams=lams)\n", " end = time.time()\n", " run_time1.append((end1 - start)/60.0)\n", " run_time2.append((end - end1)/60.0)\n", " run_time_tot.append((end - start)/60.0)\n", " run_pmre.append(c)\n", " run_best.append(b)\n", " run_hist.append(np.asarray(hstry))\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2018-10-20T10:21:20.278082Z", "start_time": "2018-10-20T10:21:20.249204Z" } }, "outputs": [], "source": [ "pm, pstd, rm, rstd" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2018-10-19T18:01:38.465084Z", "start_time": "2018-10-19T18:01:38.382183Z" } }, "outputs": [], "source": [ "# import jtplot module in notebook\n", "from jupyterthemes import jtplot\n", "\n", "# choose which theme to inherit plotting style from\n", "# onedork | grade3 | oceans16 | chesterish | monokai | solarizedl | solarizedd\n", "#jtplot.style(theme='monokai')\n", "\n", "# set \"context\" (paper, notebook, talk, poster)\n", "# scale font-size of ticklabels, legend, etc.\n", "# remove spines from x and y axes and make grid dashed\n", "#jtplot.style(context='talk', fscale=1.4, spines=False, gridlines='--')\n", "\n", "# turn on X- and Y-axis tick marks (default=False)\n", "# turn off the axis grid lines (default=True)\n", "# and set the default figure size\n", "#jtplot.style(ticks=True, grid=False, figsize=(6, 4.5))\n", "jtplot.style(grid=False, figsize=(4,2), fscale=0.7, s)\n", "# reset default matplotlib rcParams\n", "#jtplot.reset()\n", "plt.s\n", "plt.hist(run_pmre, bins=[0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 1.0, 2.5, 3], density=True, stacked=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2018-10-20T05:57:55.035771Z", "start_time": "2018-10-20T05:57:54.969003Z" } }, "outputs": [], "source": [ "fig, ax = plt.subplots()\n", "ax.hist(run_pmre, bins=np.linspace(0, 2, 33), density=True, stacked=True, histtype='stepfilled')\n", "ax.spines['top'].set_visible(False)\n", "ax.spines['right'].set_visible(False)\n", "ax.set_xlim(left=0.0)\n", "#ax.spines['bottom'].set_visible(False)\n", "#ax.spines['left'].set_visible(False)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2018-10-20T15:36:41.834584Z", "start_time": "2018-10-20T15:36:41.830750Z" } }, "outputs": [], "source": [ "a =np.arange(9)\n", "a =np.reshape(a, (int(a.size/3),3))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2018-10-20T15:37:45.105731Z", "start_time": "2018-10-20T15:37:45.100307Z" } }, "outputs": [], "source": [ "a[:,0]" ] }, { "cell_type": "code", "execution_count": 162, "metadata": { "ExecuteTime": { "end_time": "2018-10-22T16:20:57.506282Z", "start_time": "2018-10-22T16:20:57.478231Z" } }, "outputs": [ { "data": { "text/plain": [ "array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,\n", " 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,\n", " 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,\n", " 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,\n", " 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,\n", " 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,\n", " 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,\n", " 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,\n", " 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,\n", " 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,\n", " 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,\n", " 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156,\n", " 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169,\n", " 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180])" ] }, "execution_count": 162, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = np.arange(1,181)\n", "a" ] }, { "cell_type": "code", "execution_count": 164, "metadata": { "ExecuteTime": { "end_time": "2018-10-22T16:21:46.269259Z", "start_time": "2018-10-22T16:21:46.242063Z" } }, "outputs": [ { "data": { "text/plain": [ "array([ 1, 7, 13, 19, 25, 31, 37, 43, 49, 55, 61, 67, 73,\n", " 79, 85, 91, 97, 103, 109, 115, 121, 127, 133, 139, 145, 151,\n", " 157, 163, 169, 175])" ] }, "execution_count": 164, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a[::6]" ] }, { "cell_type": "code", "execution_count": 160, "metadata": { "ExecuteTime": { "end_time": "2018-10-22T16:10:54.288231Z", "start_time": "2018-10-22T16:10:54.261022Z" } }, "outputs": [ { "data": { "text/plain": [ "array([ 2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50,\n", " 53, 56, 59, 62, 65, 68, 71, 74, 77, 80, 83, 86, 89])" ] }, "execution_count": 160, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a[1::3]" ] }, { "cell_type": "code", "execution_count": 161, "metadata": { "ExecuteTime": { "end_time": "2018-10-22T16:11:28.166555Z", "start_time": "2018-10-22T16:11:28.139986Z" } }, "outputs": [ { "data": { "text/plain": [ "array([ 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51,\n", " 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90])" ] }, "execution_count": 161, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a[2::3]" ] }, { "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.7.0" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autoclose": false, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false } }, "nbformat": 4, "nbformat_minor": 2 }