{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "gJUglSP2atja"
},
"source": [
"# 7. gyakorlat RNN és LSTM \n",
"\n",
"\n",
"\n",
"A teljes kód megtalálható: https://github.com/domschl/tensor-poet"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"colab": {
"autoexec": {
"startup": false,
"wait_interval": 0
}
},
"colab_type": "code",
"id": "A8cvjII-atjg"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/lib/python3/dist-packages/h5py/__init__.py:34: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n",
" from ._conv import register_converters as _register_converters\n"
]
}
],
"source": [
"import numpy as np\n",
"import os\n",
"import json\n",
"import random\n",
"import tensorflow as tf\n",
"from IPython.core.display import display, HTML"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "ESiuTFMkatj2"
},
"source": [
"### LSTM alapú nyelvi modell\n",
"\n",
"A következő kód egy LSTM hálót fog betanítani karaktersorozatok generálására. Bemenetként csak az aktuális karakter kódját kapja, ez alapján kell megbercsülnie a következőt.\n",
"A kód a következő blokkokból áll:\n",
"1. TextLibrary: segédfüggvények definiálása\n",
" * fájlok betöltése\n",
" * szöveg átalakítása tanuláshoz\n",
" * plágium ellenőrzés\n",
"2. Tensorflow modell definiálása\n",
"3. Modell és tanító paraméterek\n",
"4. Tényleges tanítás\n",
"5. Szöveg generálása a betanított modell segítségével\n",
"6. Dialógus a neuronhálóval"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "QT46qJJ2atj-"
},
"source": [
"## 1. Text library\n",
"\n",
"A szöveges bemenet kezelését végző osztály"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"colab": {
"autoexec": {
"startup": false,
"wait_interval": 0
}
},
"colab_type": "code",
"id": "tpJAjLkJatkD"
},
"outputs": [],
"source": [
"# TextLibrary class: text library for training, encoding, batch generation,\n",
"# and formatted source display\n",
"class TextLibrary:\n",
" def __init__(self, filenames, max=100000000):\n",
" self.filenames = filenames\n",
" self.data=''\n",
" self.files=[]\n",
" index = 1\n",
" for filename in filenames:\n",
" fd={}\n",
" fd[\"name\"] = os.path.splitext(os.path.basename(filename))[0]\n",
" self.c2i = {}\n",
" self.i2c = {}\n",
" try:\n",
" f = open(filename)\n",
" dat = f.read(max)\n",
" self.data += dat\n",
" fd[\"data\"] = dat\n",
" fd[\"index\"] = index\n",
" index += 1\n",
" self.files.append(fd)\n",
" f.close()\n",
" except OSError:\n",
" print(\" ERROR: Cannot read: \", filename)\n",
" ind = 0\n",
" for c in self.data: # sets are not deterministic\n",
" if c not in self.c2i:\n",
" self.c2i[c] = ind\n",
" self.i2c[ind] = c\n",
" ind += 1\n",
" self.ptr = 0\n",
" \n",
" def printColoredIPython(self, textlist, pre='', post=''):\n",
" bgcolors = ['#d4e6f1', '#d8daef', '#ebdef0', '#eadbd8', '#e2d7d5', '#edebd0',\n",
" '#ecf3cf', '#d4efdf', '#d0ece7', '#d6eaf8', '#d4e6f1', '#d6dbdf',\n",
" '#f6ddcc', '#fae5d3', '#fdebd0', '#e5e8e8', '#eaeded', '#A9CCE3']\n",
" out = ''\n",
" for txt, ind in textlist:\n",
" txt = txt.replace('\\n','
')\n",
" if ind==0:\n",
" out += txt\n",
" else:\n",
" out += \"\" + txt +\\\n",
" \"\"+\"[\" + str(ind) + \"]\"\n",
" display(HTML(pre+out+post))\n",
" \n",
" def sourceHighlight(self, txt, minQuoteSize=10):\n",
" tx = txt\n",
" out = []\n",
" qts = []\n",
" txsrc=[(\"Sources: \", 0)]\n",
" sc=False\n",
" noquote = ''\n",
" while len(tx)>0: # search all library files for quote 'txt'\n",
" mxQ = 0\n",
" mxI = 0\n",
" mxN = ''\n",
" found = False\n",
" for f in self.files: # find longest quote in all texts\n",
" p = minQuoteSize\n",
" if p<=len(tx) and tx[:p] in f[\"data\"]:\n",
" p = minQuoteSize + 1\n",
" while p<=len(tx) and tx[:p] in f[\"data\"]:\n",
" p += 1\n",
" if p-1>mxQ:\n",
" mxQ = p-1\n",
" mxI = f[\"index\"]\n",
" mxN = f[\"name\"]\n",
" found = True\n",
" if found: # save longest quote for colorizing\n",
" if len(noquote)>0:\n",
" out.append((noquote, 0))\n",
" noquote = ''\n",
" out.append((tx[:mxQ],mxI))\n",
" tx = tx[mxQ:]\n",
" if mxI not in qts: # create a new reference, if first occurence\n",
" qts.append(mxI)\n",
" if sc:\n",
" txsrc.append((\", \", 0))\n",
" sc = True\n",
" txsrc.append((mxN,mxI))\n",
" else:\n",
" noquote += tx[0]\n",
" tx = tx[1:]\n",
" if len(noquote)>0:\n",
" out.append((noquote, 0))\n",
" noquote = ''\n",
" self.printColoredIPython(out)\n",
" if len(qts)>0: # print references, if there is at least one source\n",
" self.printColoredIPython(txsrc, pre=\"
\",\n", " post=\"
\")\n", " \n", " def getSlice(self, length):\n", " if (self.ptr + length >= len(self.data)):\n", " self.ptr = 0\n", " if self.ptr == 0:\n", " rst = True\n", " else:\n", " rst = False\n", " sl = self.data[self.ptr:self.ptr+length]\n", " self.ptr += length\n", " return sl, rst\n", " \n", " def decode(self, ar):\n", " return ''.join([self.i2c[ic] for ic in ar])\n", " \n", " def getRandomSlice(self, length):\n", " p = random.randrange(0,len(self.data)-length)\n", " \n", " sl = self.data[p:p+length]\n", " return sl\n", " \n", " def getSliceArray(self, length):\n", " ar = np.array([c for c in self.getSlice(length)[0]])\n", " return ar\n", " \n", " def getSample(self, length):\n", " s, rst = self.getSlice(length+1)\n", " X = [self.c2i[c] for c in s[:-1]]\n", " y = [self.c2i[c] for c in s[1:]]\n", " return (X, y, rst)\n", " \n", " def getRandomSample(self, length):\n", " s = self.getRandomSlice(length+1)\n", " X = [self.c2i[c] for c in s[:-1]]\n", " y = [self.c2i[c] for c in s[1:]]\n", " return (X, y)\n", " \n", " def getSampleBatch(self, batch_size, length):\n", " smpX = []\n", " smpy = []\n", " for i in range(batch_size):\n", " Xi, yi, rst = self.getSample(length)\n", " smpX.append(Xi)\n", " smpy.append(yi)\n", " return smpX, smpy, rst\n", " \n", " def getRandomSampleBatch(self, batch_size, length):\n", " smpX = []\n", " smpy = []\n", " for i in range(batch_size):\n", " Xi, yi = self.getRandomSample(length)\n", " smpX.append(Xi)\n", " smpy.append(yi)\n", " return smpX, smpy" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "ctVfsWE_atkV" }, "source": [ "## 2. Neuronháló definiálása és tanítási opciók megadása\n", "\n", "Ha a sebesség is számít, célszerű követni a tensorflow fejlesztőinek javaslatait: https://www.tensorflow.org/guide/performance/overview#rnn_performance" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "autoexec": { "startup": false, "wait_interval": 0 } }, "colab_type": "code", "id": "tXQiDqTPatka" }, "outputs": [], "source": [ "# The tensorflow model for text generation\n", "class TensorPoetModel:\n", " def __init__(self, params):\n", " self.model_name = params[\"model_name\"]\n", " self.vocab_size = params[\"vocab_size\"]\n", " self.neurons = params[\"neurons\"]\n", " self.layers = params[\"layers\"]\n", " self.learning_rate = params[\"learning_rate\"]\n", " self.steps = params[\"steps\"]\n", " self.logdir = params[\"logdir\"]\n", " self.checkpoint = params[\"checkpoint\"]\n", " # self.clip = -1.0 * params[\"clip\"]\n", " \n", " tf.reset_default_graph()\n", "\n", " # Training & Generating:\n", " self.X = tf.placeholder(tf.int32, shape=[None, self.steps])\n", " self.y = tf.placeholder(tf.int32, shape=[None, self.steps])\n", "\n", " onehot_X = tf.one_hot(self.X, self.vocab_size)\n", " onehot_y = tf.one_hot(self.y, self.vocab_size)\n", "\n", " # Old tf 1.0 way:\n", " # basic_cell = tf.contrib.rnn.BasicLSTMCell(self.neurons)\n", " # stacked_cell = tf.contrib.rnn.MultiRNNCell([basic_cell] * self.layers)\n", " # New tf 1.1 way:\n", " stacked_cell = tf.contrib.rnn.MultiRNNCell([tf.contrib.rnn.BasicLSTMCell(self.neurons, ) for _ in range(self.layers)])\n", "\n", " batch_size = tf.shape(self.X)[0]\n", " \n", " self.init_state_0 = stacked_cell.zero_state(batch_size, tf.float32)\n", " self.init_state = self.init_state_0\n", "\n", " with tf.variable_scope('rnn') as scope:\n", " rnn_outputs, states = tf.nn.dynamic_rnn(stacked_cell, onehot_X, \n", " initial_state=self.init_state, \n", " dtype=tf.float32)\n", " self.init_state = states\n", "\n", " self.final_state = self.init_state\n", " stacked_rnn_outputs = tf.reshape(rnn_outputs, [-1, self.neurons])\n", "\n", " softmax_w = tf.Variable(tf.random_normal([self.neurons, self.vocab_size]), dtype=tf.float32, name='sm_w')\n", " softmax_b = tf.Variable([self.vocab_size], dtype=tf.float32, name='sm_b')\n", " \n", " logits_raw = tf.matmul(stacked_rnn_outputs, softmax_w) + softmax_b\n", " logits = tf.reshape(logits_raw, [-1, self.steps, self.vocab_size])\n", "\n", " output_softmax = tf.nn.softmax(logits)\n", "\n", " self.temperature = tf.placeholder(tf.float32)\n", " self.output_softmax_temp = tf.nn.softmax(tf.div(logits, self.temperature))\n", "\n", " softmax_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(labels=onehot_y, logits=logits)\n", "\n", " self.cross_entropy = tf.reduce_mean(softmax_entropy)\n", " optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate)\n", "\n", " self.training_op = optimizer.minimize(self.cross_entropy)\n", " \n", " # Clipping isn't necessary, even for really deep networks:\n", " # grads = optimizer.compute_gradients(self.cross_entropy)\n", " # minclip = -1.0 * self.clip\n", " # capped_grads = [(tf.clip_by_value(grad, minclip, self.clip), var) for grad, var in grads]\n", " # self.training_op = optimizer.apply_gradients(capped_grads)\n", "\n", " self.prediction = tf.cast(tf.argmax(output_softmax, -1), tf.int32)\n", " correct_prediction = tf.equal(self.y, self.prediction)\n", " self.accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))\n", " error = 1.0 - self.accuracy\n", "\n", " \n", " # Tensorboard\n", " tf.summary.scalar(\"cross-entropy\", self.cross_entropy)\n", " tf.summary.scalar(\"error\", error)\n", " self.summary_merged = tf.summary.merge_all()\n", "\n", " # Init\n", " self.init = tf.global_variables_initializer()\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "OYjLI9A4atkn" }, "source": [ "## 3. Tanítási paraméterek megadása\n", "\n", "A tanítást József Attila verseken végezzük, forrás: http://mek.oszk.hu/11800/11864/html/" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "autoexec": { "startup": false, "wait_interval": 0 } }, "colab_type": "code", "id": "jMgI-zWbatkq" }, "outputs": [], "source": [ "libdesc = {\n", " \"name\": \"TinyShakespeare\",\n", " \"description\": \"Small Shakespeare 'standard' corpus\",\n", " \"lib\": ['tiny-shakespeare.txt',]\n", "}\n", "\n", "libdescHun = {\n", " \"name\": \"AttilaJozsef\",\n", " \"description\": \"Atilla Jozsef corpus\",\n", " \"lib\": [\n", " 'jozsefattila-utf8.txt',\n", " ]\n", "}\n", "\n", "textlib = TextLibrary(libdescHun[\"lib\"])\n", "\n", "# Model parameter:\n", "modelParamsJA = {\n", " \"model_name\": \"jozsef_attila\",\n", " \"logdir\": \"tensorlog/jozsef_attila\",\n", " \"checkpoint\": \"jozsef_attila.ckpt\",\n", " \"vocab_size\": len(textlib.i2c),\n", " \"neurons\": 256,\n", " \"layers\": 2,\n", " \"learning_rate\": 1.e-3,\n", " \"steps\": 128,\n", "}\n", "modelParamsShakespeare = {\n", " \"model_name\": \"shakespeare\",\n", " \"logdir\": \"tensorlog/shakespeare\",\n", " \"checkpoint\": \"shakespeare.ckpt\",\n", " \"vocab_size\": len(textlib.i2c),\n", " \"neurons\": 100,\n", " \"layers\": 1,\n", " \"learning_rate\": 1.e-3,\n", " \"steps\": 128,\n", "}\n", "# Training Parameter:\n", "trainParams = {\n", " \"max_iter\": 5000,\n", " \"restoreCheckpoints\": False,\n", " \"generateDuringTraining\": False,\n", " \"generated_text_size\": 500,\n", " \"verbose\": True,\n", " \"statusEveryNIter\": 200,\n", " \"saveEveryNIter\": 500,\n", " \"batch_size\": 128,\n", "}\n", "\n", "model = TensorPoetModel(modelParamsJA)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "mY6-_weEatk_" }, "source": [ "## 4. Tanítás\n", "\n", "Tanítás során megfigyelhetjük a háló pontosságának javulását és a generált szöveg változását." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": { "autoexec": { "startup": false, "wait_interval": 0 }, "base_uri": "https://localhost:8080/", "height": 89, "output_extras": [ { "item_id": 2 } ] }, "colab_type": "code", "id": "786dviilatlE", "outputId": "493c246b-de1b-42b0-8d34-41b189511734" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tensorboard: 'tensorboard --logdir /home/groszthomas/tensorlog/jozsef_attila'\n", "Epoch: 0.00, iter: 0, cross-entropy: 4.237, accuracy: 0.12183\n", " y: tek tönköt, gabonát, | csákányosokkal puszta tért nyit, | szétveret falut és tanyát. | | S a gondra bátor, okos férfit, | ki védte menthe\n", " yp: \n", "Epoch: 65.88, iter: 200, cross-entropy: 2.405, accuracy: 0.31360\n", " y: k a gyásztól a vágyig. | Most temettük el szegény Kosztolányit | s az emberségen, mint rajta a rák, | nem egy szörny-állam iszonyata r\n", " yp: eee myorz al a fary | | igt ael l l sltszemen, kirzaaltt szal aleerezn k kint ae aa m faro | mym sly kzerteeellal agzelt f\n", "Epoch: 131.75, iter: 400, cross-entropy: 2.058, accuracy: 0.39874\n", " y: | Tedd a kezed | | Tedd a kezed | homlokomra, | mintha kezed | kezem volna. | | Úgy őrizz, mint | ki gyilkolna, | mintha éltem | élted volna. | | Úgy \n", " yp: me ea fézed sTo eee gezedesogb k m a mint a memememir m aagtak | | 1gy ezeste mint aö tyeklek ak mint a ms em as enevaldak | | Hgy \n", "Epoch: 197.63, iter: 600, cross-entropy: 1.451, accuracy: 0.56488\n", " y: dőt. | | Moshatja vér is ilyenek vagyunk. | Uj nép, másfajta raj. | Másként ejtjük a szót, fejünkön | másként tapad a haj. | Nem isten, ne\n", " yp: l | | Sirta já málsök lell nem aagyokk | | | g nép, meszajta majj | Náskékt elseál n rzel, | kelüvk | r | sársélt aapa a ma a | Tem ssten he\n", "Epoch: 263.50, iter: 800, cross-entropy: 0.734, accuracy: 0.80371\n", " y: sban a gyászt a szivemről, | mint sebről a kötést, te leoldtad ujra bizsergek. | Szól örökös neved árja, törékeny báju verőfény, | és\n", " yp: lzan f tyásziaa szeverrel, | aist rzglen a tötész, he levlttal j | jba bezseggek. | Szól örökös neved rrba, meréneny buju rerőfény, | és\n", "Epoch: 329.38, iter: 1000, cross-entropy: 0.414, accuracy: 0.90112\n", " y: ű ebek, | kerék alá kerüljetek | s ugassátok neki: Nagyon fáj. | | Nők, terhetek | viselők, elvetéljetek | és sirjátok neki: Nagyon fáj. | | É\n", " yp: a slbr | miresenjálkiteleetel | s sgaszátok neki: Nagyon fáj. | | Nők, terhetek | viselők, elvetéljetek | és sirjátok neki: Nagyon fáj. | | É\n", "Epoch: 395.26, iter: 1200, cross-entropy: 0.322, accuracy: 0.91760\n", " y: ból és sok kedves nőből | próbállak összeállitani téged; | de nem futja, már látom, az időből, | a tömény tűz eléget. | | Utoljára Szabad\n", " yp: áel fs szkásesves,nőbál | bróbállak összeállitani téged; | de nem futja, már látom, az időből, | a tömény tűz eléget. | | Utoljára Szabad\n", "Epoch: 461.13, iter: 1400, cross-entropy: 0.285, accuracy: 0.92352\n", " y: ez kisgyerek | ügyeskedhet, nem fog a macska | egyszerre kint s bent egeret. | 4 | | Akár egy halom hasított fa, | hever egymáson a világ,\n", " yp: ateiöszeerek | | leeszedcet, nem fog a macska | egyszerre kint s bent egeret. | 4 | | Akár egy halom hasított fa, | hever egymáson a világ,\n", "Epoch: 527.01, iter: 1600, cross-entropy: 0.255, accuracy: 0.93323\n", " y: an a csend, | számban kihűlve leng | s a vizes poháron kezed, | rajta a finom erezet, | föl-földereng. | 4 | | Óh, hát miféle anyag vagyok én\n", " yp: e k fsönd, | számban kihűlve leng | s a vizes poháron kezed, | rajta a finom erezet, | föl-földereng. | 4 | | Óh, hát miféle anyag vagyok én\n", "Epoch: 592.88, iter: 1800, cross-entropy: 0.224, accuracy: 0.93768\n", " y: bkezükben. | 12 | | Az eltaposott orrú fekete, | a sárga, kinek kékebb az ege, | a rézbőrű, kin megfagyott a vér | és a lidércként rugódzó \n", " yp: eeanel,el | V2 | | Az eltaposott orrú fekete, | a sárga, kinek kékebb az ege, | a rézbőrű, kin megfagyott a vér | és a lidércként rugódzó \n", "Epoch: 658.76, iter: 2000, cross-entropy: 0.214, accuracy: 0.94073\n", " y: jen szenvednem? | | A csecsemő | is szenvedi, ha szül a nő. | Páros kínt enyhíthet alázat. | | De énnekem | pénzt hoz fájdalmas énekem | s hoz\n", " yp: ean szemeednem, | | A csecsemő | is szenvedi, ha szül a nő. | Páros kínt enyhíthet alázat. | | De énnekem | pénzt hoz fájdalmas énekem | s hoz\n", "Epoch: 724.64, iter: 2200, cross-entropy: 0.192, accuracy: 0.94751\n", " y: atna engem, | hisz védekezni nincsen semmi kedvem, | mig nyomorult vagyok. | | Számon tarthatják, mit telefonoztam | s mikor miért, kinek\n", " yp: a oikelyed, | hasz védekezni nincsen semmi kedvem, | mig nyomorult vagyok. | | Számon tarthatják, mit telefonoztam | s mikor miért, kinek\n", "Epoch: 790.51, iter: 2400, cross-entropy: 0.179, accuracy: 0.95044\n", " y: ajcár: ennyiért | dolgoztál, nem épp semmiért. | 6 | | Retteg a szegénytől a gazdag | s a gazdagtól fél a szegény. | Fortélyos félelem igaz\n", " yp: e tala ennyiért | dolgoztál, nem épp semmiért. | 6 | | Retteg a szegénytől a gazdag | s a gazdagtól fél a szegény. | Fortélyos félelem igaz\n", "Epoch: 856.39, iter: 2600, cross-entropy: 0.177, accuracy: 0.95099\n", " y: | Óh, hát miféle anyag vagyok én, | hogy pillantásod metsz és alakít? | Miféle lélek és miféle fény | s ámulatra méltó tünemény, | hogy b\n", " yp: sAh, nom miféle a yag vágyok én, | hogy pillantásod metsz és alakít? | Miféle lélek és miféle fény | s ámulatra méltó tünemény, | hogy b\n", "Epoch: 922.26, iter: 2800, cross-entropy: 0.160, accuracy: 0.95532\n", " y: padós szeled mása | szennyes lepedők lobogása, | óh éj! | Csüngsz az egen, mint kötelen | foszló perkál s az életen | a bú, óh éj! | Szegény\n", " yp: ott gzelld misa | szennyes lepedők lobogása, | óh éj! | Csüngsz az egen, mint kötelen | foszló perkál s az életen | a bú, óh éj! | Szegény\n", "Epoch: 988.14, iter: 3000, cross-entropy: 0.155, accuracy: 0.95624\n", " y: világom ege lettél, | | hát dícsértessél s hirdettessél, | minden korokon át szeressél | s nehogy bárkiben alább essél, | mindig, minde\n", " yp: aillgom,hlerlettél, | | | hát dícsértessél s hirdettessél, | minden korokon át szeressél | s nehogy bárkiben alább essél, | mindig, minde\n", "Epoch: 1054.01, iter: 3200, cross-entropy: 0.145, accuracy: 0.95844\n", " y: szégyenlem, ha kitalálom, | | hisz kitaszit | a világ így is olyat, akit | kábít a nap, rettent az álom. | | A kultura | ugy hull le rólam, \n", " yp: mzep,el,em, ha kitalálom, | | hisz kitaszit | a világ így is olyat, akit | kábít a nap, rettent az álom. | | A kultura | ugy hull le rólam, \n", "Epoch: 1119.89, iter: 3400, cross-entropy: 0.138, accuracy: 0.96118\n", " y: , aki itt hever. | | A békességet szétosztja az este, | meleg kenyeréből egy karaj vagyok, | pihen most az ég is, a nyugodt Marosra | s h\n", " yp: e h i ctt,bever. | | A békességet szétosztja az este, | meleg kenyeréből egy karaj vagyok, | pihen most az ég is, a nyugodt Marosra | s h\n", "Epoch: 1185.77, iter: 3600, cross-entropy: 0.139, accuracy: 0.96014\n", " y: ény. | Fortélyos félelem igazgat | minket s nem csalóka remény. | | Nem adna jogot a parasztnak, | ki rág a paraszt kenyerén | s a summás s\n", " yp: yly, | | ort lyos félelem igazgat | minket s nem csalóka remény. | | Nem adna jogot a parasztnak, | ki rág a paraszt kenyerén | s a summás s\n", "Epoch: 1251.64, iter: 3800, cross-entropy: 0.129, accuracy: 0.96295\n", " y: s mint megdöföttek, hirtelen | majd mi is lerogyunk. | | Elmondom. S várom (várni kell), | ki fut, hogy dolga van; | megnézem, ki tünődik\n", " yp: | mint aegdöföttek, hirtelen | majd mi is lerogyunk. | | Elmondom. S várom (várni kell), | ki fut, hogy dolga van; | megnézem, ki tünődik\n", "Epoch: 1317.52, iter: 4000, cross-entropy: 0.127, accuracy: 0.96326\n", " y: lélek és miféle fény | s ámulatra méltó tünemény, | hogy bejárhatom a semmiség ködén | termékeny tested lankás tájait? | | S mint megnyíl\n", " yp: megkk,és miféle fény | s ámulatra méltó tünemény, | hogy bejárhatom a semmiség ködén | termékeny tested lankás tájait? | | S mint megnyíl\n", "Epoch: 1383.39, iter: 4200, cross-entropy: 0.125, accuracy: 0.96405\n", " y: Ideidézi szellemem | hevét | s nevét: | | Ön, amig szóból értek én, | nem lesz tanár e féltekén” | gagyog | s ragyog. | | Ha örül Horger Antal \n", " yp: | tesdezi szellemem | hevét | s nevét: | | Ön, amig szóból értek én, | nem lesz tanár e féltekén” | gagyog | s ragyog. | | Ha örül Horger Antal \n", "Epoch: 1449.27, iter: 4400, cross-entropy: 0.119, accuracy: 0.96490\n", " y: ne vesd meg. | | Emlékezz, hogy hörögtél | s hiába könyörögtél. | Hamis tanúvá lettél | saját igaz pörödnél. | | Atyát hivtál elesten, | ember\n", " yp: semlaré teg. | | Emlékezz, hogy hörögtél | s hiába könyörögtél. | Hamis tanúvá lettél | saját igaz pörödnél. | | Atyát hivtál elesten, | ember\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch: 1515.15, iter: 4600, cross-entropy: 0.115, accuracy: 0.96649\n", " y: töltött fegyvert | szoritsd üres szivedhez. | | Vagy vess el minden elvet | s még remélj hű szerelmet, | hisz mint a kutya hinnél | abban,\n", " yp: kört.tt fegyvert | szoritsd üres szivedhez. | | Vagy vess el minden elvet | s még remélj hű szerelmet, | hisz mint a kutya hinnél | abban,\n", "Epoch: 1581.02, iter: 4800, cross-entropy: 0.115, accuracy: 0.96704\n", " y: kívül a magyarázat. | Sebed a világ ég, hevül | s te lelkedet érzed, a lázat. | Rab vagy, amíg a szíved lázad | úgy szabadulsz, ha ké\n", " yp: ainen a magyarázat. | Sebed a világ ég, hevül | s te lelkedet érzed, a lázat. | Rab vagy, amíg a szíved lázad | úgy szabadulsz, ha ké\n" ] } ], "source": [ "# Run training:\n", "with tf.Session() as sess:\n", " batch_size = trainParams[\"batch_size\"]\n", " epl = len(textlib.data) / (batch_size * model.steps)\n", " model.init.run()\n", " tflogdir = model.logdir\n", " tflogdir = os.path.realpath(tflogdir)\n", " if not os.path.exists(tflogdir):\n", " os.makedirs(tflogdir)\n", " print(\"Tensorboard: 'tensorboard --logdir {}'\".format(tflogdir))\n", " train_writer = tf.summary.FileWriter(tflogdir, sess.graph)\n", " train_writer.add_graph(sess.graph)\n", " # vl=tf.trainable_variables()\n", " # print(vl)\n", " saver = tf.train.Saver()\n", " checkpoint_file = os.path.join(tflogdir, model.checkpoint)\n", " # FFR: tf.train.export_meta_graph(filename=None, meta_info_def=None, graph_def=None, saver_def=None, collection_list=None, as_text=False, graph=None, export_scope=None, clear_devices=False, **kwargs)\n", " start_iter = 0\n", " if trainParams[\"restoreCheckpoints\"]:\n", " lastSave = tf.train.latest_checkpoint(tflogdir, \n", " latest_filename=None)\n", " if lastSave is not None:\n", " pt = lastSave.rfind('-')\n", " if pt != -1:\n", " pt += 1\n", " start_iter=int(lastSave[pt:])\n", " print(\"Restoring checkpoint at {}: {}\".format(start_iter, lastSave))\n", " saver.restore(sess, lastSave)\n", " \n", " for iteration in range(start_iter, trainParams[\"max_iter\"]):\n", " # Train with batches from the text library:\n", " X_batch, y_batch = textlib.getRandomSampleBatch(batch_size, model.steps)\n", " i_state = sess.run([model.init_state_0], feed_dict={model.X: X_batch})\n", " i_state, _ = sess.run([model.final_state, model.training_op],\n", " feed_dict={model.X: X_batch, model.y: y_batch,\n", " model.init_state: i_state})\n", "\n", " # Output training statistics every 200 iterations:\n", " if iteration % 200 == 0:\n", " ce, accuracy, prediction, summary = sess.run([model.cross_entropy,\n", " model.accuracy, model.prediction,\n", " model.summary_merged],\n", " feed_dict={model.X: X_batch, model.y: y_batch})\n", " train_writer.add_summary(summary, iteration)\n", " ep = iteration / epl\n", " print(\"Epoch: {0:.2f}, iter: {1:d}, cross-entropy: {2:.3f}, accuracy: {3:.5f}\".format(ep, iteration, ce, accuracy))\n", " if trainParams[\"verbose\"]:\n", " for ind in range(1): # model.batch_size):\n", " ys = textlib.decode(y_batch[ind]).replace('\\n', ' | ')\n", " yps = textlib.decode(prediction[ind]).replace('\\n', ' | ')\n", " print(\" y:\", ys)\n", " print(\" yp:\", yps)\n", "\n", " # Generate sample texts for different temperature every ..NIter iterations:\n", " if (iteration+1) % trainParams[\"statusEveryNIter\"] == 0:\n", " \n", " # Save training data\n", " # print(\"S>\")\n", " saver.save(sess, checkpoint_file, global_step=iteration+1)\n", " # print(\"S<\")\n", "\n", " if trainParams[\"generateDuringTraining\"]:\n", " # Generate sample\n", " for t in range(2, 11, 4):\n", " temp = float(t) / 10.0;\n", " xs = ' ' * model.steps\n", " xso = ''\n", " doini=True\n", " for i in range(trainParams[\"generated_text_size\"]):\n", " X_new = np.transpose([[textlib.c2i[sj]] for sj in xs])\n", " if doini:\n", " doini=False\n", " g_state = sess.run([model.init_state_0], feed_dict={model.X: X_new})\n", " \n", " g_state, y_pred = sess.run([model.final_state, model.output_softmax_temp], \n", " feed_dict={model.X: X_new, model.init_state: g_state,\n", " model.temperature: temp})\n", " inds=list(range(model.vocab_size))\n", " ind = np.random.choice(inds, p=y_pred[0, -1].ravel())\n", " nc = textlib.i2c[ind]\n", " xso += nc\n", " xs = xs[1:]+nc\n", "\n", " print(\"----------------- temperature =\", temp, \"----------------------\")\n", " # print(xso)\n", " textlib.sourceHighlight(xso, 20) # 20: minimum quote size detected.\n", " print(\"---------------------------------------\")" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "CxdFuhGcatlP" }, "source": [ "## 5. Szöveg generálása a betanított modellel" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "colab": { "autoexec": { "startup": false, "wait_interval": 0 } }, "colab_type": "code", "id": "ugGiGQ0IatlR" }, "outputs": [], "source": [ "# Generating text using the model data generated during training.\n", "def ghostWriter(textsize, temperature=1.0):\n", " xso = None\n", " with tf.Session() as sess:\n", " model.init.run()\n", "\n", " tflogdir = os.path.realpath(model.logdir)\n", " if not os.path.exists(tflogdir):\n", " print(\"You haven't trained a model, no data found at: {}\".format(tflogdir))\n", " return None\n", "\n", " # Used for saving the training parameters periodically\n", " saver = tf.train.Saver()\n", " checkpoint_file = os.path.join(tflogdir, model.checkpoint)\n", "\n", " lastSave = tf.train.latest_checkpoint(tflogdir, latest_filename=None)\n", " if lastSave is not None:\n", " pt = lastSave.rfind('-')\n", " if pt != -1:\n", " pt += 1\n", " start_iter=int(lastSave[pt:])\n", " print(\"Restoring checkpoint at {}: {}\".format(start_iter, lastSave))\n", " saver.restore(sess, lastSave)\n", " else:\n", " print(\"No checkpoints have been saved at:{}\".format(trainParams[\"logdir\"]))\n", " return None\n", "\n", " xs = ' ' * model.steps\n", " xso = ''\n", " doini = True\n", " for i in range(textsize):\n", " X_new = np.transpose([[textlib.c2i[sj]] for sj in xs])\n", " if doini:\n", " doini=False\n", " g_state = sess.run([model.init_state_0], feed_dict={model.X: X_new})\n", " g_state, y_pred = sess.run([model.final_state, model.output_softmax_temp], \n", " feed_dict={model.X: X_new, model.init_state: g_state,\n", " model.temperature: temperature})\n", " inds=list(range(model.vocab_size))\n", " ind = np.random.choice(inds, p=y_pred[0, -1].ravel())\n", " nc = textlib.i2c[ind]\n", " xso += nc\n", " xs = xs[1:]+nc\n", " return(xso)\n", "\n", "\n", "def detectPlagiarism(generatedtext, textlibrary, minQuoteLength=10):\n", " textlibrary.sourceHighlight(generatedtext, minQuoteLength)\n", " " ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "colab": { "autoexec": { "startup": false, "wait_interval": 0 } }, "colab_type": "code", "id": "Ace0xbUhatlb" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Restoring checkpoint at 5000: /home/groszthomas/tensorlog/jozsef_attila/jozsef_attila.ckpt-5000\n", "INFO:tensorflow:Restoring parameters from /home/groszthomas/tensorlog/jozsef_attila/jozsef_attila.ckpt-5000\n" ] }, { "data": { "text/html": [ "Sources: jozsefattila-utf8[1]
" ], "text/plain": [ "