(layers, layerNumber, nodeKey)
| 2090 | var leakyReluAlpha = this.leakyReluAlpha; |
| 2091 | var needsVar = false; |
| 2092 | function nodeHandle(layers, layerNumber, nodeKey) { |
| 2093 | if (layerNumber === 0) { |
| 2094 | return typeof nodeKey === 'string' ? 'input[\'' + nodeKey + '\']' : 'input[' + nodeKey + ']'; |
| 2095 | } |
| 2096 | |
| 2097 | var layer = layers[layerNumber]; |
| 2098 | var node = layer[nodeKey]; |
| 2099 | var result = ['(', node.bias]; |
| 2100 | for (var w in node.weights) { |
| 2101 | if (node.weights[w] < 0) { |
| 2102 | result.push(node.weights[w] + '*' + nodeHandle(layers, layerNumber - 1, w)); |
| 2103 | } else { |
| 2104 | result.push('+' + node.weights[w] + '*' + nodeHandle(layers, layerNumber - 1, w)); |
| 2105 | } |
| 2106 | } |
| 2107 | result.push(')'); |
| 2108 | |
| 2109 | switch (activation) { |
| 2110 | case 'sigmoid': |
| 2111 | return '1/(1+1/Math.exp(' + result.join('') + '))'; |
| 2112 | case 'relu': |
| 2113 | { |
| 2114 | needsVar = true; |
| 2115 | return '((v=' + result.join('') + ')<0?0:v)'; |
| 2116 | } |
| 2117 | case 'leaky-relu': |
| 2118 | { |
| 2119 | needsVar = true; |
| 2120 | return '((v=' + result.join('') + ')<0?0:' + leakyReluAlpha + '*v)'; |
| 2121 | } |
| 2122 | case 'tanh': |
| 2123 | return 'Math.tanh(' + result.join('') + ')'; |
| 2124 | default: |
| 2125 | throw new Error('unknown activation type ' + activation); |
| 2126 | } |
| 2127 | } |
| 2128 | |
| 2129 | var layers = this.toJSON().layers; |
| 2130 | var layersAsMath = []; |
no outgoing calls
no test coverage detected