Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.04 KB | None | 0 0
  1. error C5041: cannot locate suitable resource to bind variable "_activations-0043". Possibly large array.
  2.  
  3. #version 430 compatibility
  4. #extension GL_ARB_compute_shader : enable
  5. #extension GL_ARB_compute_storage_buffer_shader : enable
  6.  
  7. // Scaling Methods
  8. #define NoScaling 0
  9. #define Minimummaximum 1
  10. #define MeanStandardDeviation 2
  11.  
  12. // Activation Functions
  13. #define Linear 0
  14. #define HyperbolicTangent 1
  15.  
  16. #define MAX_INPUTS_SIZE 12
  17. #define MAX_STATISTICS_SIZE 20
  18.  
  19. // Structures
  20. /**************************************************************************************************************************************/
  21. struct Perceptron
  22. {
  23. uint inputs_number;
  24.  
  25. int activation_function;
  26. float bias;
  27. float synaptic_weights[MAX_STATISTICS_SIZE];
  28. };
  29.  
  30. struct PerceptronLayer
  31. {
  32. uint perceptrons_size;
  33.  
  34. Perceptron perceptrons[MAX_STATISTICS_SIZE];
  35. };
  36.  
  37. struct MultilayerPerceptron
  38. {
  39. uint layers_size;
  40.  
  41. PerceptronLayer perceptron_layers[MAX_STATISTICS_SIZE];
  42. };
  43.  
  44. struct Statistics
  45. {
  46. float minimum;
  47. float maximum;
  48. float mean;
  49. float standard_deviation;
  50. };
  51.  
  52. struct ScalingLayer
  53. {
  54. uint statistics_size;
  55.  
  56. int scaling_method;
  57. Statistics statistics[MAX_STATISTICS_SIZE];
  58. };
  59.  
  60. struct UnscalingLayer
  61. {
  62. uint statistics_size;
  63.  
  64. int scaling_method;
  65. Statistics statistics[MAX_STATISTICS_SIZE];
  66. };
  67. /**************************************************************************************************************************************/
  68.  
  69. // Scaling Layer
  70. float[MAX_STATISTICS_SIZE] ScalingLayerCalculateOutputs(float inputs[MAX_INPUTS_SIZE], ScalingLayer scaling_layer)
  71. {
  72. float outputs[MAX_STATISTICS_SIZE];
  73.  
  74. for (uint i = 0; i < 12 /*scaling_layer.statistics_size*/; ++i)
  75. {
  76. if ((scaling_layer.statistics[i].maximum - scaling_layer.statistics[i].minimum) < 1e-99)
  77. {
  78. outputs[i] = inputs[i];
  79. }
  80. else
  81. {
  82. outputs[i] = 2.0 * (inputs[i] - scaling_layer.statistics[i].minimum * (1.0 / (scaling_layer.statistics[i].maximum - scaling_layer.statistics[i].minimum)) - 1.0);
  83. }
  84. }
  85.  
  86. return outputs;
  87. }
  88.  
  89. // Combination
  90. /**************************************************************************************************************************************/
  91. float PerceptronLayerCalculateCombination(float inputs[MAX_STATISTICS_SIZE], Perceptron perceptron, uint inputs_number)
  92. {
  93. float combination = perceptron.bias;
  94.  
  95. for (uint i = 0; i < inputs_number; ++i)
  96. {
  97. combination += perceptron.synaptic_weights[i] * inputs[i];
  98. }
  99. return combination;
  100. }
  101.  
  102.  
  103.  
  104. float[MAX_STATISTICS_SIZE] PerceptronLayerCalculateCombinations(float inputs[MAX_STATISTICS_SIZE], PerceptronLayer perceptron_layer, uint nb_perceptrons, uint inputs_number)
  105. {
  106. float combination[MAX_STATISTICS_SIZE];
  107.  
  108. for (uint i = 0; i < nb_perceptrons /*perceptron_layer.perceptrons_size*/; ++i)
  109. {
  110. combination[i] = PerceptronLayerCalculateCombination(inputs, perceptron_layer.perceptrons[i], inputs_number);
  111. }
  112. return combination;
  113. }
  114. /**************************************************************************************************************************************/
  115.  
  116.  
  117. // Activation
  118. /**************************************************************************************************************************************/
  119. float PerceptronCalculateActivation(float combination, Perceptron perceptron)
  120. {
  121. switch (perceptron.activation_function) {
  122. case Linear:
  123. return combination;
  124. case HyperbolicTangent:
  125. return (1.0 - 2.0 / (exp(float(2.0 * combination)) + 1.0));
  126. }
  127. }
  128.  
  129. float[MAX_STATISTICS_SIZE] PerceptronLayerCalculateActivations(float combinations[MAX_STATISTICS_SIZE], PerceptronLayer perceptron_layer, uint nb_perceptrons)
  130. {
  131. float activations[MAX_STATISTICS_SIZE];
  132.  
  133. for (uint i = 0; i < nb_perceptrons /*perceptron_layer.perceptrons_size*/; ++i)
  134. {
  135. activations[i] = PerceptronCalculateActivation(combinations[i], perceptron_layer.perceptrons[i]);
  136. }
  137. return activations;
  138. }
  139. /**************************************************************************************************************************************/
  140.  
  141. // Multilayer Perceptron
  142. float[MAX_STATISTICS_SIZE] MultilayerPerceptronCalculateOutputs(float inputs[MAX_STATISTICS_SIZE], MultilayerPerceptron multilayer_perceptron)
  143. {
  144. float outputs[MAX_STATISTICS_SIZE];
  145.  
  146. uint architecture[4];
  147. architecture[0] = 12;
  148. architecture[1] = 20;
  149. architecture[2] = 10;
  150. architecture[3] = 3;
  151.  
  152. if (multilayer_perceptron.layers_size == 0)
  153. {
  154. return inputs;
  155. }
  156. else
  157. {
  158. outputs = PerceptronLayerCalculateActivations(PerceptronLayerCalculateCombinations(inputs, multilayer_perceptron.perceptron_layers[0], architecture[1], architecture[0]), multilayer_perceptron.perceptron_layers[0], architecture[1]);
  159.  
  160. for (uint i = 1; i < 3 /*multilayer_perceptron.layers_size*/; ++i)
  161. {
  162. outputs = PerceptronLayerCalculateActivations(PerceptronLayerCalculateCombinations(outputs, multilayer_perceptron.perceptron_layers[i], architecture[i + 1], architecture[i]), multilayer_perceptron.perceptron_layers[i], architecture[i + 1]);
  163. }
  164. }
  165. return outputs;
  166. }
  167.  
  168. // Unscaling Layer
  169. float[MAX_STATISTICS_SIZE] UnscalingLayerCalculateOutputs(float inputs[MAX_STATISTICS_SIZE], UnscalingLayer unscaling_layer)
  170. {
  171. float outputs[MAX_STATISTICS_SIZE];
  172. for (uint i = 0; i < 3 /*unscaling_layer.statistics_size*/; ++i)
  173. {
  174. if ((unscaling_layer.statistics[i].maximum - unscaling_layer.statistics[i].minimum) < 1e-99)
  175. {
  176. outputs[i] = inputs[i];
  177. }
  178. else
  179. {
  180. outputs[i] = 0.5 * (inputs[i] + 1.0) * (unscaling_layer.statistics[i].maximum - unscaling_layer.statistics[i].minimum) + unscaling_layer.statistics[i].minimum;
  181. }
  182. }
  183. return outputs;
  184. }
  185.  
  186. layout(local_size_x = 32, local_size_y = 32) in;
  187.  
  188. /*
  189. * Inputs
  190. * */
  191. uniform vec3 camera_position;
  192. uniform vec3 point_light_position;
  193. uniform sampler2D gPositionDepth;
  194. uniform sampler2D gNormal;
  195.  
  196. struct NeuralNetwork
  197. {
  198. ScalingLayer scaling_layer;
  199. MultilayerPerceptron multilayer_perceptron;
  200. UnscalingLayer unscaling_layer;
  201. };
  202.  
  203. // NeuralNetwork (SSBO)
  204. layout(std430, binding=4) buffer nn
  205. {
  206. NeuralNetwork neural_network;
  207. };
  208.  
  209. // Output
  210. layout(rgba32f, binding = 0) uniform image2D img_output;
  211.  
  212. void main()
  213. {
  214. ivec2 pixel_coords = ivec2(gl_GlobalInvocationID.xy);
  215.  
  216. ivec2 dims = imageSize(img_output); // fetch image dimensions
  217. float x = (float(pixel_coords.x ) * (1.0 / dims.x));
  218. float y = (float(pixel_coords.y ) * (1.0 / dims.y));
  219.  
  220. vec2 texCoords = vec2(x,y);
  221.  
  222. float inputs[12];
  223. // frag pos, camera, position light, normal
  224.  
  225.  
  226. inputs[0] = texture(gPositionDepth, texCoords).r;
  227. inputs[1] = texture(gPositionDepth, texCoords).g;
  228. inputs[2] = texture(gPositionDepth, texCoords).b;
  229. inputs[3] = camera_position.x;
  230. inputs[4] = camera_position.y;
  231. inputs[5] = camera_position.z;
  232. inputs[6] = point_light_position.x;
  233. inputs[7] = point_light_position.y;
  234. inputs[8] = point_light_position.z;
  235. inputs[9] = texture(gNormal, texCoords).r;
  236. inputs[10] = texture(gNormal, texCoords).g;
  237. inputs[11] = texture(gNormal, texCoords).b;
  238.  
  239. float outputs_scaling[MAX_STATISTICS_SIZE];
  240. float outputs_multilayer[MAX_STATISTICS_SIZE];
  241.  
  242. outputs_scaling = ScalingLayerCalculateOutputs(inputs, neural_network.scaling_layer);
  243. outputs_multilayer = MultilayerPerceptronCalculateOutputs(outputs_scaling, neural_network.multilayer_perceptron);
  244. //outputs_scaling = UnscalingLayerCalculateOutputs(outputs_multilayer, neural_network.unscaling_layer);
  245.  
  246. // output to a secific pixel in the image
  247. vec4 pixel = vec4(outputs_scaling[9], outputs_scaling[10], outputs_scaling[11], 1.0);
  248. imageStore (img_output, pixel_coords, pixel);
  249.  
  250. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement