wpvnteam ntt123 commited on
Commit
b8bd0b0
0 Parent(s):

Duplicate from ntt123/handwriting

Browse files

Co-authored-by: Thông Nguyễn <ntt123@users.noreply.huggingface.co>

Files changed (7) hide show
  1. .gitattributes +27 -0
  2. README.md +12 -0
  3. index.html +244 -0
  4. model_weights.js +48 -0
  5. script.js +226 -0
  6. style.css +82 -0
  7. weights.bin +3 -0
.gitattributes ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ftz filter=lfs diff=lfs merge=lfs -text
6
+ *.gz filter=lfs diff=lfs merge=lfs -text
7
+ *.h5 filter=lfs diff=lfs merge=lfs -text
8
+ *.joblib filter=lfs diff=lfs merge=lfs -text
9
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
10
+ *.model filter=lfs diff=lfs merge=lfs -text
11
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
12
+ *.onnx filter=lfs diff=lfs merge=lfs -text
13
+ *.ot filter=lfs diff=lfs merge=lfs -text
14
+ *.parquet filter=lfs diff=lfs merge=lfs -text
15
+ *.pb filter=lfs diff=lfs merge=lfs -text
16
+ *.pt filter=lfs diff=lfs merge=lfs -text
17
+ *.pth filter=lfs diff=lfs merge=lfs -text
18
+ *.rar filter=lfs diff=lfs merge=lfs -text
19
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
20
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
21
+ *.tflite filter=lfs diff=lfs merge=lfs -text
22
+ *.tgz filter=lfs diff=lfs merge=lfs -text
23
+ *.wasm filter=lfs diff=lfs merge=lfs -text
24
+ *.xz filter=lfs diff=lfs merge=lfs -text
25
+ *.zip filter=lfs diff=lfs merge=lfs -text
26
+ *.zstandard filter=lfs diff=lfs merge=lfs -text
27
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Handwriting
3
+ emoji: 🌍
4
+ colorFrom: red
5
+ colorTo: pink
6
+ sdk: static
7
+ pinned: false
8
+ license: cc-by-nc-4.0
9
+ duplicated_from: ntt123/handwriting
10
+ ---
11
+
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces#reference
index.html ADDED
@@ -0,0 +1,244 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <meta name="viewport" content="width=device-width">
7
+ <title>English Online Handwriting</title>
8
+ <link href="/style.css" rel="stylesheet" type="text/css" />
9
+ <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"></script>
10
+ <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm/dist/tf-backend-wasm.js"></script>
11
+ <script src="model_weights.js"></script>
12
+ <script src="script.js"></script>
13
+ </head>
14
+
15
+ <body>
16
+ <input placeholder="Input your text here" id="user-input"/>
17
+ <select id="writers" name="writers">
18
+ <option value="0"> Writer 0</option>
19
+ <option value="1"> Writer 1</option>
20
+ <option value="2"> Writer 2</option>
21
+ <option value="3"> Writer 3</option>
22
+ <option value="4"> Writer 4</option>
23
+ <option value="5"> Writer 5</option>
24
+ <option value="6"> Writer 6</option>
25
+ <option value="7"> Writer 7</option>
26
+ <option value="8"> Writer 8</option>
27
+ <option value="9"> Writer 9</option>
28
+ <option value="10"> Writer 10</option>
29
+ <option value="11"> Writer 11</option>
30
+ <option value="12"> Writer 12</option>
31
+ <option value="13"> Writer 13</option>
32
+ <option value="14"> Writer 14</option>
33
+ <option value="15"> Writer 15</option>
34
+ <option value="16"> Writer 16</option>
35
+ <option value="17"> Writer 17</option>
36
+ <option value="18"> Writer 18</option>
37
+ <option value="19"> Writer 19</option>
38
+ <option value="20"> Writer 20</option>
39
+ <option value="21"> Writer 21</option>
40
+ <option value="22"> Writer 22</option>
41
+ <option value="23"> Writer 23</option>
42
+ <option value="24"> Writer 24</option>
43
+ <option value="25"> Writer 25</option>
44
+ <option value="26"> Writer 26</option>
45
+ <option value="27"> Writer 27</option>
46
+ <option value="28"> Writer 28</option>
47
+ <option value="29"> Writer 29</option>
48
+ <option value="30"> Writer 30</option>
49
+ <option value="31"> Writer 31</option>
50
+ <option value="32"> Writer 32</option>
51
+ <option value="33"> Writer 33</option>
52
+ <option value="34"> Writer 34</option>
53
+ <option value="35"> Writer 35</option>
54
+ <option value="36"> Writer 36</option>
55
+ <option value="37"> Writer 37</option>
56
+ <option value="38"> Writer 38</option>
57
+ <option value="39"> Writer 39</option>
58
+ <option value="40"> Writer 40</option>
59
+ <option value="41"> Writer 41</option>
60
+ <option value="42"> Writer 42</option>
61
+ <option value="43"> Writer 43</option>
62
+ <option value="44"> Writer 44</option>
63
+ <option value="45"> Writer 45</option>
64
+ <option value="46"> Writer 46</option>
65
+ <option value="47"> Writer 47</option>
66
+ <option value="48"> Writer 48</option>
67
+ <option value="49"> Writer 49</option>
68
+ <option value="50"> Writer 50</option>
69
+ <option value="51"> Writer 51</option>
70
+ <option value="52"> Writer 52</option>
71
+ <option value="53"> Writer 53</option>
72
+ <option value="54"> Writer 54</option>
73
+ <option value="55"> Writer 55</option>
74
+ <option value="56"> Writer 56</option>
75
+ <option value="57"> Writer 57</option>
76
+ <option value="58"> Writer 58</option>
77
+ <option value="59"> Writer 59</option>
78
+ <option value="60"> Writer 60</option>
79
+ <option value="61"> Writer 61</option>
80
+ <option value="62"> Writer 62</option>
81
+ <option value="63"> Writer 63</option>
82
+ <option value="64"> Writer 64</option>
83
+ <option value="65"> Writer 65</option>
84
+ <option value="66"> Writer 66</option>
85
+ <option value="67"> Writer 67</option>
86
+ <option value="68"> Writer 68</option>
87
+ <option value="69"> Writer 69</option>
88
+ <option value="70"> Writer 70</option>
89
+ <option value="71"> Writer 71</option>
90
+ <option value="72"> Writer 72</option>
91
+ <option value="73"> Writer 73</option>
92
+ <option value="74"> Writer 74</option>
93
+ <option value="75"> Writer 75</option>
94
+ <option value="76"> Writer 76</option>
95
+ <option value="77"> Writer 77</option>
96
+ <option value="78"> Writer 78</option>
97
+ <option value="79"> Writer 79</option>
98
+ <option value="80"> Writer 80</option>
99
+ <option value="81"> Writer 81</option>
100
+ <option value="82"> Writer 82</option>
101
+ <option value="83"> Writer 83</option>
102
+ <option value="84"> Writer 84</option>
103
+ <option value="85"> Writer 85</option>
104
+ <option value="86"> Writer 86</option>
105
+ <option value="87"> Writer 87</option>
106
+ <option value="88"> Writer 88</option>
107
+ <option value="89"> Writer 89</option>
108
+ <option value="90"> Writer 90</option>
109
+ <option value="91"> Writer 91</option>
110
+ <option value="92"> Writer 92</option>
111
+ <option value="93"> Writer 93</option>
112
+ <option value="94"> Writer 94</option>
113
+ <option value="95"> Writer 95</option>
114
+ <option value="96"> Writer 96</option>
115
+ <option value="97"> Writer 97</option>
116
+ <option value="98"> Writer 98</option>
117
+ <option value="99"> Writer 99</option>
118
+ <option value="100"> Writer 100</option>
119
+ <option value="101"> Writer 101</option>
120
+ <option value="102"> Writer 102</option>
121
+ <option value="103"> Writer 103</option>
122
+ <option value="104"> Writer 104</option>
123
+ <option value="105"> Writer 105</option>
124
+ <option value="106"> Writer 106</option>
125
+ <option value="107"> Writer 107</option>
126
+ <option value="108"> Writer 108</option>
127
+ <option value="109"> Writer 109</option>
128
+ <option value="110"> Writer 110</option>
129
+ <option value="111"> Writer 111</option>
130
+ <option value="112"> Writer 112</option>
131
+ <option value="113"> Writer 113</option>
132
+ <option value="114"> Writer 114</option>
133
+ <option value="115"> Writer 115</option>
134
+ <option value="116"> Writer 116</option>
135
+ <option value="117"> Writer 117</option>
136
+ <option value="118"> Writer 118</option>
137
+ <option value="119"> Writer 119</option>
138
+ <option value="120"> Writer 120</option>
139
+ <option value="121"> Writer 121</option>
140
+ <option value="122"> Writer 122</option>
141
+ <option value="123"> Writer 123</option>
142
+ <option value="124"> Writer 124</option>
143
+ <option value="125"> Writer 125</option>
144
+ <option value="126"> Writer 126</option>
145
+ <option value="127"> Writer 127</option>
146
+ <option value="128"> Writer 128</option>
147
+ <option value="129"> Writer 129</option>
148
+ <option value="130"> Writer 130</option>
149
+ <option value="131"> Writer 131</option>
150
+ <option value="132"> Writer 132</option>
151
+ <option value="133"> Writer 133</option>
152
+ <option value="134"> Writer 134</option>
153
+ <option value="135"> Writer 135</option>
154
+ <option value="136"> Writer 136</option>
155
+ <option value="137"> Writer 137</option>
156
+ <option value="138"> Writer 138</option>
157
+ <option value="139"> Writer 139</option>
158
+ <option value="140"> Writer 140</option>
159
+ <option value="141"> Writer 141</option>
160
+ <option value="142"> Writer 142</option>
161
+ <option value="143"> Writer 143</option>
162
+ <option value="144"> Writer 144</option>
163
+ <option value="145"> Writer 145</option>
164
+ <option value="146"> Writer 146</option>
165
+ <option value="147"> Writer 147</option>
166
+ <option value="148"> Writer 148</option>
167
+ <option value="149"> Writer 149</option>
168
+ <option value="150"> Writer 150</option>
169
+ <option value="151"> Writer 151</option>
170
+ <option value="152"> Writer 152</option>
171
+ <option value="153"> Writer 153</option>
172
+ <option value="154"> Writer 154</option>
173
+ <option value="155"> Writer 155</option>
174
+ <option value="156"> Writer 156</option>
175
+ <option value="157"> Writer 157</option>
176
+ <option value="158"> Writer 158</option>
177
+ <option value="159"> Writer 159</option>
178
+ <option value="160"> Writer 160</option>
179
+ <option value="161"> Writer 161</option>
180
+ <option value="162"> Writer 162</option>
181
+ <option value="163"> Writer 163</option>
182
+ <option value="164"> Writer 164</option>
183
+ <option value="165"> Writer 165</option>
184
+ <option value="166"> Writer 166</option>
185
+ <option value="167"> Writer 167</option>
186
+ <option value="168"> Writer 168</option>
187
+ <option value="169"> Writer 169</option>
188
+ <option value="170"> Writer 170</option>
189
+ <option value="171"> Writer 171</option>
190
+ <option value="172"> Writer 172</option>
191
+ <option value="173"> Writer 173</option>
192
+ <option value="174"> Writer 174</option>
193
+ <option value="175"> Writer 175</option>
194
+ <option value="176"> Writer 176</option>
195
+ <option value="177"> Writer 177</option>
196
+ <option value="178"> Writer 178</option>
197
+ <option value="179"> Writer 179</option>
198
+ <option value="180"> Writer 180</option>
199
+ <option value="181"> Writer 181</option>
200
+ <option value="182"> Writer 182</option>
201
+ <option value="183"> Writer 183</option>
202
+ <option value="184"> Writer 184</option>
203
+ <option value="185"> Writer 185</option>
204
+ <option value="186"> Writer 186</option>
205
+ <option value="187"> Writer 187</option>
206
+ <option value="188"> Writer 188</option>
207
+ <option value="189"> Writer 189</option>
208
+ <option value="190"> Writer 190</option>
209
+ <option value="191"> Writer 191</option>
210
+ <option value="192"> Writer 192</option>
211
+ <option value="193"> Writer 193</option>
212
+ <option value="194"> Writer 194</option>
213
+ <option value="195"> Writer 195</option>
214
+ <option value="196"> Writer 196</option>
215
+ <option value="197"> Writer 197</option>
216
+ <option value="198"> Writer 198</option>
217
+ <option value="199"> Writer 199</option>
218
+ <option value="200"> Writer 200</option>
219
+ <option value="201"> Writer 201</option>
220
+ <option value="202"> Writer 202</option>
221
+ <option value="203"> Writer 203</option>
222
+ <option value="204"> Writer 204</option>
223
+ <option value="205"> Writer 205</option>
224
+ <option value="206"> Writer 206</option>
225
+ <option value="207"> Writer 207</option>
226
+ <option value="208"> Writer 208</option>
227
+ <option value="209"> Writer 209</option>
228
+ <option value="210"> Writer 210</option>
229
+ <option value="211"> Writer 211</option>
230
+ <option value="212"> Writer 212</option>
231
+ <option value="213"> Writer 213</option>
232
+ <option value="214"> Writer 214</option>
233
+ <option value="215"> Writer 215</option>
234
+ <option value="216"> Writer 216</option>
235
+ <option value="217"> Writer 217</option>
236
+ <option value="218"> Writer 218</option>
237
+ <option value="250">Writer 250</option>
238
+ </select>
239
+ <input id="bias" type="range" min="0" max="100" value="70">
240
+ <button style="margin-left:20px;" class="button button2" id="btn" class="button7" disabled onclick="generate()">Loading model...</button>
241
+ <canvas id="hw-canvas">
242
+ </canvas>
243
+ </body>
244
+ </html>
model_weights.js ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var oReq = new XMLHttpRequest();
2
+ oReq.open("GET", "weights.bin", true);
3
+ oReq.responseType = "arraybuffer";
4
+
5
+ var weights_meta={'rnn/~/conv1_d__b': [[0, 73], [73]], 'rnn/~/conv1_d__w': [[73, 26718], [5, 73, 73]], 'rnn/~/embed__embeddings': [[26718, 64094], [512, 73]], 'rnn/~/embed_1__embeddings': [[64094, 69423], [73, 73]], 'rnn/~/linear__b': [[69423, 69454], [31]], 'rnn/~/linear__w': [[69454, 85326], [512, 31]], 'rnn/~/lstm_attention_core/~/gru__b': [[85326, 86862], [1536]], 'rnn/~/lstm_attention_core/~/gru__w_h': [[86862, 873294], [512, 1536]], 'rnn/~/lstm_attention_core/~/gru__w_i': [[873294, 990030], [76, 1536]], 'rnn/~/lstm_attention_core/~/gru_1__b': [[990030, 991566], [1536]], 'rnn/~/lstm_attention_core/~/gru_1__w_h': [[991566, 1777998], [512, 1536]], 'rnn/~/lstm_attention_core/~/gru_1__w_i': [[1777998, 2681166], [588, 1536]], 'rnn/~/lstm_attention_core/~/linear__b': [[2681166, 2681169], [3]], 'rnn/~/lstm_attention_core/~/linear__w': [[2681169, 2682933], [588, 3]]};
6
+
7
+ var WEIGHTS = {};
8
+ var weight_buffer = null;
9
+ var W = null;
10
+ var w32 = null;
11
+ var w16 = null;
12
+
13
+ oReq.onload = function (oEvent) {
14
+ var arrayBuffer = oReq.response; // Note: not oReq.responseText
15
+ if (arrayBuffer) {
16
+ // convert bfloat16 to float32
17
+ // w16 = new Uint16Array(arrayBuffer)
18
+ // weight_buffer = new SharedArrayBuffer(2*arrayBuffer.byteLength);
19
+ // w32 = new Uint16Array(weight_buffer);
20
+ // for(var i=0; i < w16.length; i++) {
21
+ // w32[i * 2 + 1] = w16[i];
22
+ // }
23
+ W = new Float32Array(arrayBuffer);
24
+ document.getElementById("btn").innerText = "Buffer arrieved";
25
+
26
+ for(var k in weights_meta) {
27
+ info = weights_meta[k];
28
+ offset = info[0];
29
+ shape = info[1];
30
+ WEIGHTS[k] = tf.tensor(W.subarray(offset[0], offset[1]), shape);
31
+ }
32
+
33
+ document.getElementById("btn").disabled = false;
34
+ tf.engine().startScope();
35
+ setTimeout(function() {
36
+ cur_run = cur_run + 1;
37
+ dojob(cur_run);
38
+ }, 0);
39
+
40
+ document.getElementById("btn").innerText = "Generate";
41
+ }
42
+ };
43
+
44
+ tf.setBackend('wasm');
45
+ tf.ready().then( function() {
46
+ tf.enableProdMode();
47
+ oReq.send(null);
48
+ });
script.js ADDED
@@ -0,0 +1,226 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var log = console.log;
2
+ var ctx = null;
3
+ var canvas = null;
4
+ var RNN_SIZE = 512;
5
+ var cur_run = 0;
6
+
7
+ var randn = function() {
8
+ // Standard Normal random variable using Box-Muller transform.
9
+ var u = Math.random() * 0.999 + 1e-5;
10
+ var v = Math.random() * 0.999 + 1e-5;
11
+ return Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v);
12
+ }
13
+
14
+ var rand_truncated_normal = function(low, high) {
15
+ while (true) {
16
+ r = randn();
17
+ if (r >= low && r <= high)
18
+ break;
19
+ // rejection sampling.
20
+ }
21
+ return r;
22
+ }
23
+
24
+ var softplus = function(x) {
25
+ const m = tf.maximum(x, 0.0);
26
+ return tf.add(m, tf.log(tf.add(tf.exp(tf.neg(m)), tf.exp(tf.sub(x, m)))));
27
+ }
28
+
29
+
30
+ var char2idx = {'\x00': 0, ' ': 1, '!': 2, '"': 3, '#': 4, "'": 5, '(': 6, ')': 7, ',': 8, '-': 9, '.': 10, '0': 11, '1': 12, '2': 13, '3': 14, '4': 15, '5': 16, '6': 17, '7': 18, '8': 19, '9': 20, ':': 21, ';': 22, '?': 23, 'A': 24, 'B': 25, 'C': 26, 'D': 27, 'E': 28, 'F': 29, 'G': 30, 'H': 31, 'I': 32, 'J': 33, 'K': 34, 'L': 35, 'M': 36, 'N': 37, 'O': 38, 'P': 39, 'R': 40, 'S': 41, 'T': 42, 'U': 43, 'V': 44, 'W': 45, 'Y': 46, 'a': 47, 'b': 48, 'c': 49, 'd': 50, 'e': 51, 'f': 52, 'g': 53, 'h': 54, 'i': 55, 'j': 56, 'k': 57, 'l': 58, 'm': 59, 'n': 60, 'o': 61, 'p': 62, 'q': 63, 'r': 64, 's': 65, 't': 66, 'u': 67, 'v': 68, 'w': 69, 'x': 70, 'y': 71, 'z': 72};
31
+
32
+ var gru_core = function(input, weights, state, hidden_size) {
33
+ var [w_h,w_i,b] = weights;
34
+ var [w_h_z,w_h_a] = tf.split(w_h, [2 * hidden_size, hidden_size], 1);
35
+ var [b_z,b_a] = tf.split(b, [2 * hidden_size, hidden_size], 0);
36
+ gates_x = tf.matMul(input, w_i);
37
+ [zr_x,a_x] = tf.split(gates_x, [2 * hidden_size, hidden_size], 1);
38
+ zr_h = tf.matMul(state, w_h_z);
39
+ zr = tf.add(tf.add(zr_x, zr_h), b_z);
40
+ // fix this
41
+ [z,r] = tf.split(tf.sigmoid(zr), 2, 1);
42
+ a_h = tf.matMul(tf.mul(r, state), w_h_a);
43
+ a = tf.tanh(tf.add(tf.add(a_x, a_h), b_a));
44
+ next_state = tf.add(tf.mul(tf.sub(1., z), state), tf.mul(z, a));
45
+ return [next_state, next_state];
46
+ };
47
+
48
+
49
+ var generate = function() {
50
+ cur_run = cur_run + 1;
51
+ setTimeout(function() {
52
+ var counter = 2000;
53
+ tf.disposeVariables();
54
+
55
+ tf.engine().startScope();
56
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
57
+ ctx.beginPath();
58
+ dojob(cur_run);
59
+ }, 200);
60
+
61
+ return false;
62
+ }
63
+
64
+ var dojob = function(run_id) {
65
+ var text = document.getElementById("user-input").value;
66
+ if (text.length == 0) {
67
+ text = "The quick brown fox jumps over the lazy dog";
68
+ }
69
+
70
+ var cur_x = 50.;
71
+ var cur_y = 300.;
72
+
73
+
74
+ log(text);
75
+ original_text = text;
76
+ text = '' + text + ' ' + text;
77
+
78
+ text = Array.from(text).map(function(e) {
79
+ return char2idx[e]
80
+ })
81
+ var text_embed = WEIGHTS['rnn/~/embed_1__embeddings'];
82
+ indices = tf.tensor1d(text, 'int32');
83
+ text = text_embed.gather(indices);
84
+
85
+ filter = WEIGHTS['rnn/~/conv1_d__w'];
86
+ embed = tf.conv1d(text, filter, 1, 'same');
87
+ bias = tf.expandDims(WEIGHTS['rnn/~/conv1_d__b'], 0);
88
+ embed = tf.add(embed, bias);
89
+
90
+ var writer_embed = WEIGHTS['rnn/~/embed__embeddings'];
91
+ var e = document.getElementById("writers");
92
+ var wid = parseInt(e.value);
93
+ // log(wid);
94
+
95
+ wid = tf.tensor1d([wid], 'int32');
96
+ wid = writer_embed.gather(wid);
97
+ embed = tf.add(wid, embed);
98
+
99
+ // initial state
100
+ var gru0_hx = tf.zeros([1, RNN_SIZE]);
101
+ var gru1_hx = tf.zeros([1, RNN_SIZE]);
102
+ // var gru2_hx = tf.zeros([1, RNN_SIZE]);
103
+
104
+ var att_location = tf.zeros([1, 1]);
105
+ var att_context = tf.zeros([1, 73]);
106
+
107
+ var input = tf.tensor([[0., 0., 1.]]);
108
+
109
+ gru0_w_h = WEIGHTS['rnn/~/lstm_attention_core/~/gru__w_h'];
110
+ gru0_w_i = WEIGHTS['rnn/~/lstm_attention_core/~/gru__w_i'];
111
+ gru0_bias = WEIGHTS['rnn/~/lstm_attention_core/~/gru__b'];
112
+
113
+ gru1_w_h = WEIGHTS['rnn/~/lstm_attention_core/~/gru_1__w_h'];
114
+ gru1_w_i = WEIGHTS['rnn/~/lstm_attention_core/~/gru_1__w_i'];
115
+ gru1_bias = WEIGHTS['rnn/~/lstm_attention_core/~/gru_1__b'];
116
+ att_w = WEIGHTS['rnn/~/lstm_attention_core/~/linear__w'];
117
+ att_b = WEIGHTS['rnn/~/lstm_attention_core/~/linear__b'];
118
+ gmm_w = WEIGHTS['rnn/~/linear__w'];
119
+ gmm_b = WEIGHTS['rnn/~/linear__b'];
120
+
121
+ ruler = tf.tensor([...Array(text.shape[0]).keys()]);
122
+ var bias = parseInt(document.getElementById("bias").value) / 100 * 3;
123
+
124
+ cur_x = 50.;
125
+ cur_y = 400.;
126
+ var path = [];
127
+ var dx = 0.;
128
+ var dy = 0;
129
+ var eos = 1.;
130
+ var counter = 0;
131
+
132
+
133
+ function loop(my_run_id) {
134
+ if (my_run_id < cur_run) {
135
+ tf.disposeVariables();
136
+ tf.engine().endScope();
137
+ return;
138
+ }
139
+
140
+ counter++;
141
+ if (counter < 2000) {
142
+ [att_location,att_context,gru0_hx,gru1_hx,input] = tf.tidy(function() {
143
+ // Attention
144
+ const inp_0 = tf.concat([att_context, input], 1);
145
+ gru0_hx_ = gru0_hx;
146
+ [out_0,gru0_hx] = gru_core(inp_0, [gru0_w_h, gru0_w_i, gru0_bias], gru0_hx, RNN_SIZE);
147
+ tf.dispose(gru0_hx_);
148
+ const att_inp = tf.concat([att_context, input, out_0], 1);
149
+ const att_params = tf.add(tf.matMul(att_inp, att_w), att_b);
150
+ [alpha,beta,kappa] = tf.split(softplus(att_params), 3, 1);
151
+ att_location_ = att_location;
152
+ att_location = tf.add(att_location, tf.div(kappa, 25.));
153
+ tf.dispose(att_location_)
154
+
155
+ const phi = tf.mul(alpha, tf.exp(tf.div(tf.neg(tf.square(tf.sub(att_location, ruler))), beta)));
156
+ att_context_ = att_context;
157
+ att_context = tf.sum(tf.mul(tf.expandDims(phi, 2), tf.expandDims(embed, 0)), 1)
158
+ tf.dispose(att_context_);
159
+
160
+ const inp_1 = tf.concat([input, out_0, att_context], 1);
161
+ tf.dispose(input);
162
+ gru1_hx_ = gru1_hx;
163
+ [out_1,gru1_hx] = gru_core(inp_1, [gru1_w_h, gru1_w_i, gru1_bias], gru1_hx, RNN_SIZE);
164
+ tf.dispose(gru1_hx_);
165
+
166
+ // GMM
167
+ const gmm_params = tf.add(tf.matMul(out_1, gmm_w), gmm_b);
168
+ [x,y,logstdx,logstdy,angle,log_weight,eos_logit] = tf.split(gmm_params, [5, 5, 5, 5, 5, 5, 1], 1);
169
+ // log_weight = tf.softmax(log_weight, 1);
170
+ // log_weight = tf.log(log_weight);
171
+ // log_weight = tf.mul(log_weight, 1. + bias);
172
+ // const idx = tf.multinomial(log_weight, 1).dataSync()[0];
173
+ // log_weight = tf.softmax(log_weight, 1);
174
+ // log_weight = tf.log(log_weight);
175
+ // log_weight = tf.mul(log_weight, 1. + bias);
176
+ const idx = tf.argMax(log_weight, 1).dataSync()[0];
177
+
178
+ x = x.dataSync()[idx];
179
+ y = y.dataSync()[idx];
180
+ const stdx = tf.exp(tf.sub(logstdx, bias)).dataSync()[idx];
181
+ const stdy = tf.exp(tf.sub(logstdy, bias)).dataSync()[idx];
182
+ angle = angle.dataSync()[idx];
183
+ e = tf.sigmoid(tf.mul(eos_logit, (1. + 0.*bias))).dataSync()[0];
184
+ const rx = rand_truncated_normal(-5, 5) * stdx;
185
+ const ry = rand_truncated_normal(-5, 5) * stdy;
186
+ x = x + Math.cos(-angle) * rx - Math.sin(-angle) * ry;
187
+ y = y + Math.sin(-angle) * rx + Math.cos(-angle) * ry;
188
+ if (Math.random() < e) {
189
+ e = 1.;
190
+ } else {
191
+ e = 0.;
192
+ }
193
+ input = tf.tensor([[x, y, e]]);
194
+ return [att_location, att_context, gru0_hx, gru1_hx, input];
195
+ });
196
+
197
+ [dx,dy,eos_] = input.dataSync();
198
+ dy = -dy * 3;
199
+ dx = dx * 3;
200
+ if (eos == 0.) {
201
+ ctx.beginPath();
202
+ ctx.moveTo(cur_x, cur_y, 0, 0);
203
+ ctx.lineTo(cur_x + dx, cur_y + dy);
204
+ ctx.stroke();
205
+ }
206
+ eos = eos_;
207
+ cur_x = cur_x + dx;
208
+ cur_y = cur_y + dy;
209
+
210
+ if (att_location.dataSync()[0] < original_text.length + 2) {
211
+ setTimeout(function() {loop(my_run_id);}, 0);
212
+ }
213
+ }
214
+ }
215
+
216
+ loop(run_id);
217
+ }
218
+
219
+ window.onload = function(e) {
220
+ //Setting up canvas
221
+ canvas = document.getElementById("hw-canvas");
222
+ ctx = canvas.getContext("2d");
223
+ ctx.canvas.width = window.innerWidth- 50;
224
+ ctx.canvas.height = window.innerHeight - 50;
225
+
226
+ }
style.css ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ * {
2
+ box-sizing: border-box;
3
+ }
4
+
5
+ html, body {
6
+ margin: 0 !important;
7
+ padding: 0 !important;
8
+ overflow: hidden;
9
+ }
10
+
11
+ #hw-canvas {
12
+ position:fixed;
13
+ left:0;
14
+ top:0;
15
+ width:100%;
16
+ height:100%;
17
+ z-index: -1;
18
+ }
19
+
20
+ #user-input {
21
+ padding: 5px;
22
+ margin: 20px 20px 20px 20px;
23
+ height: 50px;
24
+ font-size: 25px;
25
+ line-height: 40px;
26
+ border: gray solid 0.2ch;
27
+ width: calc(100% - 40px);
28
+ }
29
+
30
+ #bias {
31
+ margin-left: 20px;
32
+ display: inline;
33
+ }
34
+ #writers {
35
+ display: inline;
36
+ margin-left: 20px;
37
+ height: 40px;
38
+ border: #008CBA solid 0.3ch;
39
+ margin-bottom: 20px;
40
+ }
41
+ /* #btn {
42
+
43
+ height: 50px;
44
+ border: gray solid 0.1ch;
45
+ background-color: red;
46
+ } */
47
+
48
+ .button {
49
+ margin-left: 20px;
50
+ border: none;
51
+ color: white;
52
+ padding: 16px 32px;
53
+ text-align: center;
54
+ text-decoration: none;
55
+ display: inline;
56
+ font-size: 16px;
57
+ margin: 4px 2px;
58
+ transition-duration: 0.4s;
59
+ cursor: pointer;
60
+ }
61
+
62
+ .button1 {
63
+ background-color: white;
64
+ color: black;
65
+ border: 2px solid #4CAF50;
66
+ }
67
+
68
+ .button1:hover {
69
+ background-color: #4CAF50;
70
+ color: white;
71
+ }
72
+
73
+ .button2 {
74
+ background-color: white;
75
+ color: black;
76
+ border: 2px solid #008CBA;
77
+ }
78
+
79
+ .button2:hover {
80
+ background-color: #008CBA;
81
+ color: white;
82
+ }
weights.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f7fc4afc0434dc35045bb65fec7b9640541067a4969cfcce917fdd6cf59773d8
3
+ size 10731732