Rend19 commited on
Commit
88d59c5
·
verified ·
1 Parent(s): eb4846c
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip 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
 
 
33
  *.zip 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
+ transformer_keras.keras filter=lfs diff=lfs merge=lfs -text
app.py ADDED
@@ -0,0 +1,237 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import pickle
3
+ import re
4
+ import string
5
+ import tensorflow as tf
6
+ import keras.ops as ops
7
+ import keras
8
+ from keras.saving import register_keras_serializable
9
+ from keras import layers
10
+ from keras.layers import TextVectorization
11
+ from nltk.translate.bleu_score import sentence_bleu, SmoothingFunction
12
+
13
+
14
+ # from gradio_webrtc import WebRTC
15
+ @keras.saving.register_keras_serializable()
16
+ class TextVectorization(keras.layers.TextVectorization):
17
+ pass
18
+ @keras.saving.register_keras_serializable()
19
+ class StringLookup(keras.layers.StringLookup):
20
+ pass
21
+ @keras.saving.register_keras_serializable(package="Transformer")
22
+ class TransformerEncoder(layers.Layer):
23
+ def __init__(self, embed_dim, dense_dim, num_heads, **kwargs):
24
+ super().__init__(**kwargs)
25
+ self.embed_dim = embed_dim
26
+ self.dense_dim = dense_dim
27
+ self.num_heads = num_heads
28
+ self.attention = layers.MultiHeadAttention(
29
+ num_heads=num_heads, key_dim=embed_dim
30
+ )
31
+ self.dense_proj = keras.Sequential(
32
+ [
33
+ layers.Dense(dense_dim, activation="relu"),
34
+ layers.Dense(embed_dim),
35
+ ]
36
+ )
37
+ self.layernorm_1 = layers.LayerNormalization()
38
+ self.layernorm_2 = layers.LayerNormalization()
39
+ self.supports_masking = True
40
+
41
+ def call(self, inputs, mask=None):
42
+ if mask is not None:
43
+ padding_mask = ops.cast(mask[:, None, :], dtype="int32")
44
+ else:
45
+ padding_mask = None
46
+
47
+ attention_output = self.attention(
48
+ query=inputs, value=inputs, key=inputs, attention_mask=padding_mask
49
+ )
50
+ proj_input = self.layernorm_1(inputs + attention_output)
51
+ proj_output = self.dense_proj(proj_input)
52
+ return self.layernorm_2(proj_input + proj_output)
53
+
54
+ def get_config(self):
55
+ config = super().get_config()
56
+ config.update(
57
+ {
58
+ "embed_dim": self.embed_dim,
59
+ "dense_dim": self.dense_dim,
60
+ "num_heads": self.num_heads,
61
+ }
62
+ )
63
+ return config
64
+ @keras.saving.register_keras_serializable(package="Transformer")
65
+ class PositionalEmbedding(layers.Layer):
66
+ def __init__(self, sequence_length, vocab_size, embed_dim, **kwargs):
67
+ super().__init__(**kwargs)
68
+ self.token_embeddings = layers.Embedding(
69
+ input_dim=vocab_size, output_dim=embed_dim
70
+ )
71
+ self.position_embeddings = layers.Embedding(
72
+ input_dim=sequence_length, output_dim=embed_dim
73
+ )
74
+ self.sequence_length = sequence_length
75
+ self.vocab_size = vocab_size
76
+ self.embed_dim = embed_dim
77
+
78
+ def call(self, inputs):
79
+ length = ops.shape(inputs)[-1]
80
+ positions = ops.arange(0, length, 1)
81
+ embedded_tokens = self.token_embeddings(inputs)
82
+ embedded_positions = self.position_embeddings(positions)
83
+ return embedded_tokens + embedded_positions
84
+
85
+ def compute_mask(self, inputs, mask=None):
86
+ return ops.not_equal(inputs, 0)
87
+
88
+ def get_config(self):
89
+ config = super().get_config()
90
+ config.update(
91
+ {
92
+ "sequence_length": self.sequence_length,
93
+ "vocab_size": self.vocab_size,
94
+ "embed_dim": self.embed_dim,
95
+ }
96
+ )
97
+ return config
98
+ @keras.saving.register_keras_serializable(package="Transformer")
99
+ class TransformerDecoder(layers.Layer):
100
+ def __init__(self, embed_dim, latent_dim, num_heads, **kwargs):
101
+ super().__init__(**kwargs)
102
+ self.embed_dim = embed_dim
103
+ self.latent_dim = latent_dim
104
+ self.num_heads = num_heads
105
+ self.attention_1 = layers.MultiHeadAttention(
106
+ num_heads=num_heads, key_dim=embed_dim
107
+ )
108
+ self.attention_2 = layers.MultiHeadAttention(
109
+ num_heads=num_heads, key_dim=embed_dim
110
+ )
111
+ self.dense_proj = keras.Sequential(
112
+ [
113
+ layers.Dense(latent_dim, activation="relu"),
114
+ layers.Dense(embed_dim),
115
+ ]
116
+ )
117
+ self.layernorm_1 = layers.LayerNormalization()
118
+ self.layernorm_2 = layers.LayerNormalization()
119
+ self.layernorm_3 = layers.LayerNormalization()
120
+ self.supports_masking = True
121
+
122
+ def call(self, inputs, mask=None):
123
+ inputs, encoder_outputs = inputs
124
+ causal_mask = self.get_causal_attention_mask(inputs)
125
+
126
+ if mask is None:
127
+ inputs_padding_mask, encoder_outputs_padding_mask = None, None
128
+ else:
129
+ inputs_padding_mask, encoder_outputs_padding_mask = mask
130
+
131
+ attention_output_1 = self.attention_1(
132
+ query=inputs,
133
+ value=inputs,
134
+ key=inputs,
135
+ attention_mask=causal_mask,
136
+ query_mask=inputs_padding_mask,
137
+ )
138
+ out_1 = self.layernorm_1(inputs + attention_output_1)
139
+
140
+ attention_output_2 = self.attention_2(
141
+ query=out_1,
142
+ value=encoder_outputs,
143
+ key=encoder_outputs,
144
+ query_mask=inputs_padding_mask,
145
+ key_mask=encoder_outputs_padding_mask,
146
+ )
147
+ out_2 = self.layernorm_2(out_1 + attention_output_2)
148
+
149
+ proj_output = self.dense_proj(out_2)
150
+ return self.layernorm_3(out_2 + proj_output)
151
+
152
+ def get_causal_attention_mask(self, inputs):
153
+ input_shape = ops.shape(inputs)
154
+ batch_size, sequence_length = input_shape[0], input_shape[1]
155
+ i = ops.arange(sequence_length)[:, None]
156
+ j = ops.arange(sequence_length)
157
+ mask = ops.cast(i >= j, dtype="int32")
158
+ mask = ops.reshape(mask, (1, input_shape[1], input_shape[1]))
159
+ mult = ops.concatenate(
160
+ [ops.expand_dims(batch_size, -1), ops.convert_to_tensor([1, 1])],
161
+ axis=0,
162
+ )
163
+ return ops.tile(mask, mult)
164
+
165
+ def get_config(self):
166
+ config = super().get_config()
167
+ config.update(
168
+ {
169
+ "embed_dim": self.embed_dim,
170
+ "latent_dim": self.latent_dim,
171
+ "num_heads": self.num_heads,
172
+ }
173
+ )
174
+ return config
175
+
176
+ with open("id_vectorization_transformer.pickle", "rb") as file:
177
+ from_disk = pickle.load(file)
178
+ id_vectorization = TextVectorization.from_config(from_disk['config'])
179
+ id_vectorization.adapt(tf.data.Dataset.from_tensor_slices(["xyz"]))
180
+ id_vectorization.set_weights(from_disk['weights'])
181
+ id_vectorization.set_vocabulary(from_disk["vocab"])
182
+ with open("en_vectorization_transformer.pickle", "rb") as file:
183
+ from_disk = pickle.load(file)
184
+ en_vectorization = TextVectorization.from_config(from_disk['config'])
185
+ en_vectorization.adapt(tf.data.Dataset.from_tensor_slices(["xyz"]))
186
+ en_vectorization.set_weights(from_disk['weights'])
187
+ en_vectorization.set_vocabulary(from_disk["vocab"])
188
+
189
+
190
+ transformer = keras.models.load_model(
191
+ "transformer_keras.keras",
192
+ custom_objects={"TransformerEncoder": TransformerEncoder, "TransformerDecoder": TransformerDecoder, "PositionalEmbedding": PositionalEmbedding}
193
+ )
194
+
195
+
196
+ id_vocab = id_vectorization.get_vocabulary()
197
+ id_index_lookup = dict(zip(range(len(id_vocab)), id_vocab))
198
+ max_decoded_sentence_lenth = 20
199
+ smoothing_function = SmoothingFunction().method2
200
+
201
+ def decode_sequence(input_sentence):
202
+ tokenized_input_sentence = en_vectorization([input_sentence])
203
+ decoded_sentence = "[start]"
204
+ for i in range(max_decoded_sentence_lenth):
205
+ tokenized_target_sentence = id_vectorization([decoded_sentence])[:, :-1]
206
+ predictions = transformer(
207
+ {
208
+ "encoder_inputs": tokenized_input_sentence,
209
+ "decoder_inputs": tokenized_target_sentence,
210
+ }
211
+ )
212
+
213
+ sampled_token_index = ops.convert_to_numpy(
214
+ ops.argmax(predictions[0, i, :])
215
+ ).item(0)
216
+ sampled_token = id_index_lookup[sampled_token_index]
217
+ decoded_sentence += " " + sampled_token
218
+ if sampled_token == "end":
219
+ break
220
+ return decoded_sentence.replace("[start]", "").replace("end", "").trim()
221
+
222
+ # image = WebRTC(label="Stream")
223
+
224
+ desc=("<h2>This is a simple English to Indonesian translator app using transformer for our final Deep Learning Project.</h2>" +
225
+ "<br/> <h3 style='font-weight: bold'>Team Members:</h3>"+
226
+ "<br/> <ul> <li>2602082452 - Rendy Susanto</li>" +
227
+ "<li>2602082452 - Rendy Susanto</li></ul>")
228
+
229
+ demo = gr.Interface(
230
+ fn=decode_sequence,
231
+ inputs=gr.Textbox(label="Please input your text (English):"),
232
+ outputs=gr.Textbox(label="Output (Indonesian):"),
233
+ title="English To Indonesian Translator",
234
+ description=desc
235
+ )
236
+
237
+ demo.launch(share=True)
en_vectorization_transformer.pickle ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:46c2906b48f4af6d5b7dacbba8f3e85066065949607a2fddf682eb2f07f6ff72
3
+ size 278662
id_vectorization_transformer.pickle ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:284135ac38f75df7f6fbfc95c073f937d6e7276b0c3f75d0bb14e90b95f1881f
3
+ size 357048
transformer_keras.keras ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7da418677fffa2e5326f8eb417700ee5642530bfcee180d63ac5daf3e2136b15
3
+ size 185060536