Created
April 26, 2018 06:31
-
-
Save kevinbird15/4b832ec5c079473188ef3b51f7702b5d to your computer and use it in GitHub Desktop.
Counting Example for Language Model
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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<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<?, ?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<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<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<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<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