Jobanpreet commited on
Commit
d7790d0
·
1 Parent(s): 29432f4

Upload 2 files

Browse files
.gitattributes CHANGED
@@ -34,3 +34,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
  s2s/variables/variables.data-00000-of-00001 filter=lfs diff=lfs merge=lfs -text
 
 
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
  s2s/variables/variables.data-00000-of-00001 filter=lfs diff=lfs merge=lfs -text
37
+ transliteration.csv filter=lfs diff=lfs merge=lfs -text
Transliteration(2_LSTM)_final.ipynb ADDED
@@ -0,0 +1,1199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": null,
6
+ "metadata": {
7
+ "id": "i32AdA77t1eH"
8
+ },
9
+ "outputs": [],
10
+ "source": [
11
+ "#import libraries\n",
12
+ "import numpy as np\n",
13
+ "import pandas as pd\n",
14
+ "import tensorflow as tf\n",
15
+ "from tensorflow import keras\n"
16
+ ]
17
+ },
18
+ {
19
+ "cell_type": "code",
20
+ "execution_count": 1,
21
+ "metadata": {
22
+ "colab": {
23
+ "base_uri": "https://localhost:8080/"
24
+ },
25
+ "executionInfo": {
26
+ "elapsed": 17529,
27
+ "status": "ok",
28
+ "timestamp": 1691416966013,
29
+ "user": {
30
+ "displayName": "JOBANPREET SINGH",
31
+ "userId": "15968293240343091979"
32
+ },
33
+ "user_tz": -330
34
+ },
35
+ "id": "mCo1sSvgTmMt",
36
+ "outputId": "a984f6b4-a0f7-4ef7-8e7e-c453915b31d3"
37
+ },
38
+ "outputs": [
39
+ {
40
+ "name": "stdout",
41
+ "output_type": "stream",
42
+ "text": [
43
+ "Mounted at /content/drive\n"
44
+ ]
45
+ }
46
+ ],
47
+ "source": [
48
+ "from google.colab import drive\n",
49
+ "drive.mount('/content/drive')"
50
+ ]
51
+ },
52
+ {
53
+ "cell_type": "code",
54
+ "execution_count": null,
55
+ "metadata": {
56
+ "colab": {
57
+ "base_uri": "https://localhost:8080/",
58
+ "height": 206
59
+ },
60
+ "id": "TCF-yZlauZ41",
61
+ "outputId": "38d1e397-00dc-4f12-d038-d9de685fd0cd"
62
+ },
63
+ "outputs": [
64
+ {
65
+ "data": {
66
+ "text/html": [
67
+ "<div>\n",
68
+ "<style scoped>\n",
69
+ " .dataframe tbody tr th:only-of-type {\n",
70
+ " vertical-align: middle;\n",
71
+ " }\n",
72
+ "\n",
73
+ " .dataframe tbody tr th {\n",
74
+ " vertical-align: top;\n",
75
+ " }\n",
76
+ "\n",
77
+ " .dataframe thead th {\n",
78
+ " text-align: right;\n",
79
+ " }\n",
80
+ "</style>\n",
81
+ "<table border=\"1\" class=\"dataframe\">\n",
82
+ " <thead>\n",
83
+ " <tr style=\"text-align: right;\">\n",
84
+ " <th></th>\n",
85
+ " <th>Punjabi</th>\n",
86
+ " <th>English</th>\n",
87
+ " </tr>\n",
88
+ " </thead>\n",
89
+ " <tbody>\n",
90
+ " <tr>\n",
91
+ " <th>0</th>\n",
92
+ " <td>ਅੱਜਕੱਲ੍ਹ</td>\n",
93
+ " <td>ajjkallh</td>\n",
94
+ " </tr>\n",
95
+ " <tr>\n",
96
+ " <th>1</th>\n",
97
+ " <td>ਕੁੱਕਰੀ</td>\n",
98
+ " <td>kookerii</td>\n",
99
+ " </tr>\n",
100
+ " <tr>\n",
101
+ " <th>2</th>\n",
102
+ " <td>ਧਮਨੀਆਂ</td>\n",
103
+ " <td>dhamniyan</td>\n",
104
+ " </tr>\n",
105
+ " <tr>\n",
106
+ " <th>3</th>\n",
107
+ " <td>ਖ਼ੁਦਗ਼ਰਜ਼ੀ</td>\n",
108
+ " <td>khudgarzi</td>\n",
109
+ " </tr>\n",
110
+ " <tr>\n",
111
+ " <th>4</th>\n",
112
+ " <td>ਅਗਲੇਰਾ</td>\n",
113
+ " <td>aglera</td>\n",
114
+ " </tr>\n",
115
+ " </tbody>\n",
116
+ "</table>\n",
117
+ "</div>"
118
+ ],
119
+ "text/plain": [
120
+ " Punjabi English\n",
121
+ "0 ਅੱਜਕੱਲ੍ਹ ajjkallh\n",
122
+ "1 ਕੁੱਕਰੀ kookerii\n",
123
+ "2 ਧਮਨੀਆਂ dhamniyan\n",
124
+ "3 ਖ਼ੁਦਗ਼ਰਜ਼ੀ khudgarzi\n",
125
+ "4 ਅਗਲੇਰਾ aglera"
126
+ ]
127
+ },
128
+ "execution_count": 15,
129
+ "metadata": {},
130
+ "output_type": "execute_result"
131
+ }
132
+ ],
133
+ "source": [
134
+ "# read dataset\n",
135
+ "df=pd.read_csv(\"transliteration.csv\")\n",
136
+ "\n",
137
+ "df.head()"
138
+ ]
139
+ },
140
+ {
141
+ "cell_type": "code",
142
+ "execution_count": null,
143
+ "metadata": {
144
+ "colab": {
145
+ "base_uri": "https://localhost:8080/"
146
+ },
147
+ "id": "sQJDIFoouski",
148
+ "outputId": "7aa0b1b6-29b8-40bf-f69f-3269ab738bfa"
149
+ },
150
+ "outputs": [
151
+ {
152
+ "data": {
153
+ "text/plain": [
154
+ "Punjabi 0\n",
155
+ "English 2\n",
156
+ "dtype: int64"
157
+ ]
158
+ },
159
+ "execution_count": 16,
160
+ "metadata": {},
161
+ "output_type": "execute_result"
162
+ }
163
+ ],
164
+ "source": [
165
+ "#check null values\n",
166
+ "df.isnull().sum()"
167
+ ]
168
+ },
169
+ {
170
+ "cell_type": "code",
171
+ "execution_count": null,
172
+ "metadata": {
173
+ "id": "63J_12A9uzDR",
174
+ "outputId": "3668f1c6-eb6e-4adb-ac7e-68aa27cfad0e"
175
+ },
176
+ "outputs": [
177
+ {
178
+ "data": {
179
+ "text/plain": [
180
+ "(514722, 2)"
181
+ ]
182
+ },
183
+ "execution_count": 17,
184
+ "metadata": {},
185
+ "output_type": "execute_result"
186
+ }
187
+ ],
188
+ "source": [
189
+ "#drop null values\n",
190
+ "df.dropna(inplace=True)\n",
191
+ "df.shape"
192
+ ]
193
+ },
194
+ {
195
+ "cell_type": "code",
196
+ "execution_count": null,
197
+ "metadata": {
198
+ "id": "xzPeje92u8YF"
199
+ },
200
+ "outputs": [],
201
+ "source": [
202
+ "#creaing list source text and target text\n",
203
+ "input_texts=list(df['English'])\n",
204
+ "input_texts=[item.lower() for item in input_texts] # converting to lowercase all elements of input_texts\n",
205
+ "target_texts=list(df['Punjabi'])"
206
+ ]
207
+ },
208
+ {
209
+ "cell_type": "code",
210
+ "execution_count": null,
211
+ "metadata": {
212
+ "id": "4rsG9aYQvUXX"
213
+ },
214
+ "outputs": [],
215
+ "source": [
216
+ "target_texts = ['\\t' + item + '\\n' for item in target_texts] # adding \\t and \\n at the start and end of each element of target_texts"
217
+ ]
218
+ },
219
+ {
220
+ "cell_type": "code",
221
+ "execution_count": null,
222
+ "metadata": {
223
+ "id": "NUhp1DyOvhie"
224
+ },
225
+ "outputs": [],
226
+ "source": [
227
+ "#getting unique characters in both the languages\n",
228
+ "input_characters = set()\n",
229
+ "target_characters = set()\n",
230
+ "for char in input_texts:\n",
231
+ " for i in char:\n",
232
+ " if i not in input_characters:\n",
233
+ " input_characters.add(i)\n",
234
+ "for char in target_texts:\n",
235
+ " for j in char:\n",
236
+ " if j not in target_characters:\n",
237
+ " target_characters.add(j)"
238
+ ]
239
+ },
240
+ {
241
+ "cell_type": "code",
242
+ "execution_count": null,
243
+ "metadata": {
244
+ "colab": {
245
+ "base_uri": "https://localhost:8080/"
246
+ },
247
+ "id": "ho2APRJrvtyb",
248
+ "outputId": "45721760-bb46-44d0-8425-4e97d9b8ec55"
249
+ },
250
+ "outputs": [
251
+ {
252
+ "name": "stdout",
253
+ "output_type": "stream",
254
+ "text": [
255
+ "Number of samples: 514722\n",
256
+ "Max sequence length for inputs: 27\n",
257
+ "Max sequence length for outputs: 24\n"
258
+ ]
259
+ }
260
+ ],
261
+ "source": [
262
+ "input_characters = sorted(list(input_characters))\n",
263
+ "target_characters = sorted(list(target_characters))\n",
264
+ "max_encoder_seq_length = max([len(txt) for txt in input_texts])\n",
265
+ "max_decoder_seq_length = max([len(txt) for txt in target_texts])\n",
266
+ "\n",
267
+ "\n",
268
+ "print(\"Number of samples:\", len(input_texts))\n",
269
+ "print(\"Max sequence length for inputs:\", max_encoder_seq_length)\n",
270
+ "print(\"Max sequence length for outputs:\", max_decoder_seq_length)"
271
+ ]
272
+ },
273
+ {
274
+ "cell_type": "code",
275
+ "execution_count": null,
276
+ "metadata": {
277
+ "id": "7Sszy5eYwHMS"
278
+ },
279
+ "outputs": [],
280
+ "source": [
281
+ "# assigning indexes to each characters of source and target language\n",
282
+ "input_token_index={' ':0,\n",
283
+ " 'a': 1,\n",
284
+ " 'b': 2,\n",
285
+ " 'c': 3,\n",
286
+ " 'd': 4,\n",
287
+ " 'e': 5,\n",
288
+ " 'f': 6,\n",
289
+ " 'g': 7,\n",
290
+ " 'h': 8,\n",
291
+ " 'i': 9,\n",
292
+ " 'j': 10,\n",
293
+ " 'k': 11,\n",
294
+ " 'l': 12,\n",
295
+ " 'm': 13,\n",
296
+ " 'n': 14,\n",
297
+ " 'o': 15,\n",
298
+ " 'p': 16,\n",
299
+ " 'q': 17,\n",
300
+ " 'r': 18,\n",
301
+ " 's': 19,\n",
302
+ " 't': 20,\n",
303
+ " 'u': 21,\n",
304
+ " 'v': 22,\n",
305
+ " 'w': 23,\n",
306
+ " 'x': 24,\n",
307
+ " 'y': 25,\n",
308
+ " 'z': 26}"
309
+ ]
310
+ },
311
+ {
312
+ "cell_type": "code",
313
+ "execution_count": null,
314
+ "metadata": {
315
+ "id": "WAa6pR1-wHY6"
316
+ },
317
+ "outputs": [],
318
+ "source": [
319
+ "target_token_index={'\\t': 0,\n",
320
+ " '\\n': 1,\n",
321
+ " ' ': 2,\n",
322
+ " 'ਅ': 3,\n",
323
+ " 'ਆ': 4,\n",
324
+ " 'ਇ': 5,\n",
325
+ " 'ਈ': 6,\n",
326
+ " 'ਉ': 7,\n",
327
+ " 'ਊ': 8,\n",
328
+ " 'ਏ': 9,\n",
329
+ " 'ਐ': 10,\n",
330
+ " 'ਓ': 11,\n",
331
+ " 'ਔ': 12,\n",
332
+ " 'ਕ': 13,\n",
333
+ " 'ਖ': 14,\n",
334
+ " 'ਗ': 15,\n",
335
+ " 'ਘ': 16,\n",
336
+ " 'ਙ': 17,\n",
337
+ " 'ਚ': 18,\n",
338
+ " 'ਛ': 19,\n",
339
+ " 'ਜ': 20,\n",
340
+ " 'ਝ': 21,\n",
341
+ " 'ਞ': 22,\n",
342
+ " 'ਟ': 23,\n",
343
+ " 'ਠ': 24,\n",
344
+ " 'ਡ': 25,\n",
345
+ " 'ਢ': 26,\n",
346
+ " 'ਣ': 27,\n",
347
+ " 'ਤ': 28,\n",
348
+ " 'ਥ': 29,\n",
349
+ " 'ਦ': 30,\n",
350
+ " 'ਧ': 31,\n",
351
+ " 'ਨ': 32,\n",
352
+ " 'ਪ': 33,\n",
353
+ " 'ਫ': 34,\n",
354
+ " 'ਬ': 35,\n",
355
+ " 'ਭ': 36,\n",
356
+ " 'ਮ': 37,\n",
357
+ " 'ਯ': 38,\n",
358
+ " 'ਰ': 39,\n",
359
+ " 'ਲ': 40,\n",
360
+ " 'ਵ': 41,\n",
361
+ " 'ਸ': 42,\n",
362
+ " 'ਹ': 43,\n",
363
+ " '਼': 44,\n",
364
+ " 'ਾ': 45,\n",
365
+ " 'ਿ': 46,\n",
366
+ " 'ੀ': 47,\n",
367
+ " 'ੁ': 48,\n",
368
+ " 'ੂ': 49,\n",
369
+ " 'ੇ': 50,\n",
370
+ " 'ੈ': 51,\n",
371
+ " 'ੋ': 52,\n",
372
+ " 'ੌ': 53,\n",
373
+ " '੍': 54,\n",
374
+ " 'ੜ': 55,\n",
375
+ " 'ੰ': 56,\n",
376
+ " 'ੱ': 57,\n",
377
+ " 'ਂ': 58,\n",
378
+ "'ੲ':59}"
379
+ ]
380
+ },
381
+ {
382
+ "cell_type": "code",
383
+ "execution_count": null,
384
+ "metadata": {
385
+ "id": "bCqPdrq-TkQx"
386
+ },
387
+ "outputs": [],
388
+ "source": [
389
+ "import pickle\n",
390
+ "with open(\"input_token_index.pkl\",'wb') as file:\n",
391
+ " pickle.dump(input_token_index,file)\n",
392
+ "\n",
393
+ "with open(\"target_token_index.pkl\",'wb') as file:\n",
394
+ " pickle.dump(target_token_index,file)"
395
+ ]
396
+ },
397
+ {
398
+ "cell_type": "code",
399
+ "execution_count": null,
400
+ "metadata": {
401
+ "id": "HAWXGYejTkQy"
402
+ },
403
+ "outputs": [],
404
+ "source": []
405
+ },
406
+ {
407
+ "cell_type": "code",
408
+ "execution_count": null,
409
+ "metadata": {
410
+ "colab": {
411
+ "base_uri": "https://localhost:8080/"
412
+ },
413
+ "id": "pKlLsEReyuwE",
414
+ "outputId": "9ec6f048-76be-43cd-cd0f-3aff94b628b0"
415
+ },
416
+ "outputs": [
417
+ {
418
+ "name": "stdout",
419
+ "output_type": "stream",
420
+ "text": [
421
+ "Number of unique input tokens: 27\n",
422
+ "Number of unique output tokens: 60\n"
423
+ ]
424
+ }
425
+ ],
426
+ "source": [
427
+ "num_encoder_tokens=len(input_token_index)\n",
428
+ "num_decoder_tokens=len(target_token_index)\n",
429
+ "print(\"Number of unique input tokens:\", num_encoder_tokens)\n",
430
+ "print(\"Number of unique output tokens:\", num_decoder_tokens)"
431
+ ]
432
+ },
433
+ {
434
+ "cell_type": "code",
435
+ "execution_count": null,
436
+ "metadata": {
437
+ "id": "KRiDLofETkQz"
438
+ },
439
+ "outputs": [],
440
+ "source": []
441
+ },
442
+ {
443
+ "cell_type": "code",
444
+ "execution_count": null,
445
+ "metadata": {
446
+ "id": "gFDq5lqWv0NW"
447
+ },
448
+ "outputs": [],
449
+ "source": [
450
+ "# input_token_index = dict([(char, i) for i, char in enumerate(input_characters)])\n",
451
+ "# target_token_index = dict([(char, i) for i, char in enumerate(target_characters)])"
452
+ ]
453
+ },
454
+ {
455
+ "cell_type": "code",
456
+ "execution_count": null,
457
+ "metadata": {
458
+ "id": "Qks23AHEwBxL"
459
+ },
460
+ "outputs": [],
461
+ "source": [
462
+ "# Data preparation for model training\n",
463
+ "encoder_input_data = np.zeros(\n",
464
+ " (len(input_texts), max_encoder_seq_length, num_encoder_tokens), dtype=\"float32\"\n",
465
+ ")\n",
466
+ "decoder_input_data = np.zeros(\n",
467
+ " (len(input_texts), max_decoder_seq_length,num_decoder_tokens), dtype=\"float32\"\n",
468
+ ")\n",
469
+ "decoder_target_data = np.zeros(\n",
470
+ " (len(input_texts), max_decoder_seq_length,num_decoder_tokens), dtype=\"float32\"\n",
471
+ ")\n",
472
+ "\n",
473
+ "for i, (input_text, target_text) in enumerate(zip(input_texts, target_texts)):\n",
474
+ " for t, char in enumerate(input_text):\n",
475
+ " encoder_input_data[i, t, input_token_index[char]] = 1.0\n",
476
+ " encoder_input_data[i, t + 1 :, input_token_index[\" \"]] = 1.0\n",
477
+ " for t, char in enumerate(target_text):\n",
478
+ " # decoder_target_data is ahead of decoder_input_data by one timestep\n",
479
+ " decoder_input_data[i, t, target_token_index[char]] = 1.0\n",
480
+ " if t > 0:\n",
481
+ " # decoder_target_data will be ahead by one timestep\n",
482
+ " # and will not include the start character.\n",
483
+ " decoder_target_data[i, t - 1, target_token_index[char]] = 1.0\n",
484
+ " decoder_input_data[i, t + 1 :, target_token_index[\" \"]] = 1.0\n",
485
+ " decoder_target_data[i, t:, target_token_index[\" \"]] = 1.0"
486
+ ]
487
+ },
488
+ {
489
+ "cell_type": "code",
490
+ "execution_count": null,
491
+ "metadata": {
492
+ "colab": {
493
+ "base_uri": "https://localhost:8080/"
494
+ },
495
+ "id": "KUO0JORIogdi",
496
+ "outputId": "fb6fc006-a073-4426-9683-0f9da633777a"
497
+ },
498
+ "outputs": [
499
+ {
500
+ "name": "stderr",
501
+ "output_type": "stream",
502
+ "text": [
503
+ "2023-08-06 14:10:30.193063: W tensorflow/core/common_runtime/gpu/gpu_device.cc:1960] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.\n",
504
+ "Skipping registering GPU devices...\n"
505
+ ]
506
+ },
507
+ {
508
+ "name": "stdout",
509
+ "output_type": "stream",
510
+ "text": [
511
+ "Model: \"model\"\n",
512
+ "__________________________________________________________________________________________________\n",
513
+ " Layer (type) Output Shape Param # Connected to \n",
514
+ "==================================================================================================\n",
515
+ " encoder_inputs (InputLayer [(None, None, 27)] 0 [] \n",
516
+ " ) \n",
517
+ " \n",
518
+ " decoder_inputs (InputLayer [(None, None, 60)] 0 [] \n",
519
+ " ) \n",
520
+ " \n",
521
+ " encoder_lstm1 (LSTM) [(None, None, 256), 290816 ['encoder_inputs[0][0]'] \n",
522
+ " (None, 256), \n",
523
+ " (None, 256)] \n",
524
+ " \n",
525
+ " decoder_lstm1 (LSTM) [(None, None, 256), 324608 ['decoder_inputs[0][0]', \n",
526
+ " (None, 256), 'encoder_lstm1[0][1]', \n",
527
+ " (None, 256)] 'encoder_lstm1[0][2]'] \n",
528
+ " \n",
529
+ " encoder_lstm2 (LSTM) [(None, 256), 525312 ['encoder_lstm1[0][0]'] \n",
530
+ " (None, 256), \n",
531
+ " (None, 256)] \n",
532
+ " \n",
533
+ " decoder_lstm2 (LSTM) [(None, None, 256), 525312 ['decoder_lstm1[0][0]', \n",
534
+ " (None, 256), 'encoder_lstm2[0][1]', \n",
535
+ " (None, 256)] 'encoder_lstm2[0][2]'] \n",
536
+ " \n",
537
+ " decoder_dense (Dense) (None, None, 60) 15420 ['decoder_lstm2[0][0]'] \n",
538
+ " \n",
539
+ "==================================================================================================\n",
540
+ "Total params: 1681468 (6.41 MB)\n",
541
+ "Trainable params: 1681468 (6.41 MB)\n",
542
+ "Non-trainable params: 0 (0.00 Byte)\n",
543
+ "__________________________________________________________________________________________________\n"
544
+ ]
545
+ }
546
+ ],
547
+ "source": [
548
+ "from keras.models import Model\n",
549
+ "from keras.layers import Input, LSTM, Dense, RNN\n",
550
+ "layers = [256,128] # we loop LSTMCells then wrap them in an RNN layer\n",
551
+ "latent_dim = 256\n",
552
+ "\n",
553
+ "encoder_inputs = Input(shape=(None, num_encoder_tokens), name='encoder_inputs')\n",
554
+ "\n",
555
+ "e_outputs, h1, c1 = LSTM(latent_dim, return_state=True, return_sequences=True, name='encoder_lstm1')(encoder_inputs)\n",
556
+ "_, h2, c2 = LSTM(latent_dim, return_state=True, name='encoder_lstm2')(e_outputs)\n",
557
+ "encoder_states = [h1, c1, h2, c2]\n",
558
+ "\n",
559
+ "decoder_inputs = Input(shape=(None, num_decoder_tokens), name='decoder_inputs')\n",
560
+ "\n",
561
+ "out_layer1 = LSTM(latent_dim, return_sequences=True, return_state=True, name='decoder_lstm1')\n",
562
+ "d_outputs, dh1, dc1 = out_layer1(decoder_inputs, initial_state=[h1, c1])\n",
563
+ "\n",
564
+ "out_layer2 = LSTM(latent_dim, return_sequences=True, return_state=True, name='decoder_lstm2')\n",
565
+ "final, dh2, dc2 = out_layer2(d_outputs, initial_state=[h2, c2])\n",
566
+ "\n",
567
+ "decoder_dense = Dense(num_decoder_tokens, activation='softmax', name='decoder_dense')\n",
568
+ "decoder_outputs = decoder_dense(final)\n",
569
+ "\n",
570
+ "model = Model([encoder_inputs, decoder_inputs], decoder_outputs)\n",
571
+ "\n",
572
+ "model.summary()"
573
+ ]
574
+ },
575
+ {
576
+ "cell_type": "code",
577
+ "execution_count": null,
578
+ "metadata": {
579
+ "colab": {
580
+ "base_uri": "https://localhost:8080/"
581
+ },
582
+ "id": "tVcfVOwioggR",
583
+ "outputId": "8b0c76e6-8a81-4531-da76-90b0e36f2dda"
584
+ },
585
+ "outputs": [
586
+ {
587
+ "name": "stdout",
588
+ "output_type": "stream",
589
+ "text": [
590
+ "Epoch 1/20\n",
591
+ "6435/6435 [==============================] - 916s 142ms/step - loss: 0.5904 - accuracy: 0.8316 - val_loss: 0.3925 - val_accuracy: 0.8818\n",
592
+ "Epoch 2/20\n",
593
+ "6435/6435 [==============================] - 906s 141ms/step - loss: 0.1990 - accuracy: 0.9351 - val_loss: 0.1797 - val_accuracy: 0.9392\n",
594
+ "Epoch 3/20\n",
595
+ "6435/6435 [==============================] - 906s 141ms/step - loss: 0.1368 - accuracy: 0.9547 - val_loss: 0.1442 - val_accuracy: 0.9506\n",
596
+ "Epoch 4/20\n",
597
+ "6435/6435 [==============================] - 908s 141ms/step - loss: 0.1127 - accuracy: 0.9624 - val_loss: 0.1038 - val_accuracy: 0.9627\n",
598
+ "Epoch 5/20\n",
599
+ "6435/6435 [==============================] - 907s 141ms/step - loss: 0.1001 - accuracy: 0.9664 - val_loss: 0.0852 - val_accuracy: 0.9690\n",
600
+ "Epoch 6/20\n",
601
+ "6435/6435 [==============================] - 907s 141ms/step - loss: 0.0922 - accuracy: 0.9689 - val_loss: 0.0782 - val_accuracy: 0.9714\n",
602
+ "Epoch 7/20\n",
603
+ "6435/6435 [==============================] - 907s 141ms/step - loss: 0.0865 - accuracy: 0.9708 - val_loss: 0.0738 - val_accuracy: 0.9730\n",
604
+ "Epoch 8/20\n",
605
+ "6435/6435 [==============================] - 906s 141ms/step - loss: 0.0819 - accuracy: 0.9721 - val_loss: 0.0761 - val_accuracy: 0.9720\n",
606
+ "Epoch 9/20\n",
607
+ "6435/6435 [==============================] - 905s 141ms/step - loss: 0.0782 - accuracy: 0.9733 - val_loss: 0.0751 - val_accuracy: 0.9723\n",
608
+ "Epoch 10/20\n",
609
+ "6435/6435 [==============================] - 905s 141ms/step - loss: 0.0751 - accuracy: 0.9743 - val_loss: 0.0885 - val_accuracy: 0.9695\n",
610
+ "Epoch 11/20\n",
611
+ "6435/6435 [==============================] - 907s 141ms/step - loss: 0.0723 - accuracy: 0.9751 - val_loss: 0.0649 - val_accuracy: 0.9758\n",
612
+ "Epoch 12/20\n",
613
+ "6435/6435 [==============================] - 906s 141ms/step - loss: 0.0699 - accuracy: 0.9759 - val_loss: 0.0672 - val_accuracy: 0.9747\n",
614
+ "Epoch 13/20\n",
615
+ "6435/6435 [==============================] - 907s 141ms/step - loss: 0.0675 - accuracy: 0.9766 - val_loss: 0.0666 - val_accuracy: 0.9752\n",
616
+ "Epoch 14/20\n",
617
+ "6435/6435 [==============================] - 907s 141ms/step - loss: 0.0654 - accuracy: 0.9773 - val_loss: 0.0709 - val_accuracy: 0.9736\n",
618
+ "Epoch 15/20\n",
619
+ "6435/6435 [==============================] - 906s 141ms/step - loss: 0.0635 - accuracy: 0.9778 - val_loss: 0.0633 - val_accuracy: 0.9762\n",
620
+ "Epoch 16/20\n",
621
+ "6435/6435 [==============================] - 906s 141ms/step - loss: 0.0616 - accuracy: 0.9784 - val_loss: 0.0637 - val_accuracy: 0.9762\n",
622
+ "Epoch 17/20\n",
623
+ "6435/6435 [==============================] - 906s 141ms/step - loss: 0.0598 - accuracy: 0.9789 - val_loss: 0.0655 - val_accuracy: 0.9756\n",
624
+ "Epoch 18/20\n",
625
+ "6435/6435 [==============================] - 905s 141ms/step - loss: 0.0582 - accuracy: 0.9794 - val_loss: 0.0645 - val_accuracy: 0.9760\n",
626
+ "Epoch 19/20\n",
627
+ "6435/6435 [==============================] - 905s 141ms/step - loss: 0.0566 - accuracy: 0.9799 - val_loss: 0.0640 - val_accuracy: 0.9759\n",
628
+ "Epoch 20/20\n",
629
+ "6435/6435 [==============================] - 906s 141ms/step - loss: 0.0551 - accuracy: 0.9804 - val_loss: 0.0646 - val_accuracy: 0.9760\n",
630
+ "INFO:tensorflow:Assets written to: s2s/assets\n"
631
+ ]
632
+ },
633
+ {
634
+ "name": "stderr",
635
+ "output_type": "stream",
636
+ "text": [
637
+ "INFO:tensorflow:Assets written to: s2s/assets\n"
638
+ ]
639
+ }
640
+ ],
641
+ "source": [
642
+ "batch_size = 64 # Batch size for training.\n",
643
+ "epochs = 20\n",
644
+ "model.compile(\n",
645
+ " optimizer=\"rmsprop\", loss=\"categorical_crossentropy\", metrics=[\"accuracy\"]\n",
646
+ ")\n",
647
+ "history=model.fit(\n",
648
+ " [encoder_input_data, decoder_input_data],\n",
649
+ " decoder_target_data,\n",
650
+ " batch_size=batch_size,\n",
651
+ " epochs=epochs,\n",
652
+ " validation_split=0.2,\n",
653
+ ")\n",
654
+ "# Save model\n",
655
+ "model.save(\"s2s\")"
656
+ ]
657
+ },
658
+ {
659
+ "cell_type": "code",
660
+ "execution_count": null,
661
+ "metadata": {
662
+ "id": "pPg8_FY2Vw1v"
663
+ },
664
+ "outputs": [],
665
+ "source": []
666
+ },
667
+ {
668
+ "cell_type": "code",
669
+ "execution_count": null,
670
+ "metadata": {
671
+ "colab": {
672
+ "base_uri": "https://localhost:8080/",
673
+ "height": 447
674
+ },
675
+ "id": "PRTb9JtnVw4M",
676
+ "outputId": "113afba2-b594-41af-f1b7-1061154113a5"
677
+ },
678
+ "outputs": [
679
+ {
680
+ "data": {
681
+ "image/png": "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\n",
682
+ "text/plain": [
683
+ "<Figure size 432x288 with 1 Axes>"
684
+ ]
685
+ },
686
+ "metadata": {
687
+ "needs_background": "light"
688
+ },
689
+ "output_type": "display_data"
690
+ },
691
+ {
692
+ "data": {
693
+ "text/plain": [
694
+ "<Figure size 432x288 with 0 Axes>"
695
+ ]
696
+ },
697
+ "metadata": {},
698
+ "output_type": "display_data"
699
+ }
700
+ ],
701
+ "source": [
702
+ "import matplotlib.pyplot as plt\n",
703
+ "plt.plot(history.history['loss'])\n",
704
+ "plt.plot(history.history['val_loss'])\n",
705
+ "plt.legend(['train','validation'])\n",
706
+ "plt.show()\n",
707
+ "plt.savefig('trai_validation_loss')"
708
+ ]
709
+ },
710
+ {
711
+ "cell_type": "code",
712
+ "execution_count": null,
713
+ "metadata": {
714
+ "colab": {
715
+ "base_uri": "https://localhost:8080/",
716
+ "height": 489
717
+ },
718
+ "id": "uaEwY_b0V93S",
719
+ "outputId": "7cc3860b-a274-462a-8a9c-360b4330ddf0"
720
+ },
721
+ "outputs": [
722
+ {
723
+ "data": {
724
+ "image/png": "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\n",
725
+ "text/plain": [
726
+ "<Figure size 432x288 with 1 Axes>"
727
+ ]
728
+ },
729
+ "metadata": {
730
+ "needs_background": "light"
731
+ },
732
+ "output_type": "display_data"
733
+ },
734
+ {
735
+ "data": {
736
+ "text/plain": [
737
+ "<Figure size 432x288 with 0 Axes>"
738
+ ]
739
+ },
740
+ "metadata": {},
741
+ "output_type": "display_data"
742
+ }
743
+ ],
744
+ "source": [
745
+ "plt.plot(history.history['accuracy'])\n",
746
+ "plt.plot(history.history['val_accuracy'])\n",
747
+ "plt.title('model accuracy')\n",
748
+ "plt.ylabel('accuracy')\n",
749
+ "plt.xlabel('epoch')\n",
750
+ "plt.legend(['train', 'val'], loc='upper left')\n",
751
+ "plt.show()\n",
752
+ "plt.savefig('trai_validation_accuracy')"
753
+ ]
754
+ },
755
+ {
756
+ "cell_type": "markdown",
757
+ "metadata": {
758
+ "id": "5ejPmkDseEn0"
759
+ },
760
+ "source": [
761
+ "# Prediction"
762
+ ]
763
+ },
764
+ {
765
+ "cell_type": "code",
766
+ "execution_count": 2,
767
+ "metadata": {
768
+ "executionInfo": {
769
+ "elapsed": 16181,
770
+ "status": "ok",
771
+ "timestamp": 1691417034020,
772
+ "user": {
773
+ "displayName": "JOBANPREET SINGH",
774
+ "userId": "15968293240343091979"
775
+ },
776
+ "user_tz": -330
777
+ },
778
+ "id": "up50mntoTtsG"
779
+ },
780
+ "outputs": [
781
+ {
782
+ "name": "stderr",
783
+ "output_type": "stream",
784
+ "text": [
785
+ "2023-10-01 17:08:48.123898: I tensorflow/compiler/xla/stream_executor/cuda/cuda_gpu_executor.cc:894] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n",
786
+ "2023-10-01 17:08:48.124943: W tensorflow/core/common_runtime/gpu/gpu_device.cc:2211] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.\n",
787
+ "Skipping registering GPU devices...\n"
788
+ ]
789
+ }
790
+ ],
791
+ "source": [
792
+ "from keras.models import Model\n",
793
+ "from keras.layers import Input, LSTM, Dense, RNN\n",
794
+ "from tensorflow import keras\n",
795
+ "import numpy as np\n",
796
+ "import pickle\n",
797
+ "\n",
798
+ "model = keras.models.load_model(\"s2s\")\n",
799
+ "\n",
800
+ "with open(\"input_token_index.pkl\", \"rb\") as file:\n",
801
+ " input_token_index = pickle.load(file)\n",
802
+ "\n",
803
+ "with open(\"target_token_index.pkl\", \"rb\") as file:\n",
804
+ " target_token_index = pickle.load(file)\n",
805
+ "\n",
806
+ "num_encoder_tokens=len(input_token_index)\n",
807
+ "num_decoder_tokens=len(target_token_index)\n",
808
+ "latent_dim=256\n",
809
+ "max_encoder_seq_length=25\n",
810
+ "max_decoder_seq_length=24"
811
+ ]
812
+ },
813
+ {
814
+ "cell_type": "code",
815
+ "execution_count": 3,
816
+ "metadata": {
817
+ "colab": {
818
+ "base_uri": "https://localhost:8080/"
819
+ },
820
+ "executionInfo": {
821
+ "elapsed": 15,
822
+ "status": "ok",
823
+ "timestamp": 1691417035680,
824
+ "user": {
825
+ "displayName": "JOBANPREET SINGH",
826
+ "userId": "15968293240343091979"
827
+ },
828
+ "user_tz": -330
829
+ },
830
+ "id": "9_9kU2VU6cA7",
831
+ "outputId": "79b2fa7f-fc0e-46b4-9f3c-0f8209621ae6"
832
+ },
833
+ "outputs": [
834
+ {
835
+ "name": "stdout",
836
+ "output_type": "stream",
837
+ "text": [
838
+ "Model: \"model\"\n",
839
+ "__________________________________________________________________________________________________\n",
840
+ " Layer (type) Output Shape Param # Connected to \n",
841
+ "==================================================================================================\n",
842
+ " encoder_inputs (InputLayer [(None, None, 27)] 0 [] \n",
843
+ " ) \n",
844
+ " \n",
845
+ " decoder_inputs (InputLayer [(None, None, 60)] 0 [] \n",
846
+ " ) \n",
847
+ " \n",
848
+ " encoder_lstm1 (LSTM) [(None, None, 256), 290816 ['encoder_inputs[0][0]'] \n",
849
+ " (None, 256), \n",
850
+ " (None, 256)] \n",
851
+ " \n",
852
+ " decoder_lstm1 (LSTM) [(None, None, 256), 324608 ['decoder_inputs[0][0]', \n",
853
+ " (None, 256), 'encoder_lstm1[0][1]', \n",
854
+ " (None, 256)] 'encoder_lstm1[0][2]'] \n",
855
+ " \n",
856
+ " encoder_lstm2 (LSTM) [(None, 256), 525312 ['encoder_lstm1[0][0]'] \n",
857
+ " (None, 256), \n",
858
+ " (None, 256)] \n",
859
+ " \n",
860
+ " decoder_lstm2 (LSTM) [(None, None, 256), 525312 ['decoder_lstm1[0][0]', \n",
861
+ " (None, 256), 'encoder_lstm2[0][1]', \n",
862
+ " (None, 256)] 'encoder_lstm2[0][2]'] \n",
863
+ " \n",
864
+ " decoder_dense (Dense) (None, None, 60) 15420 ['decoder_lstm2[0][0]'] \n",
865
+ " \n",
866
+ "==================================================================================================\n",
867
+ "Total params: 1681468 (6.41 MB)\n",
868
+ "Trainable params: 1681468 (6.41 MB)\n",
869
+ "Non-trainable params: 0 (0.00 Byte)\n",
870
+ "__________________________________________________________________________________________________\n"
871
+ ]
872
+ }
873
+ ],
874
+ "source": [
875
+ "model.summary()"
876
+ ]
877
+ },
878
+ {
879
+ "cell_type": "code",
880
+ "execution_count": 4,
881
+ "metadata": {
882
+ "colab": {
883
+ "base_uri": "https://localhost:8080/"
884
+ },
885
+ "executionInfo": {
886
+ "elapsed": 417,
887
+ "status": "ok",
888
+ "timestamp": 1691417038313,
889
+ "user": {
890
+ "displayName": "JOBANPREET SINGH",
891
+ "userId": "15968293240343091979"
892
+ },
893
+ "user_tz": -330
894
+ },
895
+ "id": "HcGQ2zw76cM8",
896
+ "outputId": "8c645685-813f-4cdd-d9ab-7655d20ad8a8"
897
+ },
898
+ "outputs": [
899
+ {
900
+ "data": {
901
+ "text/plain": [
902
+ "[<keras.src.engine.input_layer.InputLayer at 0x7fe97008fc10>,\n",
903
+ " <keras.src.engine.input_layer.InputLayer at 0x7fe969479e10>,\n",
904
+ " <keras.src.layers.rnn.lstm.LSTM at 0x7fe9694a1c10>,\n",
905
+ " <keras.src.layers.rnn.lstm.LSTM at 0x7fe96addda90>,\n",
906
+ " <keras.src.layers.rnn.lstm.LSTM at 0x7fe968d83fd0>,\n",
907
+ " <keras.src.layers.rnn.lstm.LSTM at 0x7fe968d92ad0>,\n",
908
+ " <keras.src.layers.core.dense.Dense at 0x7fe969e64c50>]"
909
+ ]
910
+ },
911
+ "execution_count": 4,
912
+ "metadata": {},
913
+ "output_type": "execute_result"
914
+ }
915
+ ],
916
+ "source": [
917
+ "model.layers"
918
+ ]
919
+ },
920
+ {
921
+ "cell_type": "code",
922
+ "execution_count": 5,
923
+ "metadata": {
924
+ "colab": {
925
+ "base_uri": "https://localhost:8080/"
926
+ },
927
+ "id": "b3RguYBW7xKR",
928
+ "outputId": "1fc1a7d3-e784-4dcb-f802-a9248286cf0d"
929
+ },
930
+ "outputs": [
931
+ {
932
+ "data": {
933
+ "text/plain": [
934
+ "[<KerasTensor: shape=(None, None, 27) dtype=float32 (created by layer 'encoder_inputs')>,\n",
935
+ " <KerasTensor: shape=(None, None, 60) dtype=float32 (created by layer 'decoder_inputs')>]"
936
+ ]
937
+ },
938
+ "execution_count": 5,
939
+ "metadata": {},
940
+ "output_type": "execute_result"
941
+ }
942
+ ],
943
+ "source": [
944
+ "model.input"
945
+ ]
946
+ },
947
+ {
948
+ "cell_type": "code",
949
+ "execution_count": 6,
950
+ "metadata": {
951
+ "executionInfo": {
952
+ "elapsed": 928,
953
+ "status": "ok",
954
+ "timestamp": 1691417039973,
955
+ "user": {
956
+ "displayName": "JOBANPREET SINGH",
957
+ "userId": "15968293240343091979"
958
+ },
959
+ "user_tz": -330
960
+ },
961
+ "id": "87egvtLMTtwo"
962
+ },
963
+ "outputs": [],
964
+ "source": [
965
+ "encoder_inputs = model.input[0] # input_1\n",
966
+ "encoder_lstm_1 = model.layers[2]\n",
967
+ "encoder_outputs_1, h1, c1 = encoder_lstm_1(encoder_inputs)\n",
968
+ "encoder_lstm_2 = model.layers[4]\n",
969
+ "encoder_outputs, h2, c2 = encoder_lstm_2(encoder_outputs_1)\n",
970
+ "encoder_states = [h1, c1, h2, c2]\n",
971
+ "decoder_inputs=model.input[1]\n",
972
+ "\n",
973
+ "out_layer1 = model.layers[3]\n",
974
+ "out_layer2 = model.layers[5]\n",
975
+ "\n",
976
+ "\n",
977
+ "decoder_dense = model.layers[6]"
978
+ ]
979
+ },
980
+ {
981
+ "cell_type": "code",
982
+ "execution_count": 7,
983
+ "metadata": {
984
+ "executionInfo": {
985
+ "elapsed": 1125,
986
+ "status": "ok",
987
+ "timestamp": 1691417043147,
988
+ "user": {
989
+ "displayName": "JOBANPREET SINGH",
990
+ "userId": "15968293240343091979"
991
+ },
992
+ "user_tz": -330
993
+ },
994
+ "id": "R5jt4ZFqogoT"
995
+ },
996
+ "outputs": [],
997
+ "source": [
998
+ "# Reverse-lookup token index to decode sequences back to\n",
999
+ "# something readable.\n",
1000
+ "reverse_input_char_index = dict(\n",
1001
+ " (i, char) for char, i in input_token_index.items())\n",
1002
+ "reverse_target_char_index = dict(\n",
1003
+ " (i, char) for char, i in target_token_index.items())\n",
1004
+ "\n",
1005
+ "\n",
1006
+ "encoder_model = Model(encoder_inputs, encoder_states)\n",
1007
+ "\n",
1008
+ "decoder_state_input_h = Input(shape=(latent_dim,))\n",
1009
+ "decoder_state_input_c = Input(shape=(latent_dim,))\n",
1010
+ "decoder_state_input_h1 = Input(shape=(latent_dim,))\n",
1011
+ "decoder_state_input_c1 = Input(shape=(latent_dim,))\n",
1012
+ "decoder_states_inputs = [decoder_state_input_h, decoder_state_input_c,\n",
1013
+ " decoder_state_input_h1, decoder_state_input_c1]\n",
1014
+ "d_o, state_h, state_c = out_layer1(\n",
1015
+ " decoder_inputs, initial_state=decoder_states_inputs[:2])\n",
1016
+ "d_o, state_h1, state_c1 = out_layer2(\n",
1017
+ " d_o, initial_state=decoder_states_inputs[-2:])\n",
1018
+ "decoder_states = [state_h, state_c, state_h1, state_c1]\n",
1019
+ "decoder_outputs = decoder_dense(d_o)\n",
1020
+ "decoder_model = Model(\n",
1021
+ " [decoder_inputs] + decoder_states_inputs,\n",
1022
+ " [decoder_outputs] + decoder_states)\n",
1023
+ "\n",
1024
+ "\n",
1025
+ "def decode_sequence(input_seq):\n",
1026
+ " # Encode the input as state vectors.\n",
1027
+ " states_value = encoder_model.predict(input_seq)\n",
1028
+ "\n",
1029
+ " # Generate empty target sequence of length 1.\n",
1030
+ " target_seq = np.zeros((1, 1, num_decoder_tokens))\n",
1031
+ " # Populate the first character of target sequence with the start character.\n",
1032
+ " target_seq[0, 0, target_token_index['\\t']] = 1.\n",
1033
+ "\n",
1034
+ " # Sampling loop for a batch of sequences\n",
1035
+ " # (to simplify, here we assume a batch of size 1).\n",
1036
+ " stop_condition = False\n",
1037
+ " decoded_sentence = ''\n",
1038
+ " while not stop_condition:\n",
1039
+ " output_tokens, h, c, h1, c1 = decoder_model.predict(\n",
1040
+ " [target_seq] + states_value) #######NOTICE THE ADDITIONAL HIDDEN STATES\n",
1041
+ "\n",
1042
+ " # Sample a token\n",
1043
+ " sampled_token_index = np.argmax(output_tokens[0, -1, :])\n",
1044
+ "\n",
1045
+ " sampled_char = reverse_target_char_index[sampled_token_index]\n",
1046
+ " decoded_sentence += sampled_char\n",
1047
+ "\n",
1048
+ " # Exit condition: either hit max length\n",
1049
+ " # or find stop character.\n",
1050
+ " if (sampled_char == '\\n' or\n",
1051
+ " len(decoded_sentence) > max_decoder_seq_length):\n",
1052
+ " stop_condition = True\n",
1053
+ "\n",
1054
+ " # Update the target sequence (of length 1).\n",
1055
+ " target_seq = np.zeros((1, 1, num_decoder_tokens))\n",
1056
+ " target_seq[0, 0, sampled_token_index] = 1.\n",
1057
+ "\n",
1058
+ " # Update states\n",
1059
+ " states_value = [h, c, h1, c1]\n",
1060
+ "\n",
1061
+ " return decoded_sentence"
1062
+ ]
1063
+ },
1064
+ {
1065
+ "cell_type": "code",
1066
+ "execution_count": 25,
1067
+ "metadata": {
1068
+ "colab": {
1069
+ "base_uri": "https://localhost:8080/"
1070
+ },
1071
+ "executionInfo": {
1072
+ "elapsed": 2670,
1073
+ "status": "ok",
1074
+ "timestamp": 1691417217198,
1075
+ "user": {
1076
+ "displayName": "JOBANPREET SINGH",
1077
+ "userId": "15968293240343091979"
1078
+ },
1079
+ "user_tz": -330
1080
+ },
1081
+ "id": "xHrMZD5AwpNT",
1082
+ "outputId": "8c32457e-7a4d-4474-e267-85c622434aef"
1083
+ },
1084
+ "outputs": [
1085
+ {
1086
+ "name": "stdout",
1087
+ "output_type": "stream",
1088
+ "text": [
1089
+ "(3, 25, 27)\n",
1090
+ "1/1 [==============================] - 0s 25ms/step\n",
1091
+ "1/1 [==============================] - 0s 20ms/step\n",
1092
+ "1/1 [==============================] - 0s 19ms/step\n",
1093
+ "1/1 [==============================] - 0s 22ms/step\n",
1094
+ "1/1 [==============================] - 0s 21ms/step\n",
1095
+ "1/1 [==============================] - 0s 20ms/step\n",
1096
+ "1/1 [==============================] - 0s 21ms/step\n",
1097
+ "1/1 [==============================] - 0s 19ms/step\n",
1098
+ "1/1 [==============================] - 0s 19ms/step\n",
1099
+ "1/1 [==============================] - 0s 21ms/step\n",
1100
+ "1/1 [==============================] - 0s 21ms/step\n",
1101
+ "1/1 [==============================] - 0s 20ms/step\n",
1102
+ "1/1 [==============================] - 0s 20ms/step\n",
1103
+ "1/1 [==============================] - 0s 27ms/step\n"
1104
+ ]
1105
+ },
1106
+ {
1107
+ "data": {
1108
+ "text/plain": [
1109
+ "['ਤੁਸੀ\\n', 'ਵੇ\\n', 'ਜਾ\\n']"
1110
+ ]
1111
+ },
1112
+ "execution_count": 25,
1113
+ "metadata": {},
1114
+ "output_type": "execute_result"
1115
+ }
1116
+ ],
1117
+ "source": [
1118
+ "s = [\"tusi\",'ve','ja']\n",
1119
+ "\n",
1120
+ "encoder_input_data = np.zeros(\n",
1121
+ " (len(s), max_encoder_seq_length, num_encoder_tokens), dtype=\"float32\"\n",
1122
+ ")\n",
1123
+ "\n",
1124
+ "print(encoder_input_data.shape)\n",
1125
+ "\n",
1126
+ "for i, input_text in enumerate(s):\n",
1127
+ " for t, char in enumerate(input_text):\n",
1128
+ " encoder_input_data[i, t, input_token_index[char]] = 1.0\n",
1129
+ " encoder_input_data[i, t + 1 :, input_token_index[\" \"]] = 1.0\n",
1130
+ "\n",
1131
+ "decoded_sentences = []\n",
1132
+ "for input_data in encoder_input_data:\n",
1133
+ " decoded_sentence = decode_sequence(input_data[np.newaxis, :, :])\n",
1134
+ " decoded_sentences.append(decoded_sentence)\n",
1135
+ "decoded_sentences\n",
1136
+ "\n"
1137
+ ]
1138
+ },
1139
+ {
1140
+ "cell_type": "code",
1141
+ "execution_count": null,
1142
+ "metadata": {
1143
+ "colab": {
1144
+ "base_uri": "https://localhost:8080/"
1145
+ },
1146
+ "id": "loiYIxj6wpS0",
1147
+ "outputId": "f17c8474-2202-4536-f10d-c962ff88c9a2"
1148
+ },
1149
+ "outputs": [
1150
+ {
1151
+ "name": "stdout",
1152
+ "output_type": "stream",
1153
+ "text": [
1154
+ "2.13.0\n"
1155
+ ]
1156
+ }
1157
+ ],
1158
+ "source": [
1159
+ "import tensorflow as tf\n",
1160
+ "print(tf.__version__)"
1161
+ ]
1162
+ },
1163
+ {
1164
+ "cell_type": "code",
1165
+ "execution_count": null,
1166
+ "metadata": {
1167
+ "id": "j0YUpIcxLfbb"
1168
+ },
1169
+ "outputs": [],
1170
+ "source": []
1171
+ }
1172
+ ],
1173
+ "metadata": {
1174
+ "accelerator": "GPU",
1175
+ "colab": {
1176
+ "gpuType": "T4",
1177
+ "provenance": []
1178
+ },
1179
+ "kernelspec": {
1180
+ "display_name": "Python 3 (ipykernel)",
1181
+ "language": "python",
1182
+ "name": "python3"
1183
+ },
1184
+ "language_info": {
1185
+ "codemirror_mode": {
1186
+ "name": "ipython",
1187
+ "version": 3
1188
+ },
1189
+ "file_extension": ".py",
1190
+ "mimetype": "text/x-python",
1191
+ "name": "python",
1192
+ "nbconvert_exporter": "python",
1193
+ "pygments_lexer": "ipython3",
1194
+ "version": "3.11.4"
1195
+ }
1196
+ },
1197
+ "nbformat": 4,
1198
+ "nbformat_minor": 1
1199
+ }
transliteration.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ad0a5556d4fe7c6cf4ca1bbde4369aafd9e1edd176529fcaee1b503ecb3f75f8
3
+ size 16052186