diff --git a/src/WebGL2.js b/src/WebGL2.js index 3ec27540..89d32b74 100644 --- a/src/WebGL2.js +++ b/src/WebGL2.js @@ -1,3 +1,5 @@ +import vertexShaderSource from './webgl/vertexShader.glsl' + class WebGL2 { constructor() { this.isSupported = false @@ -37,10 +39,8 @@ class WebGL2 { createCommonVertexShader() { const gl = this.context - const source = require('./webgl/vertexShader.glsl') - const vertexShader = gl.createShader(gl.VERTEX_SHADER) - gl.shaderSource(vertexShader, source) + gl.shaderSource(vertexShader, vertexShaderSource) gl.compileShader(vertexShader) const success = gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS) diff --git a/src/activations/programSources.js b/src/activations/programSources.js new file mode 100644 index 00000000..313a3be0 --- /dev/null +++ b/src/activations/programSources.js @@ -0,0 +1,21 @@ +import softmaxProgramSource from './softmax.glsl' +import eluProgramSource from './elu.glsl' +import seluProgramSource from './selu.glsl' +import softplusProgramSource from './softplus.glsl' +import softsignProgramSource from './softsign.glsl' +import reluProgramSource from './relu.glsl' +import tanhProgramSource from './tanh.glsl' +import sigmoidProgramSource from './sigmoid.glsl' +import hardSigmoidProgramSource from './hard_sigmoid.glsl' +import linearProgramSource from './linear.glsl' + +export { softmaxProgramSource as softmax } +export { eluProgramSource as elu } +export { seluProgramSource as selu } +export { softplusProgramSource as softplus } +export { softsignProgramSource as softsign } +export { reluProgramSource as relu } +export { tanhProgramSource as tanh } +export { sigmoidProgramSource as sigmoid } +export { hardSigmoidProgramSource as hard_sigmoid } +export { linearProgramSource as linear } diff --git a/src/layers/advanced_activations/ELU.js b/src/layers/advanced_activations/ELU.js index 46113226..5eab5520 100644 --- a/src/layers/advanced_activations/ELU.js +++ b/src/layers/advanced_activations/ELU.js @@ -2,6 +2,7 @@ import Layer from '../../Layer' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import cwise from 'cwise' +import programSource from './ELU.glsl' /** * ELU advanced activation layer class @@ -23,7 +24,7 @@ export default class ELU extends Layer { // GPU setup if (this.gpu) { - this.program = webgl2.compileProgram(require('./ELU.glsl')) + this.program = webgl2.compileProgram(programSource) } } diff --git a/src/layers/advanced_activations/LeakyReLU.js b/src/layers/advanced_activations/LeakyReLU.js index e80fd75f..3a0e5c1f 100644 --- a/src/layers/advanced_activations/LeakyReLU.js +++ b/src/layers/advanced_activations/LeakyReLU.js @@ -2,6 +2,7 @@ import Layer from '../../Layer' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import { relu } from '../../activations' +import programSource from './LeakyReLU.glsl' /** * LeakyReLU advanced activation layer class @@ -23,7 +24,7 @@ export default class LeakyReLU extends Layer { // GPU setup if (this.gpu) { - this.program = webgl2.compileProgram(require('./LeakyReLU.glsl')) + this.program = webgl2.compileProgram(programSource) } } diff --git a/src/layers/advanced_activations/PReLU.js b/src/layers/advanced_activations/PReLU.js index 9c5a57d5..9792e78c 100644 --- a/src/layers/advanced_activations/PReLU.js +++ b/src/layers/advanced_activations/PReLU.js @@ -2,6 +2,7 @@ import Layer from '../../Layer' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import cwise from 'cwise' +import programSource from './PReLU.glsl' /** * PReLU advanced activation layer class @@ -28,7 +29,7 @@ export default class PReLU extends Layer { // GPU setup if (this.gpu) { - this.program = webgl2.compileProgram(require('./PReLU.glsl')) + this.program = webgl2.compileProgram(programSource) } } diff --git a/src/layers/advanced_activations/ThresholdedReLU.js b/src/layers/advanced_activations/ThresholdedReLU.js index 437fedbf..cdd4ad36 100644 --- a/src/layers/advanced_activations/ThresholdedReLU.js +++ b/src/layers/advanced_activations/ThresholdedReLU.js @@ -2,6 +2,7 @@ import Layer from '../../Layer' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import cwise from 'cwise' +import programSource from './ThresholdedReLU.glsl' /** * ThresholdedReLU advanced activation layer class @@ -23,7 +24,7 @@ export default class ThresholdedReLU extends Layer { // GPU setup if (this.gpu) { - this.program = webgl2.compileProgram(require('./ThresholdedReLU.glsl')) + this.program = webgl2.compileProgram(programSource) } } diff --git a/src/layers/convolutional/Conv2D.js b/src/layers/convolutional/Conv2D.js index 8b90aa73..ddbf1c69 100644 --- a/src/layers/convolutional/Conv2D.js +++ b/src/layers/convolutional/Conv2D.js @@ -6,6 +6,10 @@ import * as tensorUtils from '../../utils/tensorUtils' import _ from 'lodash' import ops from 'ndarray-ops' import gemm from 'ndarray-gemm' +import mapInputProgramSource from '../../webgl/mapInput.glsl' +import mapInputFragmentsProgramSource from '../../webgl/mapInput.fragments.glsl' +import matMulProgramSource from '../../webgl/matMul.glsl' +import * as activationProgramSources from '../../activations/programSources' /** * Conv2D layer class @@ -81,10 +85,10 @@ export default class Conv2D extends Layer { // GPU setup if (this.gpu) { - this.mapInputProgram = webgl2.compileProgram(require('../../webgl/mapInput.glsl')) - this.mapInputFragmentsProgram = webgl2.compileProgram(require('../../webgl/mapInput.fragments.glsl')) - this.matMulProgram = webgl2.compileProgram(require('../../webgl/matMul.glsl')) - this.activationProgram = webgl2.compileProgram(require(`../../activations/${this.activation}.glsl`)) + this.mapInputProgram = webgl2.compileProgram(mapInputProgramSource) + this.mapInputFragmentsProgram = webgl2.compileProgram(mapInputFragmentsProgramSource) + this.matMulProgram = webgl2.compileProgram(matMulProgramSource) + this.activationProgram = webgl2.compileProgram(activationProgramSources[this.activation]) } } diff --git a/src/layers/convolutional/Conv2DTranspose.js b/src/layers/convolutional/Conv2DTranspose.js index b109141a..90c36123 100644 --- a/src/layers/convolutional/Conv2DTranspose.js +++ b/src/layers/convolutional/Conv2DTranspose.js @@ -5,6 +5,9 @@ import { webgl2 } from '../../WebGL2' import * as tensorUtils from '../../utils/tensorUtils' import ops from 'ndarray-ops' import gemm from 'ndarray-gemm' +import matMulProgramSource from '../../webgl/matMul.glsl' +import convTransposeProgramSource from './Conv2DTranspose.glsl' +import * as activationProgramSources from '../../activations/programSources' /** * Conv2DTranspose layer class @@ -65,9 +68,9 @@ export default class Conv2DTranspose extends Layer { // GPU setup if (this.gpu) { - this.matMulProgram = webgl2.compileProgram(require('../../webgl/matMul.glsl')) - this.convTransposeProgram = webgl2.compileProgram(require('./Conv2DTranspose.glsl')) - this.activationProgram = webgl2.compileProgram(require(`../../activations/${this.activation}.glsl`)) + this.matMulProgram = webgl2.compileProgram(matMulProgramSource) + this.convTransposeProgram = webgl2.compileProgram(convTransposeProgramSource) + this.activationProgram = webgl2.compileProgram(activationProgramSources[this.activation]) } } diff --git a/src/layers/convolutional/Conv3D.js b/src/layers/convolutional/Conv3D.js index c72997d3..eb73fc40 100644 --- a/src/layers/convolutional/Conv3D.js +++ b/src/layers/convolutional/Conv3D.js @@ -6,6 +6,10 @@ import * as tensorUtils from '../../utils/tensorUtils' import _ from 'lodash' import ops from 'ndarray-ops' import gemm from 'ndarray-gemm' +import mapInputProgramSource from '../../webgl/mapInput.glsl' +import mapInputFragmentsProgramSource from '../../webgl/mapInput.fragments.glsl' +import matMulProgramSource from '../../webgl/matMul.glsl' +import * as activationProgramSources from '../../activations/programSources' /** * Conv3D layer class @@ -81,10 +85,10 @@ export default class Conv3D extends Layer { // GPU setup if (this.gpu) { - this.mapInputProgram = webgl2.compileProgram(require('../../webgl/mapInput.glsl')) - this.mapInputFragmentsProgram = webgl2.compileProgram(require('../../webgl/mapInput.fragments.glsl')) - this.matMulProgram = webgl2.compileProgram(require('../../webgl/matMul.glsl')) - this.activationProgram = webgl2.compileProgram(require(`../../activations/${this.activation}.glsl`)) + this.mapInputProgram = webgl2.compileProgram(mapInputProgramSource) + this.mapInputFragmentsProgram = webgl2.compileProgram(mapInputFragmentsProgramSource) + this.matMulProgram = webgl2.compileProgram(matMulProgramSource) + this.activationProgram = webgl2.compileProgram(activationProgramSources[this.activation]) } } diff --git a/src/layers/convolutional/Cropping1D.js b/src/layers/convolutional/Cropping1D.js index 5d07da08..80ae359e 100644 --- a/src/layers/convolutional/Cropping1D.js +++ b/src/layers/convolutional/Cropping1D.js @@ -2,6 +2,7 @@ import Layer from '../../Layer' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' +import mapInputProgramSource from '../../webgl/mapInput.glsl' /** * Cropping1D layer class @@ -27,7 +28,7 @@ export default class Cropping1D extends Layer { // GPU setup if (this.gpu) { - this.mapInputProgram = webgl2.compileProgram(require('../../webgl/mapInput.glsl')) + this.mapInputProgram = webgl2.compileProgram(mapInputProgramSource) } } diff --git a/src/layers/convolutional/Cropping2D.js b/src/layers/convolutional/Cropping2D.js index e121c6d4..5c56e4cb 100644 --- a/src/layers/convolutional/Cropping2D.js +++ b/src/layers/convolutional/Cropping2D.js @@ -2,6 +2,7 @@ import Layer from '../../Layer' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' +import mapInputProgramSource from '../../webgl/mapInput.glsl' /** * Cropping2D layer class @@ -37,7 +38,7 @@ export default class Cropping2D extends Layer { // GPU setup if (this.gpu) { - this.mapInputProgram = webgl2.compileProgram(require('../../webgl/mapInput.glsl')) + this.mapInputProgram = webgl2.compileProgram(mapInputProgramSource) } } diff --git a/src/layers/convolutional/Cropping3D.js b/src/layers/convolutional/Cropping3D.js index c1bfb32a..e6f58f78 100644 --- a/src/layers/convolutional/Cropping3D.js +++ b/src/layers/convolutional/Cropping3D.js @@ -2,6 +2,7 @@ import Layer from '../../Layer' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' +import mapInputProgramSource from '../../webgl/mapInput.glsl' /** * Cropping3D layer class @@ -37,7 +38,7 @@ export default class Cropping3D extends Layer { // GPU setup if (this.gpu) { - this.mapInputProgram = webgl2.compileProgram(require('../../webgl/mapInput.glsl')) + this.mapInputProgram = webgl2.compileProgram(mapInputProgramSource) } } diff --git a/src/layers/convolutional/SeparableConv2D.js b/src/layers/convolutional/SeparableConv2D.js index 61fdebf5..d911e92c 100644 --- a/src/layers/convolutional/SeparableConv2D.js +++ b/src/layers/convolutional/SeparableConv2D.js @@ -7,6 +7,7 @@ import _ from 'lodash' import ops from 'ndarray-ops' import gemm from 'ndarray-gemm' import Conv2D from './Conv2D' +import * as activationProgramSources from '../../activations/programSources' /** * _DepthwiseConv2D layer class @@ -301,7 +302,7 @@ export default class SeparableConv2D extends Layer { // GPU setup if (this.gpu) { - this.activationProgram = webgl2.compileProgram(require(`../../activations/${this.activation}.glsl`)) + this.activationProgram = webgl2.compileProgram(activationProgramSources[this.activation]) } } diff --git a/src/layers/convolutional/UpSampling1D.js b/src/layers/convolutional/UpSampling1D.js index a60d50a6..04ee07d9 100644 --- a/src/layers/convolutional/UpSampling1D.js +++ b/src/layers/convolutional/UpSampling1D.js @@ -2,6 +2,7 @@ import Layer from '../../Layer' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' +import mapInputProgramSource from '../../webgl/mapInput.glsl' /** * UpSampling1D layer class @@ -22,7 +23,7 @@ export default class UpSampling1D extends Layer { // GPU setup if (this.gpu) { - this.mapInputProgram = webgl2.compileProgram(require('../../webgl/mapInput.glsl')) + this.mapInputProgram = webgl2.compileProgram(mapInputProgramSource) } } diff --git a/src/layers/convolutional/UpSampling2D.js b/src/layers/convolutional/UpSampling2D.js index 59d76e7b..1af08cd7 100644 --- a/src/layers/convolutional/UpSampling2D.js +++ b/src/layers/convolutional/UpSampling2D.js @@ -2,6 +2,7 @@ import Layer from '../../Layer' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' +import mapInputProgramSource from '../../webgl/mapInput.glsl' /** * UpSampling2D layer class @@ -30,7 +31,7 @@ export default class UpSampling2D extends Layer { // GPU setup if (this.gpu) { - this.mapInputProgram = webgl2.compileProgram(require('../../webgl/mapInput.glsl')) + this.mapInputProgram = webgl2.compileProgram(mapInputProgramSource) } } diff --git a/src/layers/convolutional/UpSampling3D.js b/src/layers/convolutional/UpSampling3D.js index 53bb20aa..e1bfc884 100644 --- a/src/layers/convolutional/UpSampling3D.js +++ b/src/layers/convolutional/UpSampling3D.js @@ -2,6 +2,7 @@ import Layer from '../../Layer' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' +import mapInputProgramSource from '../../webgl/mapInput.glsl' /** * UpSampling3D layer class @@ -30,7 +31,7 @@ export default class UpSampling3D extends Layer { // GPU setup if (this.gpu) { - this.mapInputProgram = webgl2.compileProgram(require('../../webgl/mapInput.glsl')) + this.mapInputProgram = webgl2.compileProgram(mapInputProgramSource) } } diff --git a/src/layers/convolutional/ZeroPadding1D.js b/src/layers/convolutional/ZeroPadding1D.js index 606da1ea..2e0f5ed3 100644 --- a/src/layers/convolutional/ZeroPadding1D.js +++ b/src/layers/convolutional/ZeroPadding1D.js @@ -2,6 +2,7 @@ import Layer from '../../Layer' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' +import mapInputProgramSource from '../../webgl/mapInput.glsl' /** * ZeroPadding1D layer class @@ -27,7 +28,7 @@ export default class ZeroPadding1D extends Layer { // GPU setup if (this.gpu) { - this.mapInputProgram = webgl2.compileProgram(require('../../webgl/mapInput.glsl')) + this.mapInputProgram = webgl2.compileProgram(mapInputProgramSource) } } diff --git a/src/layers/convolutional/ZeroPadding2D.js b/src/layers/convolutional/ZeroPadding2D.js index 4c190f92..aa53f3c3 100644 --- a/src/layers/convolutional/ZeroPadding2D.js +++ b/src/layers/convolutional/ZeroPadding2D.js @@ -2,6 +2,7 @@ import Layer from '../../Layer' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' +import mapInputProgramSource from '../../webgl/mapInput.glsl' /** * ZeroPadding2D layer class @@ -37,7 +38,7 @@ export default class ZeroPadding2D extends Layer { // GPU setup if (this.gpu) { - this.mapInputProgram = webgl2.compileProgram(require('../../webgl/mapInput.glsl')) + this.mapInputProgram = webgl2.compileProgram(mapInputProgramSource) } } diff --git a/src/layers/convolutional/ZeroPadding3D.js b/src/layers/convolutional/ZeroPadding3D.js index 9f56791d..0e051ec2 100644 --- a/src/layers/convolutional/ZeroPadding3D.js +++ b/src/layers/convolutional/ZeroPadding3D.js @@ -2,6 +2,7 @@ import Layer from '../../Layer' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' +import mapInputProgramSource from '../../webgl/mapInput.glsl' /** * ZeroPadding3D layer class @@ -37,7 +38,7 @@ export default class ZeroPadding3D extends Layer { // GPU setup if (this.gpu) { - this.mapInputProgram = webgl2.compileProgram(require('../../webgl/mapInput.glsl')) + this.mapInputProgram = webgl2.compileProgram(mapInputProgramSource) } } diff --git a/src/layers/core/Activation.js b/src/layers/core/Activation.js index 9799539e..8a54ba4e 100644 --- a/src/layers/core/Activation.js +++ b/src/layers/core/Activation.js @@ -2,6 +2,7 @@ import Layer from '../../Layer' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import * as activations from '../../activations' +import * as activationProgramSources from '../../activations/programSources' /** * Activation layer class @@ -24,7 +25,7 @@ export default class Activation extends Layer { // GPU setup if (this.gpu) { - this.program = webgl2.compileProgram(require(`../../activations/${this.activation}.glsl`)) + this.program = webgl2.compileProgram(activationProgramSources[this.activation]) } } diff --git a/src/layers/core/Dense.js b/src/layers/core/Dense.js index 6af4da58..5436156f 100644 --- a/src/layers/core/Dense.js +++ b/src/layers/core/Dense.js @@ -4,6 +4,8 @@ import * as activations from '../../activations' import { webgl2 } from '../../WebGL2' import { gemv } from 'ndarray-blas-level2' import ops from 'ndarray-ops' +import matMulProgramSource from '../../webgl/matMul.glsl' +import * as activationProgramSources from '../../activations/programSources' /** * Dense layer class @@ -41,8 +43,8 @@ export default class Dense extends Layer { // GPU setup if (this.gpu) { - this.matMulProgram = webgl2.compileProgram(require('../../webgl/matMul.glsl')) - this.activationProgram = webgl2.compileProgram(require(`../../activations/${this.activation}.glsl`)) + this.matMulProgram = webgl2.compileProgram(matMulProgramSource) + this.activationProgram = webgl2.compileProgram(activationProgramSources[this.activation]) this.outputPreactiv.createGLTexture({ type: '2d', format: 'float' }) this.output.createGLTexture({ type: '2d', format: 'float' }) } diff --git a/src/layers/core/Flatten.js b/src/layers/core/Flatten.js index 3d2a4508..85e261de 100644 --- a/src/layers/core/Flatten.js +++ b/src/layers/core/Flatten.js @@ -1,6 +1,8 @@ import Layer from '../../Layer' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' +import flattenProgramSource from './Flatten.glsl' +import flattenFragmentsProgramSource from './Flatten.fragments.glsl' /** * Flatten layer class @@ -18,8 +20,8 @@ export default class Flatten extends Layer { // GPU setup if (this.gpu) { - this.flattenProgram = webgl2.compileProgram(require('./Flatten.glsl')) - this.flattenFragmentsProgram = webgl2.compileProgram(require('./Flatten.fragments.glsl')) + this.flattenProgram = webgl2.compileProgram(flattenProgramSource) + this.flattenFragmentsProgram = webgl2.compileProgram(flattenFragmentsProgramSource) } } diff --git a/src/layers/core/Permute.js b/src/layers/core/Permute.js index 5d520690..d2a9f746 100644 --- a/src/layers/core/Permute.js +++ b/src/layers/core/Permute.js @@ -3,6 +3,7 @@ import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import _ from 'lodash' import ops from 'ndarray-ops' +import mapInputProgramSource from '../../webgl/mapInput.glsl' /** * Permute layer class @@ -25,7 +26,7 @@ export default class Permute extends Layer { // GPU setup if (this.gpu) { - this.mapInputProgram = webgl2.compileProgram(require('../../webgl/mapInput.glsl')) + this.mapInputProgram = webgl2.compileProgram(mapInputProgramSource) } } diff --git a/src/layers/core/RepeatVector.js b/src/layers/core/RepeatVector.js index e9ee808c..d45dfb0f 100644 --- a/src/layers/core/RepeatVector.js +++ b/src/layers/core/RepeatVector.js @@ -3,6 +3,7 @@ import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import unsqueeze from 'ndarray-unsqueeze' import tile from 'ndarray-tile' +import programSource from './RepeatVector.glsl' /** * RepeatVector layer class @@ -25,7 +26,7 @@ export default class RepeatVector extends Layer { // GPU setup if (this.gpu) { - this.program = webgl2.compileProgram(require('./RepeatVector.glsl')) + this.program = webgl2.compileProgram(programSource) } } diff --git a/src/layers/core/Reshape.js b/src/layers/core/Reshape.js index 8d4cfd35..2e29d859 100644 --- a/src/layers/core/Reshape.js +++ b/src/layers/core/Reshape.js @@ -3,6 +3,7 @@ import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import _ from 'lodash' import ops from 'ndarray-ops' +import mapInputProgramSource from '../../webgl/mapInput.glsl' /** * Reshape layer class @@ -24,7 +25,7 @@ export default class Reshape extends Layer { // GPU setup if (this.gpu) { - this.mapInputProgram = webgl2.compileProgram(require('../../webgl/mapInput.glsl')) + this.mapInputProgram = webgl2.compileProgram(mapInputProgramSource) } } diff --git a/src/layers/embeddings/Embedding.js b/src/layers/embeddings/Embedding.js index 2cbd8150..8770d2ea 100644 --- a/src/layers/embeddings/Embedding.js +++ b/src/layers/embeddings/Embedding.js @@ -2,6 +2,7 @@ import Layer from '../../Layer' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' +import programSource from './Embedding.glsl' /** * Embedding layer class @@ -30,7 +31,7 @@ export default class Embedding extends Layer { // GPU setup if (this.gpu) { - this.program = webgl2.compileProgram(require('./Embedding.glsl')) + this.program = webgl2.compileProgram(programSource) } } diff --git a/src/layers/merge/Add.js b/src/layers/merge/Add.js index fce905a7..dbfe6c6a 100644 --- a/src/layers/merge/Add.js +++ b/src/layers/merge/Add.js @@ -2,6 +2,7 @@ import _Merge from './_Merge' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' +import mergeProgramSource from './Add.glsl' /** * Add merge layer class, extends abstract _Merge class @@ -20,7 +21,7 @@ export default class Add extends _Merge { // GPU setup if (this.gpu) { - this.mergeProgram = webgl2.compileProgram(require('./Add.glsl')) + this.mergeProgram = webgl2.compileProgram(mergeProgramSource) } } diff --git a/src/layers/merge/Average.js b/src/layers/merge/Average.js index 463a81ce..d8dd4309 100644 --- a/src/layers/merge/Average.js +++ b/src/layers/merge/Average.js @@ -2,6 +2,7 @@ import _Merge from './_Merge' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' +import mergeProgramSource from './Average.glsl' /** * Average merge layer class, extends abstract _Merge class @@ -20,7 +21,7 @@ export default class Average extends _Merge { // GPU setup if (this.gpu) { - this.mergeProgram = webgl2.compileProgram(require('./Average.glsl')) + this.mergeProgram = webgl2.compileProgram(mergeProgramSource) } } diff --git a/src/layers/merge/Concatenate.js b/src/layers/merge/Concatenate.js index 866847f6..149b1137 100644 --- a/src/layers/merge/Concatenate.js +++ b/src/layers/merge/Concatenate.js @@ -4,6 +4,7 @@ import { webgl2 } from '../../WebGL2' import * as tensorUtils from '../../utils/tensorUtils' import concatFirstAxis from 'ndarray-concat-rows' import _ from 'lodash' +import mergeProgramSource from './Concatenate.glsl' /** * Concatenate merge layer class, extends abstract _Merge class @@ -27,7 +28,7 @@ export default class Concatenate extends _Merge { // GPU setup if (this.gpu) { - this.mergeProgram = webgl2.compileProgram(require('./Concatenate.glsl')) + this.mergeProgram = webgl2.compileProgram(mergeProgramSource) } } diff --git a/src/layers/merge/Dot.js b/src/layers/merge/Dot.js index 49630b03..4e1716fe 100644 --- a/src/layers/merge/Dot.js +++ b/src/layers/merge/Dot.js @@ -3,6 +3,7 @@ import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import gemm from 'ndarray-gemm' import ops from 'ndarray-ops' +import mergeProgramSource from './Dot.glsl' /** * Dot merge layer class, extends abstract _Merge class @@ -32,7 +33,7 @@ export default class Dot extends _Merge { // GPU setup if (this.gpu) { - this.mergeProgram = webgl2.compileProgram(require('./Dot.glsl')) + this.mergeProgram = webgl2.compileProgram(mergeProgramSource) } } diff --git a/src/layers/merge/Maximum.js b/src/layers/merge/Maximum.js index 933631b6..66a3f29f 100644 --- a/src/layers/merge/Maximum.js +++ b/src/layers/merge/Maximum.js @@ -2,6 +2,7 @@ import _Merge from './_Merge' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' +import mergeProgramSource from './Maximum.glsl' /** * Maximum merge layer class, extends abstract _Merge class @@ -20,7 +21,7 @@ export default class Maximum extends _Merge { // GPU setup if (this.gpu) { - this.mergeProgram = webgl2.compileProgram(require('./Maximum.glsl')) + this.mergeProgram = webgl2.compileProgram(mergeProgramSource) } } diff --git a/src/layers/merge/Minimum.js b/src/layers/merge/Minimum.js index d1193588..3b9cf5cd 100644 --- a/src/layers/merge/Minimum.js +++ b/src/layers/merge/Minimum.js @@ -2,6 +2,7 @@ import _Merge from './_Merge' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' +import mergeProgramSource from './Minimum.glsl' /** * Minimum merge layer class, extends abstract _Merge class @@ -20,7 +21,7 @@ export default class Minimum extends _Merge { // GPU setup if (this.gpu) { - this.mergeProgram = webgl2.compileProgram(require('./Minimum.glsl')) + this.mergeProgram = webgl2.compileProgram(mergeProgramSource) } } diff --git a/src/layers/merge/Multiply.js b/src/layers/merge/Multiply.js index d22e7332..5bfcf77c 100644 --- a/src/layers/merge/Multiply.js +++ b/src/layers/merge/Multiply.js @@ -2,6 +2,7 @@ import _Merge from './_Merge' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' +import mergeProgramSource from './Multiply.glsl' /** * Multiply merge layer class, extends abstract _Merge class @@ -20,7 +21,7 @@ export default class Multiply extends _Merge { // GPU setup if (this.gpu) { - this.mergeProgram = webgl2.compileProgram(require('./Multiply.glsl')) + this.mergeProgram = webgl2.compileProgram(mergeProgramSource) } } diff --git a/src/layers/merge/Subtract.js b/src/layers/merge/Subtract.js index d3756813..5939b4d6 100644 --- a/src/layers/merge/Subtract.js +++ b/src/layers/merge/Subtract.js @@ -2,6 +2,7 @@ import _Merge from './_Merge' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' +import mergeProgramSource from './Subtract.glsl' /** * Subtract merge layer class, extends abstract _Merge class @@ -20,7 +21,7 @@ export default class Subtract extends _Merge { // GPU setup if (this.gpu) { - this.mergeProgram = webgl2.compileProgram(require('./Subtract.glsl')) + this.mergeProgram = webgl2.compileProgram(mergeProgramSource) } } diff --git a/src/layers/merge/_Merge.js b/src/layers/merge/_Merge.js index 650b939c..f4b5a199 100644 --- a/src/layers/merge/_Merge.js +++ b/src/layers/merge/_Merge.js @@ -2,6 +2,7 @@ import Layer from '../../Layer' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import _ from 'lodash' +import copyTextureProgramSource from '../../webgl/copyTexture.glsl' /** * _Merge layer class @@ -19,7 +20,7 @@ export default class _Merge extends Layer { // GPU setup if (this.gpu) { - this.copyTextureProgram = webgl2.compileProgram(require('../../webgl/copyTexture.glsl')) + this.copyTextureProgram = webgl2.compileProgram(copyTextureProgramSource) } } diff --git a/src/layers/normalization/BatchNormalization.js b/src/layers/normalization/BatchNormalization.js index 60290627..699aadc0 100644 --- a/src/layers/normalization/BatchNormalization.js +++ b/src/layers/normalization/BatchNormalization.js @@ -2,6 +2,7 @@ import Layer from '../../Layer' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' +import programSource from './BatchNormalization.glsl' /** * BatchNormalization layer class @@ -40,7 +41,7 @@ export default class BatchNormalization extends Layer { // GPU setup if (this.gpu) { - this.program = webgl2.compileProgram(require('./BatchNormalization.glsl')) + this.program = webgl2.compileProgram(programSource) } } diff --git a/src/layers/pooling/_GlobalPooling1D.js b/src/layers/pooling/_GlobalPooling1D.js index fbce90e5..4b370a0f 100644 --- a/src/layers/pooling/_GlobalPooling1D.js +++ b/src/layers/pooling/_GlobalPooling1D.js @@ -2,6 +2,7 @@ import Layer from '../../Layer' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' +import poolingProgramSource from './_GlobalPooling.glsl' /** * _GlobalPooling1D layer class @@ -25,7 +26,7 @@ export default class _GlobalPooling1D extends Layer { // GPU setup if (this.gpu) { - this.poolingProgram = webgl2.compileProgram(require('./_GlobalPooling.glsl')) + this.poolingProgram = webgl2.compileProgram(poolingProgramSource) } } diff --git a/src/layers/pooling/_GlobalPooling2D.js b/src/layers/pooling/_GlobalPooling2D.js index 7e3c4d1c..50c99022 100644 --- a/src/layers/pooling/_GlobalPooling2D.js +++ b/src/layers/pooling/_GlobalPooling2D.js @@ -2,6 +2,7 @@ import Layer from '../../Layer' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' +import poolingProgramSource from './_GlobalPooling.glsl' /** * _GlobalPooling2D layer class @@ -25,7 +26,7 @@ export default class _GlobalPooling2D extends Layer { // GPU setup if (this.gpu) { - this.poolingProgram = webgl2.compileProgram(require('./_GlobalPooling.glsl')) + this.poolingProgram = webgl2.compileProgram(poolingProgramSource) } } diff --git a/src/layers/pooling/_GlobalPooling3D.js b/src/layers/pooling/_GlobalPooling3D.js index 2b973181..b01147c0 100644 --- a/src/layers/pooling/_GlobalPooling3D.js +++ b/src/layers/pooling/_GlobalPooling3D.js @@ -2,6 +2,7 @@ import Layer from '../../Layer' import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' +import poolingProgramSource from './_GlobalPooling.glsl' /** * _GlobalPooling3D layer class @@ -25,7 +26,7 @@ export default class _GlobalPooling3D extends Layer { // GPU setup if (this.gpu) { - this.poolingProgram = webgl2.compileProgram(require('./_GlobalPooling.glsl')) + this.poolingProgram = webgl2.compileProgram(poolingProgramSource) } } diff --git a/src/layers/pooling/_Pooling1D.js b/src/layers/pooling/_Pooling1D.js index 51dc95d9..a708847f 100644 --- a/src/layers/pooling/_Pooling1D.js +++ b/src/layers/pooling/_Pooling1D.js @@ -3,6 +3,8 @@ import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' import _ from 'lodash' +import poolingProgramSource from './_Pooling.glsl' +import poolingFragmentsProgramSource from './_Pooling.fragments.glsl' /** * _Pooling1D layer class @@ -29,8 +31,8 @@ export default class _Pooling1D extends Layer { // GPU setup if (this.gpu) { - this.poolingProgram = webgl2.compileProgram(require('./_Pooling.glsl')) - this.poolingFragmentsProgram = webgl2.compileProgram(require('./_Pooling.fragments.glsl')) + this.poolingProgram = webgl2.compileProgram(poolingProgramSource) + this.poolingFragmentsProgram = webgl2.compileProgram(poolingFragmentsProgramSource) } } diff --git a/src/layers/pooling/_Pooling2D.js b/src/layers/pooling/_Pooling2D.js index a731a8d4..c5e84c58 100644 --- a/src/layers/pooling/_Pooling2D.js +++ b/src/layers/pooling/_Pooling2D.js @@ -4,6 +4,8 @@ import { webgl2 } from '../../WebGL2' import * as tensorUtils from '../../utils/tensorUtils' import ops from 'ndarray-ops' import _ from 'lodash' +import poolingProgramSource from './_Pooling.glsl' +import poolingFragmentsProgramSource from './_Pooling.fragments.glsl' /** * _Pooling2D layer class @@ -43,8 +45,8 @@ export default class _Pooling2D extends Layer { // GPU setup if (this.gpu) { - this.poolingProgram = webgl2.compileProgram(require('./_Pooling.glsl')) - this.poolingFragmentsProgram = webgl2.compileProgram(require('./_Pooling.fragments.glsl')) + this.poolingProgram = webgl2.compileProgram(poolingProgramSource) + this.poolingFragmentsProgram = webgl2.compileProgram(poolingFragmentsProgramSource) } } diff --git a/src/layers/pooling/_Pooling3D.js b/src/layers/pooling/_Pooling3D.js index d194ac2b..6fb41630 100644 --- a/src/layers/pooling/_Pooling3D.js +++ b/src/layers/pooling/_Pooling3D.js @@ -4,6 +4,8 @@ import { webgl2 } from '../../WebGL2' import * as tensorUtils from '../../utils/tensorUtils' import ops from 'ndarray-ops' import _ from 'lodash' +import poolingProgramSource from './_Pooling.glsl' +import poolingFragmentsProgramSource from './_Pooling.fragments.glsl' /** * _Pooling3D layer class @@ -43,8 +45,8 @@ export default class _Pooling3D extends Layer { // GPU setup if (this.gpu) { - this.poolingProgram = webgl2.compileProgram(require('./_Pooling.glsl')) - this.poolingFragmentsProgram = webgl2.compileProgram(require('./_Pooling.fragments.glsl')) + this.poolingProgram = webgl2.compileProgram(poolingProgramSource) + this.poolingFragmentsProgram = webgl2.compileProgram(poolingFragmentsProgramSource) } } diff --git a/src/layers/recurrent/GRU.js b/src/layers/recurrent/GRU.js index 94f3caf3..19646d58 100644 --- a/src/layers/recurrent/GRU.js +++ b/src/layers/recurrent/GRU.js @@ -5,6 +5,14 @@ import { webgl2 } from '../../WebGL2' import { gemv } from 'ndarray-blas-level2' import ops from 'ndarray-ops' import cwise from 'cwise' +import copyTextureProgramSource from '../../webgl/copyTexture.glsl' +import matMulProgramSource from '../../webgl/matMul.glsl' +import * as activationProgramSources from '../../activations/programSources' +import gateSummationProgramSource from './gateSummation.glsl' +import gateProductProgramSource from './gateProduct.glsl' +import timestepReadProgramSource from './timestepRead.glsl' +import timestepWriteProgramSource from './timestepWrite.glsl' +import updateProgramSource from './GRU.update.glsl' /** * GRU layer class @@ -55,17 +63,15 @@ export default class GRU extends Layer { // GPU setup if (this.gpu) { - this.copyTextureProgram = webgl2.compileProgram(require('../../webgl/copyTexture.glsl')) - this.matMulProgram = webgl2.compileProgram(require('../../webgl/matMul.glsl')) - this.activationProgram = webgl2.compileProgram(require(`../../activations/${this.activation}.glsl`)) - this.recurrentActivationProgram = webgl2.compileProgram( - require(`../../activations/${this.recurrentActivation}.glsl`) - ) - this.gateSummationProgram = webgl2.compileProgram(require('./gateSummation.glsl')) - this.gateProductProgram = webgl2.compileProgram(require('./gateProduct.glsl')) - this.timestepReadProgram = webgl2.compileProgram(require('./timestepRead.glsl')) - this.timestepWriteProgram = webgl2.compileProgram(require('./timestepWrite.glsl')) - this.updateProgram = webgl2.compileProgram(require('./GRU.update.glsl')) + this.copyTextureProgram = webgl2.compileProgram(copyTextureProgramSource) + this.matMulProgram = webgl2.compileProgram(matMulProgramSource) + this.activationProgram = webgl2.compileProgram(activationProgramSources[this.activation]) + this.recurrentActivationProgram = webgl2.compileProgram(activationProgramSources[this.recurrentActivation]) + this.gateSummationProgram = webgl2.compileProgram(gateSummationProgramSource) + this.gateProductProgram = webgl2.compileProgram(gateProductProgramSource) + this.timestepReadProgram = webgl2.compileProgram(timestepReadProgramSource) + this.timestepWriteProgram = webgl2.compileProgram(timestepWriteProgramSource) + this.updateProgram = webgl2.compileProgram(updateProgramSource) } } diff --git a/src/layers/recurrent/LSTM.js b/src/layers/recurrent/LSTM.js index 9c7e0cfe..2188de64 100644 --- a/src/layers/recurrent/LSTM.js +++ b/src/layers/recurrent/LSTM.js @@ -5,6 +5,14 @@ import { webgl2 } from '../../WebGL2' import { gemv } from 'ndarray-blas-level2' import ops from 'ndarray-ops' import cwise from 'cwise' +import copyTextureProgramSource from '../../webgl/copyTexture.glsl' +import matMulProgramSource from '../../webgl/matMul.glsl' +import * as activationProgramSources from '../../activations/programSources' +import gateSummationProgramSource from './gateSummation.glsl' +import gateProductProgramSource from './gateProduct.glsl' +import timestepReadProgramSource from './timestepRead.glsl' +import timestepWriteProgramSource from './timestepWrite.glsl' +import updateProgramSource from './LSTM.update.glsl' /** * LSTM layer class @@ -55,17 +63,15 @@ export default class LSTM extends Layer { // GPU setup if (this.gpu) { - this.copyTextureProgram = webgl2.compileProgram(require('../../webgl/copyTexture.glsl')) - this.matMulProgram = webgl2.compileProgram(require('../../webgl/matMul.glsl')) - this.activationProgram = webgl2.compileProgram(require(`../../activations/${this.activation}.glsl`)) - this.recurrentActivationProgram = webgl2.compileProgram( - require(`../../activations/${this.recurrentActivation}.glsl`) - ) - this.gateSummationProgram = webgl2.compileProgram(require('./gateSummation.glsl')) - this.gateProductProgram = webgl2.compileProgram(require('./gateProduct.glsl')) - this.timestepReadProgram = webgl2.compileProgram(require('./timestepRead.glsl')) - this.timestepWriteProgram = webgl2.compileProgram(require('./timestepWrite.glsl')) - this.updateProgram = webgl2.compileProgram(require('./LSTM.update.glsl')) + this.copyTextureProgram = webgl2.compileProgram(copyTextureProgramSource) + this.matMulProgram = webgl2.compileProgram(matMulProgramSource) + this.activationProgram = webgl2.compileProgram(activationProgramSources[this.activation]) + this.recurrentActivationProgram = webgl2.compileProgram(activationProgramSources[this.recurrentActivation]) + this.gateSummationProgram = webgl2.compileProgram(gateSummationProgramSource) + this.gateProductProgram = webgl2.compileProgram(gateProductProgramSource) + this.timestepReadProgram = webgl2.compileProgram(timestepReadProgramSource) + this.timestepWriteProgram = webgl2.compileProgram(timestepWriteProgramSource) + this.updateProgram = webgl2.compileProgram(updateProgramSource) } } diff --git a/src/layers/recurrent/SimpleRNN.js b/src/layers/recurrent/SimpleRNN.js index be1dbeba..406ba49a 100644 --- a/src/layers/recurrent/SimpleRNN.js +++ b/src/layers/recurrent/SimpleRNN.js @@ -5,6 +5,12 @@ import { webgl2 } from '../../WebGL2' import { gemv } from 'ndarray-blas-level2' import ops from 'ndarray-ops' import cwise from 'cwise' +import copyTextureProgramSource from '../../webgl/copyTexture.glsl' +import matMulProgramSource from '../../webgl/matMul.glsl' +import * as activationProgramSources from '../../activations/programSources' +import gateSummationProgramSource from './gateSummation.glsl' +import timestepReadProgramSource from './timestepRead.glsl' +import timestepWriteProgramSource from './timestepWrite.glsl' /** * SimpleRNN layer class @@ -51,12 +57,12 @@ export default class SimpleRNN extends Layer { // GPU setup if (this.gpu) { - this.copyTextureProgram = webgl2.compileProgram(require('../../webgl/copyTexture.glsl')) - this.matMulProgram = webgl2.compileProgram(require('../../webgl/matMul.glsl')) - this.activationProgram = webgl2.compileProgram(require(`../../activations/${this.activation}.glsl`)) - this.gateSummationProgram = webgl2.compileProgram(require('./gateSummation.glsl')) - this.timestepReadProgram = webgl2.compileProgram(require('./timestepRead.glsl')) - this.timestepWriteProgram = webgl2.compileProgram(require('./timestepWrite.glsl')) + this.copyTextureProgram = webgl2.compileProgram(copyTextureProgramSource) + this.matMulProgram = webgl2.compileProgram(matMulProgramSource) + this.activationProgram = webgl2.compileProgram(activationProgramSources[this.activation]) + this.gateSummationProgram = webgl2.compileProgram(gateSummationProgramSource) + this.timestepReadProgram = webgl2.compileProgram(timestepReadProgramSource) + this.timestepWriteProgram = webgl2.compileProgram(timestepWriteProgramSource) } } diff --git a/src/layers/wrappers/Bidirectional.js b/src/layers/wrappers/Bidirectional.js index ee9705b2..4793049d 100644 --- a/src/layers/wrappers/Bidirectional.js +++ b/src/layers/wrappers/Bidirectional.js @@ -3,6 +3,11 @@ import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' import * as recurrentLayers from '../recurrent' +import copyTextureProgramSource from '../../webgl/copyTexture.glsl' +import concatMergeProgramSource from './Bidirectional.concat.glsl' +import sumMergeProgramSource from './Bidirectional.sum.glsl' +import mulMergeProgramSource from './Bidirectional.mul.glsl' +import aveMergeProgramSource from './Bidirectional.ave.glsl' /** * Bidirectional wrapper layer class @@ -45,15 +50,15 @@ export default class Bidirectional extends Layer { // GPU setup if (this.gpu) { - this.copyTextureProgram = webgl2.compileProgram(require('../../webgl/copyTexture.glsl')) + this.copyTextureProgram = webgl2.compileProgram(copyTextureProgramSource) if (this.mergeMode === 'concat') { - this.mergeProgram = webgl2.compileProgram(require('./Bidirectional.concat.glsl')) + this.mergeProgram = webgl2.compileProgram(concatMergeProgramSource) } else if (this.mergeMode === 'sum') { - this.mergeProgram = webgl2.compileProgram(require('./Bidirectional.sum.glsl')) + this.mergeProgram = webgl2.compileProgram(sumMergeProgramSource) } else if (this.mergeMode === 'mul') { - this.mergeProgram = webgl2.compileProgram(require('./Bidirectional.mul.glsl')) + this.mergeProgram = webgl2.compileProgram(mulMergeProgramSource) } else if (this.mergeMode === 'ave') { - this.mergeProgram = webgl2.compileProgram(require('./Bidirectional.ave.glsl')) + this.mergeProgram = webgl2.compileProgram(aveMergeProgramSource) } } } diff --git a/src/layers/wrappers/TimeDistributed.js b/src/layers/wrappers/TimeDistributed.js index 3f5eaa21..df406f3a 100644 --- a/src/layers/wrappers/TimeDistributed.js +++ b/src/layers/wrappers/TimeDistributed.js @@ -3,6 +3,11 @@ import Tensor from '../../Tensor' import { webgl2 } from '../../WebGL2' import ops from 'ndarray-ops' import * as layers from '../' +import copyTextureProgramSource from '../../webgl/copyTexture.glsl' +import mapInputProgramSource from '../../webgl/mapInput.glsl' +import selectSliceProgramSource from './TimeDistributed.selectSlice.glsl' +import copySliceOutputProgramSource from './TimeDistributed.copySliceOutput.glsl' +import mapSliceOutputProgramSource from './TimeDistributed.mapSliceOutput.glsl' /** * TimeDistributed wrapper layer class @@ -31,11 +36,11 @@ export default class TimeDistributed extends Layer { // GPU setup if (this.gpu) { - this.copyTextureProgram = webgl2.compileProgram(require('../../webgl/copyTexture.glsl')) - this.mapInputProgram = webgl2.compileProgram(require('../../webgl/mapInput.glsl')) - this.selectSliceProgram = webgl2.compileProgram(require('./TimeDistributed.selectSlice.glsl')) - this.copySliceOutputProgram = webgl2.compileProgram(require('./TimeDistributed.copySliceOutput.glsl')) - this.mapSliceOutputProgram = webgl2.compileProgram(require('./TimeDistributed.mapSliceOutput.glsl')) + this.copyTextureProgram = webgl2.compileProgram(copyTextureProgramSource) + this.mapInputProgram = webgl2.compileProgram(mapInputProgramSource) + this.selectSliceProgram = webgl2.compileProgram(selectSliceProgramSource) + this.copySliceOutputProgram = webgl2.compileProgram(copySliceOutputProgramSource) + this.mapSliceOutputProgram = webgl2.compileProgram(mapSliceOutputProgramSource) } } diff --git a/src/visualizations/CAM.js b/src/visualizations/CAM.js index 120e2f2b..4d7261fa 100644 --- a/src/visualizations/CAM.js +++ b/src/visualizations/CAM.js @@ -3,6 +3,7 @@ import { webgl2 } from '../WebGL2' import ndarray from 'ndarray' import ops from 'ndarray-ops' import resample from 'ndarray-resample' +import programSource from './CAM.glsl' /** * Class Activation Maps @@ -21,7 +22,7 @@ export default class CAM { // GPU setup if (this.gpu) { - this.program = webgl2.compileProgram(require('./CAM.glsl')) + this.program = webgl2.compileProgram(programSource) } }