Skip to content

Instantly share code, notes, and snippets.

@kevinbird15
Created April 26, 2018 06:31
Show Gist options
  • Save kevinbird15/4b832ec5c079473188ef3b51f7702b5d to your computer and use it in GitHub Desktop.
Save kevinbird15/4b832ec5c079473188ef3b51f7702b5d to your computer and use it in GitHub Desktop.
Counting Example for Language Model
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "import fastai\nfrom fastai import learner\nfrom fastai import dataset\nfrom fastai import model\nfrom pathlib import Path\nfrom fastai.text import *\n\nimport pandas as pd\nimport numpy as np\nimport spacy\nimport json\nimport re\nimport html",
"execution_count": 1,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### Creating Data\nUsually I see people use completely random data when they don't have a dataset to show a concept. Instead, I'm going to use a counting dataset that starts at a random number and then counts up 10, wrapping around from \"nine\" to \"zero\". "
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "numbers = [\"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\"]",
"execution_count": 2,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "myData = pd.DataFrame()",
"execution_count": 3,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "def DataGenerator():\n numlist = \"\"\n starting_num = random.randint(0,9)\n for i in range(10):\n if i==0:\n numlist = str(numbers[(starting_num+i)%10])\n else:\n numlist = numlist + \" \" + str(numbers[(starting_num+i)%10])\n return numlist",
"execution_count": 4,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "DataGenerator()",
"execution_count": 5,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 5,
"data": {
"text/plain": "'eight nine zero one two three four five six seven'"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "for i in range(1000):\n myData = myData.append(pd.Series(DataGenerator()), ignore_index=True)",
"execution_count": 6,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "tok = Tokenizer()",
"execution_count": 7,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "texts = myData[0].astype(str)",
"execution_count": 8,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "texts.values[0:10]",
"execution_count": 9,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 9,
"data": {
"text/plain": "array(['zero one two three four five six seven eight nine',\n 'eight nine zero one two three four five six seven',\n 'zero one two three four five six seven eight nine',\n 'eight nine zero one two three four five six seven',\n 'nine zero one two three four five six seven eight',\n 'six seven eight nine zero one two three four five',\n 'two three four five six seven eight nine zero one',\n 'zero one two three four five six seven eight nine',\n 'one two three four five six seven eight nine zero',\n 'six seven eight nine zero one two three four five'], dtype=object)"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "data = tok.proc_all_mp(partition_by_cores(texts.values.astype(str)))",
"execution_count": 10,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Now that we have the data, let's build a frequency map. This will tell us how many times each word was seen. Since we have 5 numbers (0-9) and are doing 100 sequences, all of these will be close to 500. Usually this will not be the case and this part will help filter out any words that are only seen a low number of time. "
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "freq = Counter(p for o in data for p in o)",
"execution_count": 11,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "itos will be used to translate the number back into a string. We are also inserting an \\_eos_ token to signify the end of the string."
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "itos = [o for o,c in freq.most_common(10) if c > 2]\nfor i in [\"_eos_\", \"_pad_\", \"_unk_\"]:\n itos.insert(0, i)",
"execution_count": 12,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "itos",
"execution_count": 13,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 13,
"data": {
"text/plain": "['_unk_',\n '_pad_',\n '_eos_',\n 'zero',\n 'one',\n 'two',\n 'three',\n 'four',\n 'five',\n 'six',\n 'seven',\n 'eight',\n 'nine']"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "freq.most_common(10)",
"execution_count": 14,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 14,
"data": {
"text/plain": "[('zero', 1000),\n ('one', 1000),\n ('two', 1000),\n ('three', 1000),\n ('four', 1000),\n ('five', 1000),\n ('six', 1000),\n ('seven', 1000),\n ('eight', 1000),\n ('nine', 1000)]"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "itos",
"execution_count": 15,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 15,
"data": {
"text/plain": "['_unk_',\n '_pad_',\n '_eos_',\n 'zero',\n 'one',\n 'two',\n 'three',\n 'four',\n 'five',\n 'six',\n 'seven',\n 'eight',\n 'nine']"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "The stoi variable will create the translator from the strings to the int versions. "
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "stoi = collections.defaultdict(lambda:0, {v:k for k,v in enumerate(itos)})\nlen(itos)",
"execution_count": 16,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 16,
"data": {
"text/plain": "13"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "The lambda:0 is telling this that if you don't know what the word is, give it a value of \"0\" which we know is tied to '_unk_' so translating it back, would replace that word with '_unk_'"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "unknownNumber = stoi[\"ten\"];print(\"unknownNumber idx: \" + str(unknownNumber))\nknownNumber = stoi[\"nine\"];print(\"knownNumber idx: \" + str(knownNumber))\nprint(itos[unknownNumber])\nprint(itos[knownNumber])",
"execution_count": 17,
"outputs": [
{
"output_type": "stream",
"text": "unknownNumber idx: 0\nknownNumber idx: 12\n_unk_\nnine\n",
"name": "stdout"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "All I'm doing here is feeding each of my numbers through and turning the string into an int using stoi[wordtotokenize]"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "tokenized_data = [[stoi[o] for o in i] for i in data]",
"execution_count": 18,
"outputs": []
},
{
"metadata": {
"scrolled": true,
"trusted": true
},
"cell_type": "code",
"source": "for datanew in tokenized_data:\n datanew+=[2]",
"execution_count": 19,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "texts.values[0:10]",
"execution_count": 20,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 20,
"data": {
"text/plain": "array(['zero one two three four five six seven eight nine',\n 'eight nine zero one two three four five six seven',\n 'zero one two three four five six seven eight nine',\n 'eight nine zero one two three four five six seven',\n 'nine zero one two three four five six seven eight',\n 'six seven eight nine zero one two three four five',\n 'two three four five six seven eight nine zero one',\n 'zero one two three four five six seven eight nine',\n 'one two three four five six seven eight nine zero',\n 'six seven eight nine zero one two three four five'], dtype=object)"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "tokenized_data[0:10]",
"execution_count": 21,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 21,
"data": {
"text/plain": "[[3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 2],\n [11, 12, 3, 4, 5, 6, 7, 8, 9, 10, 2],\n [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 2],\n [11, 12, 3, 4, 5, 6, 7, 8, 9, 10, 2],\n [12, 3, 4, 5, 6, 7, 8, 9, 10, 11, 2],\n [9, 10, 11, 12, 3, 4, 5, 6, 7, 8, 2],\n [5, 6, 7, 8, 9, 10, 11, 12, 3, 4, 2],\n [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 2],\n [4, 5, 6, 7, 8, 9, 10, 11, 12, 3, 2],\n [9, 10, 11, 12, 3, 4, 5, 6, 7, 8, 2]]"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "PATH = Path(\"data/counterExample/\")",
"execution_count": 22,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "em_sz,nh,nl = 8,16,2\nbptt=12\nbs=4\nopt_fn = optim.Adam#partial(optim.Adam, betas=(0.8, 0.99))",
"execution_count": 23,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "combined_tokenized_data = np.concatenate(tokenized_data)",
"execution_count": 24,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "dataloader = LanguageModelLoader(combined_tokenized_data, bs, bptt)",
"execution_count": 25,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "#PATH\n#Pad_Idx\n#Number of tokens\n#dataloader - Training\n#dataloader - Validation (Should be different from Training)\nmodeldata = LanguageModelData(PATH,1,len(itos), dataloader, dataloader)",
"execution_count": 26,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "drops=np.array([0.25, 0.1, 0.2, 0.02, 0.15])*0.7\nlearner = modeldata.get_model(opt_fn, em_sz, nh, nl,dropouti=drops[0], dropout=drops[1], wdrop=drops[2], dropoute=drops[3], dropouth=drops[4])\nlearner.metrics = [accuracy]\nlearner.unfreeze()",
"execution_count": 27,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "learner",
"execution_count": 28,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 28,
"data": {
"text/plain": "SequentialRNN(\n (0): RNN_Encoder(\n (encoder): Embedding(13, 8, padding_idx=1)\n (encoder_with_dropout): EmbeddingDropout(\n (embed): Embedding(13, 8, padding_idx=1)\n )\n (rnns): ModuleList(\n (0): WeightDrop(\n (module): LSTM(8, 16, dropout=0.105)\n )\n (1): WeightDrop(\n (module): LSTM(16, 8, dropout=0.105)\n )\n )\n (dropouti): LockedDropout(\n )\n (dropouths): ModuleList(\n (0): LockedDropout(\n )\n (1): LockedDropout(\n )\n )\n )\n (1): LinearDecoder(\n (decoder): Linear(in_features=8, out_features=13)\n (dropout): LockedDropout(\n )\n )\n)"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "learner.lr_find()",
"execution_count": 29,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "HBox(children=(IntProgress(value=0, description='Epoch', max=1), HTML(value='')))",
"text/html": "<p>Failed to display Jupyter Widget of type <code>HBox</code>.</p>\n<p>\n If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n that the widgets JavaScript is still loading. If this message persists, it\n likely means that the widgets JavaScript library is either not installed or\n not enabled. See the <a href=\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\">Jupyter\n Widgets Documentation</a> for setup instructions.\n</p>\n<p>\n If you're reading this message in another frontend (for example, a static\n rendering on GitHub or <a href=\"https://nbviewer.jupyter.org/\">NBViewer</a>),\n it may mean that your frontend doesn't currently support widgets.\n</p>\n",
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "db8411e0e2f8427cb08a2290774dc22d"
}
},
"metadata": {}
},
{
"output_type": "stream",
"text": "epoch trn_loss val_loss accuracy \n 0 2.477381 2.56495 0.010456 \n\n",
"name": "stdout"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "learner.sched.plot()",
"execution_count": 30,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<matplotlib.figure.Figure at 0x7fb6fd698fd0>",
"image/png": "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\n"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "lr = 10e-2",
"execution_count": 31,
"outputs": []
},
{
"metadata": {
"trusted": true,
"scrolled": true
},
"cell_type": "code",
"source": "learner.fit(lr,10)",
"execution_count": 32,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "HBox(children=(IntProgress(value=0, description='Epoch', max=10), HTML(value='')))",
"text/html": "<p>Failed to display Jupyter Widget of type <code>HBox</code>.</p>\n<p>\n If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n that the widgets JavaScript is still loading. If this message persists, it\n likely means that the widgets JavaScript library is either not installed or\n not enabled. See the <a href=\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\">Jupyter\n Widgets Documentation</a> for setup instructions.\n</p>\n<p>\n If you're reading this message in another frontend (for example, a static\n rendering on GitHub or <a href=\"https://nbviewer.jupyter.org/\">NBViewer</a>),\n it may mean that your frontend doesn't currently support widgets.\n</p>\n",
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "1effa6fa05534ce992e2ddfd08d1a6b9"
}
},
"metadata": {}
},
{
"output_type": "stream",
"text": "epoch trn_loss val_loss accuracy \n 0 0.877209 0.613849 0.829531 \n 1 0.756472 0.578578 0.826748 \n 2 0.802857 0.575006 0.832028 \n 3 0.831325 0.588339 0.823894 \n 4 0.738141 0.561355 0.825936 \n 5 0.916614 0.610922 0.829739 \n 6 0.945601 0.646737 0.824805 \n 7 0.929306 0.598057 0.826581 \n 8 0.836129 0.579624 0.827866 \n 9 0.76676 0.568329 0.830627 \n\n",
"name": "stdout"
},
{
"output_type": "execute_result",
"execution_count": 32,
"data": {
"text/plain": "[0.5683291, 0.83062704064344106]"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "needPrediction = np.array([[5]])\nprobs = learner.model(V(needPrediction))",
"execution_count": 33,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "probs[0]",
"execution_count": 34,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 34,
"data": {
"text/plain": "Variable containing:\n\nColumns 0 to 7 \n -9.8337 -10.0553 3.9059 -0.1862 -5.8219 -2.0377 7.0377 3.7314\n\nColumns 8 to 12 \n 0.0088 -7.0428 -0.0959 -2.0290 -7.9542\n[torch.cuda.FloatTensor of size 1x13 (GPU 0)]"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Next, take the exponent of this number to convert into the likelyhood that the number is the next in the sequence"
},
{
"metadata": {
"scrolled": true,
"trusted": true
},
"cell_type": "code",
"source": "total_percentage = 0\nfor i in to_np(F.softmax(probs[0])):\n total_percentage+=i\nprint(total_percentage)",
"execution_count": 35,
"outputs": [
{
"output_type": "stream",
"text": "[ 0. 0. 0.0403 0.00067 0. 0.00011 0.92342 0.03384 0.00082 0. 0.00074 0.00011\n 0. ]\n",
"name": "stdout"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "for i in range(2,12):\n needPrediction = np.array([[i]])\n probs = learner.model(V(needPrediction))\n print(itos[i] + \"---->\" + itos[to_np(probs[0][-1].exp()).argmax()])",
"execution_count": 36,
"outputs": [
{
"output_type": "stream",
"text": "_eos_---->zero\nzero---->one\none---->two\ntwo---->three\nthree---->four\nfour---->five\nfive---->six\nsix---->seven\nseven---->eight\neight---->nine\n",
"name": "stdout"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "learner.fit(lr,10)",
"execution_count": 37,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "HBox(children=(IntProgress(value=0, description='Epoch', max=10), HTML(value='')))",
"text/html": "<p>Failed to display Jupyter Widget of type <code>HBox</code>.</p>\n<p>\n If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n that the widgets JavaScript is still loading. If this message persists, it\n likely means that the widgets JavaScript library is either not installed or\n not enabled. See the <a href=\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\">Jupyter\n Widgets Documentation</a> for setup instructions.\n</p>\n<p>\n If you're reading this message in another frontend (for example, a static\n rendering on GitHub or <a href=\"https://nbviewer.jupyter.org/\">NBViewer</a>),\n it may mean that your frontend doesn't currently support widgets.\n</p>\n",
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "de1f263bda984394bac265902aa495c0"
}
},
"metadata": {}
},
{
"output_type": "stream",
"text": "epoch trn_loss val_loss accuracy \n 0 0.771903 0.553757 0.827269 \n 1 0.806123 0.547836 0.829683 \n 2 0.791141 0.569081 0.82243 \n 3 0.804629 0.550345 0.825076 \n 4 0.763257 0.566674 0.827552 \n 5 0.754086 0.561353 0.825966 \n 6 1.055096 0.658756 0.818877 \n 7 1.028009 0.71496 0.813719 \n 8 0.927982 0.626914 0.820577 \n 9 0.781758 0.615392 0.827069 \n\n",
"name": "stdout"
},
{
"output_type": "execute_result",
"execution_count": 37,
"data": {
"text/plain": "[0.61539203, 0.82706903757756212]"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "needPrediction = np.array([[5]])\nprobs = learner.model(V(needPrediction))\ntotal_percentage = 0\nfor i in to_np(F.softmax(probs[0])):\n total_percentage+=i\nprint(total_percentage)",
"execution_count": 38,
"outputs": [
{
"output_type": "stream",
"text": "[ 0. 0. 0.02286 0.00023 0. 0.00002 0.96559 0.01114 0.00006 0.00007 0. 0.00001\n 0. ]\n",
"name": "stdout"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "learner.fit(lr,10)",
"execution_count": 39,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "HBox(children=(IntProgress(value=0, description='Epoch', max=10), HTML(value='')))",
"text/html": "<p>Failed to display Jupyter Widget of type <code>HBox</code>.</p>\n<p>\n If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n that the widgets JavaScript is still loading. If this message persists, it\n likely means that the widgets JavaScript library is either not installed or\n not enabled. See the <a href=\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\">Jupyter\n Widgets Documentation</a> for setup instructions.\n</p>\n<p>\n If you're reading this message in another frontend (for example, a static\n rendering on GitHub or <a href=\"https://nbviewer.jupyter.org/\">NBViewer</a>),\n it may mean that your frontend doesn't currently support widgets.\n</p>\n",
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "67d3b22fcc30484388c284e4b051651b"
}
},
"metadata": {}
},
{
"output_type": "stream",
"text": "epoch trn_loss val_loss accuracy \n 0 0.842481 0.564832 0.823317 \n 1 0.816763 0.565989 0.829835 \n 2 0.828612 0.570158 0.827601 \n 3 0.841933 0.586223 0.826373 \n 4 0.818775 0.55845 0.834544 \n 5 0.881451 0.597358 0.827557 \n 6 0.792335 0.569497 0.826181 \n 7 0.878065 0.545774 0.828824 \n 8 0.826214 0.550325 0.833591 \n 9 0.779982 0.557214 0.822997 \n\n",
"name": "stdout"
},
{
"output_type": "execute_result",
"execution_count": 39,
"data": {
"text/plain": "[0.55721396, 0.82299670733903585]"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "needPrediction = np.array([[5]])\nprobs = learner.model(V(needPrediction))\ntotal_percentage = 0\nfor i in to_np(F.softmax(probs[0])):\n total_percentage+=i\nprint(total_percentage)",
"execution_count": 40,
"outputs": [
{
"output_type": "stream",
"text": "[ 0. 0. 0.02088 0.00024 0.00007 0.00195 0.95327 0.01969 0.00011 0.00009 0.00001 0.00351\n 0.00017]\n",
"name": "stdout"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "for i in range(2,12):\n needPrediction = np.array([[i]])\n probs = learner.model(V(needPrediction))\n print(itos[i] + \"---->\" + itos[to_np(probs[0][-1].exp()).argmax()])",
"execution_count": 41,
"outputs": [
{
"output_type": "stream",
"text": "_eos_---->four\nzero---->one\none---->two\ntwo---->three\nthree---->four\nfour---->five\nfive---->six\nsix---->seven\nseven---->eight\neight---->nine\n",
"name": "stdout"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
}
],
"metadata": {
"_draft": {
"nbviewer_url": "https://gist.github.com/dda2ffa06ede42fd0562b33b02d088e7"
},
"gist": {
"id": "dda2ffa06ede42fd0562b33b02d088e7",
"data": {
"description": "Counting Example for Language Model",
"public": true
}
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
},
"language_info": {
"name": "python",
"version": "3.6.3",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"state": {
"04dba83d703c4c97973b8da5ef017ead": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "IntProgressModel",
"state": {
"bar_style": "success",
"description": "Epoch",
"layout": "IPY_MODEL_1108f27619c04d0c9d1d9d4426a6d44a",
"max": 10,
"style": "IPY_MODEL_e10ddd3114834c63afeea0c9bfee32a1",
"value": 10
}
},
"1108f27619c04d0c9d1d9d4426a6d44a": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.0.0",
"model_name": "LayoutModel",
"state": {}
},
"149c1ac37c9b499f842f63d178d2bbc0": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "HTMLModel",
"state": {
"layout": "IPY_MODEL_bfc4471dab35446fbd062cee50bc2847",
"style": "IPY_MODEL_2c78bfc16b424345822b8d9ebc5ac7c8",
"value": "100% 10/10 [00:05&lt;00:00, 1.81it/s]"
}
},
"171a3d23566a4916a2d6b38cba073108": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.0.0",
"model_name": "LayoutModel",
"state": {}
},
"17fab208c1f24c2da68669be65607e02": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.0.0",
"model_name": "LayoutModel",
"state": {}
},
"1a18ef3b0cf44c44b1b1c8fd5b3d2d76": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "HBoxModel",
"state": {
"children": [
"IPY_MODEL_04dba83d703c4c97973b8da5ef017ead",
"IPY_MODEL_f8e46f870e7e4adf8082d957777c08f0"
],
"layout": "IPY_MODEL_eab5cdadf3dc446aaf8c51f5a5cea696"
}
},
"1d883cb12ddb470cab085f26452a0799": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "HTMLModel",
"state": {
"layout": "IPY_MODEL_bba46c77a54442e89a600703618806ed",
"style": "IPY_MODEL_3850389523bd4061a875a4f37bcff987",
"value": " 0% 0/1 [00:00&lt;?, ?it/s]"
}
},
"2817a1e93ee84813a93fe3511ed5d7f7": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"2c78bfc16b424345822b8d9ebc5ac7c8": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"32ba039760b346578df3f09c14fe73ea": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "HTMLModel",
"state": {
"layout": "IPY_MODEL_6b473e701eca4822bb8b8b99db3c4895",
"style": "IPY_MODEL_c083769380ef4a46a141905cce1186e6",
"value": "100% 15/15 [00:08&lt;00:00, 1.75it/s]"
}
},
"3850389523bd4061a875a4f37bcff987": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"3b46fb458f9b4dda8d895c773bc729ee": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "ProgressStyleModel",
"state": {
"description_width": ""
}
},
"3f9fcf7d19264eb5b3f30e1e538ff6d8": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "ProgressStyleModel",
"state": {
"description_width": ""
}
},
"46f844869b6847c29efc5d499d5d6acb": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "HBoxModel",
"state": {
"children": [
"IPY_MODEL_6b051936f29a4a14b6ab740d52c2f6e5",
"IPY_MODEL_d8f90f2fb1bc452688b37f06cc9bcb4e"
],
"layout": "IPY_MODEL_d1273af340b74f5ba133d5bb64969035"
}
},
"49e99574d3464b559337da997c06b39b": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.0.0",
"model_name": "LayoutModel",
"state": {}
},
"4fb7b8299d9043c0a8d3b192de40b57d": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "IntProgressModel",
"state": {
"bar_style": "success",
"description": "Epoch",
"layout": "IPY_MODEL_5b72faa4fe8c45e3a3d22c70a6c5243f",
"max": 10,
"style": "IPY_MODEL_a36ebd91b6c848f3bddb4e3d217d6d53",
"value": 10
}
},
"5871c1f5cc7b457cbaa797c3efdfe905": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "IntProgressModel",
"state": {
"bar_style": "success",
"description": "Epoch",
"layout": "IPY_MODEL_866a435f08b542e5b68b6a58a71584d0",
"max": 15,
"style": "IPY_MODEL_3b46fb458f9b4dda8d895c773bc729ee",
"value": 15
}
},
"5b72faa4fe8c45e3a3d22c70a6c5243f": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.0.0",
"model_name": "LayoutModel",
"state": {}
},
"63871322b0d2493785a64b1cfaab2659": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "HBoxModel",
"state": {
"children": [
"IPY_MODEL_4fb7b8299d9043c0a8d3b192de40b57d",
"IPY_MODEL_149c1ac37c9b499f842f63d178d2bbc0"
],
"layout": "IPY_MODEL_e18888eafcc74d02ad321836ad293ca5"
}
},
"65dae5ebd0c742d7a305399423c390ec": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.0.0",
"model_name": "LayoutModel",
"state": {}
},
"6b051936f29a4a14b6ab740d52c2f6e5": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "IntProgressModel",
"state": {
"bar_style": "success",
"description": "Epoch",
"layout": "IPY_MODEL_171a3d23566a4916a2d6b38cba073108",
"max": 10,
"style": "IPY_MODEL_a5a133ee051e49479606ac4220b033ed",
"value": 10
}
},
"6b473e701eca4822bb8b8b99db3c4895": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.0.0",
"model_name": "LayoutModel",
"state": {}
},
"6f45fc011e0b41ed9e0947ed109198d3": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "HBoxModel",
"state": {
"children": [
"IPY_MODEL_fb6d77fb2c5b4b5e9c9e870ef85951c5",
"IPY_MODEL_c53ab2d1e299414b8d0f099d80d0d802"
],
"layout": "IPY_MODEL_65dae5ebd0c742d7a305399423c390ec"
}
},
"71988522634f4cf2bb83ac497f944924": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.0.0",
"model_name": "LayoutModel",
"state": {}
},
"739576ba78a4474194ebe2d056a02646": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.0.0",
"model_name": "LayoutModel",
"state": {}
},
"7892d81a5cef498abbea3e73bd73a9ff": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "HBoxModel",
"state": {
"children": [
"IPY_MODEL_c2f9d01f36b9435fad8f80abe783be47",
"IPY_MODEL_1d883cb12ddb470cab085f26452a0799"
],
"layout": "IPY_MODEL_919dad157b264202925bb3c01ae0c57d"
}
},
"84091e10212a43b09db81bc8a97c92d5": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"866a435f08b542e5b68b6a58a71584d0": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.0.0",
"model_name": "LayoutModel",
"state": {}
},
"919dad157b264202925bb3c01ae0c57d": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.0.0",
"model_name": "LayoutModel",
"state": {}
},
"959dbb9efd6941ca8bdf548f8de88d7c": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.0.0",
"model_name": "LayoutModel",
"state": {}
},
"a36ebd91b6c848f3bddb4e3d217d6d53": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "ProgressStyleModel",
"state": {
"description_width": ""
}
},
"a5a133ee051e49479606ac4220b033ed": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "ProgressStyleModel",
"state": {
"description_width": ""
}
},
"a9a611129ff6427d9b5cbc5c40de62bd": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"bba46c77a54442e89a600703618806ed": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.0.0",
"model_name": "LayoutModel",
"state": {}
},
"bfc4471dab35446fbd062cee50bc2847": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.0.0",
"model_name": "LayoutModel",
"state": {}
},
"c083769380ef4a46a141905cce1186e6": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "DescriptionStyleModel",
"state": {
"description_width": ""
}
},
"c2f9d01f36b9435fad8f80abe783be47": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "IntProgressModel",
"state": {
"bar_style": "danger",
"description": "Epoch",
"layout": "IPY_MODEL_959dbb9efd6941ca8bdf548f8de88d7c",
"max": 1,
"style": "IPY_MODEL_3f9fcf7d19264eb5b3f30e1e538ff6d8"
}
},
"c53ab2d1e299414b8d0f099d80d0d802": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "HTMLModel",
"state": {
"layout": "IPY_MODEL_d966057d73304877be1afb753f8f87a0",
"style": "IPY_MODEL_2817a1e93ee84813a93fe3511ed5d7f7",
"value": "100% 100/100 [00:56&lt;00:00, 1.78it/s]"
}
},
"d1273af340b74f5ba133d5bb64969035": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.0.0",
"model_name": "LayoutModel",
"state": {}
},
"d2875ddf016045d2837f2083faa77fa3": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "HBoxModel",
"state": {
"children": [
"IPY_MODEL_5871c1f5cc7b457cbaa797c3efdfe905",
"IPY_MODEL_32ba039760b346578df3f09c14fe73ea"
],
"layout": "IPY_MODEL_17fab208c1f24c2da68669be65607e02"
}
},
"d8f90f2fb1bc452688b37f06cc9bcb4e": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "HTMLModel",
"state": {
"layout": "IPY_MODEL_49e99574d3464b559337da997c06b39b",
"style": "IPY_MODEL_a9a611129ff6427d9b5cbc5c40de62bd",
"value": "100% 10/10 [00:05&lt;00:00, 1.77it/s]"
}
},
"d966057d73304877be1afb753f8f87a0": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.0.0",
"model_name": "LayoutModel",
"state": {}
},
"e10ddd3114834c63afeea0c9bfee32a1": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "ProgressStyleModel",
"state": {
"description_width": ""
}
},
"e18888eafcc74d02ad321836ad293ca5": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.0.0",
"model_name": "LayoutModel",
"state": {}
},
"eab5cdadf3dc446aaf8c51f5a5cea696": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.0.0",
"model_name": "LayoutModel",
"state": {}
},
"f56541c7d04f4a6b9819665e2004fb64": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "ProgressStyleModel",
"state": {
"description_width": ""
}
},
"f8e46f870e7e4adf8082d957777c08f0": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "HTMLModel",
"state": {
"layout": "IPY_MODEL_739576ba78a4474194ebe2d056a02646",
"style": "IPY_MODEL_84091e10212a43b09db81bc8a97c92d5",
"value": "100% 10/10 [00:05&lt;00:00, 1.79it/s]"
}
},
"fb6d77fb2c5b4b5e9c9e870ef85951c5": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.1.0",
"model_name": "IntProgressModel",
"state": {
"bar_style": "success",
"description": "Epoch",
"layout": "IPY_MODEL_71988522634f4cf2bb83ac497f944924",
"style": "IPY_MODEL_f56541c7d04f4a6b9819665e2004fb64",
"value": 100
}
}
},
"version_major": 2,
"version_minor": 0
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment