rnn_train.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #!/usr/bin/python
  2. from __future__ import print_function
  3. import keras
  4. from keras.models import Sequential
  5. from keras.models import Model
  6. from keras.layers import Input
  7. from keras.layers import Dense
  8. from keras.layers import LSTM
  9. from keras.layers import GRU
  10. from keras.layers import SimpleRNN
  11. from keras.layers import Dropout
  12. from keras.layers import concatenate
  13. from keras import losses
  14. from keras import regularizers
  15. from keras.constraints import min_max_norm
  16. import h5py
  17. from keras.constraints import Constraint
  18. from keras import backend as K
  19. import numpy as np
  20. #import tensorflow as tf
  21. #from keras.backend.tensorflow_backend import set_session
  22. #config = tf.ConfigProto()
  23. #config.gpu_options.per_process_gpu_memory_fraction = 0.42
  24. #set_session(tf.Session(config=config))
  25. def my_crossentropy(y_true, y_pred):
  26. return K.mean(2*K.abs(y_true-0.5) * K.binary_crossentropy(y_pred, y_true), axis=-1)
  27. def mymask(y_true):
  28. return K.minimum(y_true+1., 1.)
  29. def msse(y_true, y_pred):
  30. return K.mean(mymask(y_true) * K.square(K.sqrt(y_pred) - K.sqrt(y_true)), axis=-1)
  31. def mycost(y_true, y_pred):
  32. return K.mean(mymask(y_true) * (10*K.square(K.square(K.sqrt(y_pred) - K.sqrt(y_true))) + K.square(K.sqrt(y_pred) - K.sqrt(y_true)) + 0.01*K.binary_crossentropy(y_pred, y_true)), axis=-1)
  33. def my_accuracy(y_true, y_pred):
  34. return K.mean(2*K.abs(y_true-0.5) * K.equal(y_true, K.round(y_pred)), axis=-1)
  35. class WeightClip(Constraint):
  36. '''Clips the weights incident to each hidden unit to be inside a range
  37. '''
  38. def __init__(self, c=2):
  39. self.c = c
  40. def __call__(self, p):
  41. return K.clip(p, -self.c, self.c)
  42. def get_config(self):
  43. return {'name': self.__class__.__name__,
  44. 'c': self.c}
  45. reg = 0.000001
  46. constraint = WeightClip(0.499)
  47. print('Build model...')
  48. main_input = Input(shape=(None, 42), name='main_input')
  49. tmp = Dense(24, activation='tanh', name='input_dense', kernel_constraint=constraint, bias_constraint=constraint)(main_input)
  50. vad_gru = GRU(24, activation='tanh', recurrent_activation='sigmoid', return_sequences=True, name='vad_gru', kernel_regularizer=regularizers.l2(reg), recurrent_regularizer=regularizers.l2(reg), kernel_constraint=constraint, recurrent_constraint=constraint, bias_constraint=constraint)(tmp)
  51. vad_output = Dense(1, activation='sigmoid', name='vad_output', kernel_constraint=constraint, bias_constraint=constraint)(vad_gru)
  52. noise_input = keras.layers.concatenate([tmp, vad_gru, main_input])
  53. noise_gru = GRU(48, activation='relu', recurrent_activation='sigmoid', return_sequences=True, name='noise_gru', kernel_regularizer=regularizers.l2(reg), recurrent_regularizer=regularizers.l2(reg), kernel_constraint=constraint, recurrent_constraint=constraint, bias_constraint=constraint)(noise_input)
  54. denoise_input = keras.layers.concatenate([vad_gru, noise_gru, main_input])
  55. denoise_gru = GRU(96, activation='tanh', recurrent_activation='sigmoid', return_sequences=True, name='denoise_gru', kernel_regularizer=regularizers.l2(reg), recurrent_regularizer=regularizers.l2(reg), kernel_constraint=constraint, recurrent_constraint=constraint, bias_constraint=constraint)(denoise_input)
  56. denoise_output = Dense(22, activation='sigmoid', name='denoise_output', kernel_constraint=constraint, bias_constraint=constraint)(denoise_gru)
  57. model = Model(inputs=main_input, outputs=[denoise_output, vad_output])
  58. model.compile(loss=[mycost, my_crossentropy],
  59. metrics=[msse],
  60. optimizer='adam', loss_weights=[10, 0.5])
  61. batch_size = 32
  62. print('Loading data...')
  63. with h5py.File('training.h5', 'r') as hf:
  64. all_data = hf['data'][:]
  65. print('done.')
  66. window_size = 2000
  67. nb_sequences = len(all_data)//window_size
  68. print(nb_sequences, ' sequences')
  69. x_train = all_data[:nb_sequences*window_size, :42]
  70. x_train = np.reshape(x_train, (nb_sequences, window_size, 42))
  71. y_train = np.copy(all_data[:nb_sequences*window_size, 42:64])
  72. y_train = np.reshape(y_train, (nb_sequences, window_size, 22))
  73. noise_train = np.copy(all_data[:nb_sequences*window_size, 64:86])
  74. noise_train = np.reshape(noise_train, (nb_sequences, window_size, 22))
  75. vad_train = np.copy(all_data[:nb_sequences*window_size, 86:87])
  76. vad_train = np.reshape(vad_train, (nb_sequences, window_size, 1))
  77. all_data = 0;
  78. #x_train = x_train.astype('float32')
  79. #y_train = y_train.astype('float32')
  80. print(len(x_train), 'train sequences. x shape =', x_train.shape, 'y shape = ', y_train.shape)
  81. print('Train...')
  82. model.fit(x_train, [y_train, vad_train],
  83. batch_size=batch_size,
  84. epochs=120,
  85. validation_split=0.1)
  86. model.save("weights.hdf5")