my_average_pooling.py 1011 B

12345678910111213141516171819202122232425262728293031
  1. from keras import backend as K
  2. from keras.engine.topology import Layer
  3. import tensorflow as tf
  4. class MyAveragePooling1D(Layer):
  5. def __init__(self, axis, **kwargs):
  6. self.supports_masking = True
  7. self.axis = axis
  8. super(MyAveragePooling1D, self).__init__(**kwargs)
  9. def compute_mask(self, input, input_mask=None):
  10. # need not to pass the mask to next layers
  11. return None
  12. def call(self, x, mask=None):
  13. if mask is not None:
  14. mask = K.repeat(mask, x.shape[-1])
  15. mask = tf.transpose(mask, [0,2,1])
  16. mask = K.cast(mask, K.floatx())
  17. x = x * mask
  18. return K.sum(x, axis=self.axis) / K.sum(mask, axis=self.axis)
  19. else:
  20. return K.mean(x, axis=self.axis)
  21. def compute_output_shape(self, input_shape):
  22. output_shape = []
  23. for i in range(len(input_shape)):
  24. if i != self.axis:
  25. output_shape.append(input_shape[i])
  26. return tuple(output_shape)