blob: 29bcb0346333717793901a1ad9f445d4e3378be0 [file] [log] [blame]
Jean-Marc Valin3ff7e1a2018-11-03 02:39:15 -04001#!/usr/bin/python3
2
3from __future__ import print_function
4
5from keras.models import Sequential
6from keras.models import Model
7from keras.layers import Input
8from keras.layers import Dense
9from keras.layers import LSTM
10from keras.layers import GRU
11from keras.layers import CuDNNGRU
12from keras.layers import SimpleRNN
13from keras.layers import Dropout
14from keras import losses
15import h5py
16from keras.optimizers import Adam
17
18from keras.constraints import Constraint
19from keras import backend as K
20import numpy as np
21
22import tensorflow as tf
23from keras.backend.tensorflow_backend import set_session
24config = tf.ConfigProto()
25config.gpu_options.per_process_gpu_memory_fraction = 0.44
26set_session(tf.Session(config=config))
27
28def binary_crossentrop2(y_true, y_pred):
29 return K.mean(2*K.abs(y_true-0.5) * K.binary_crossentropy(y_true, y_pred), axis=-1)
30
31def binary_accuracy2(y_true, y_pred):
32 return K.mean(K.cast(K.equal(y_true, K.round(y_pred)), 'float32') + K.cast(K.equal(y_true, 0.5), 'float32'), axis=-1)
33
34def quant_model(model):
35 weights = model.get_weights()
36 for k in range(len(weights)):
37 weights[k] = np.maximum(-128, np.minimum(127, np.round(128*weights[k])*0.0078125))
38 model.set_weights(weights)
39
40class WeightClip(Constraint):
41 '''Clips the weights incident to each hidden unit to be inside a range
42 '''
43 def __init__(self, c=2):
44 self.c = c
45
46 def __call__(self, p):
47 return K.clip(p, -self.c, self.c)
48
49 def get_config(self):
50 return {'name': self.__class__.__name__,
51 'c': self.c}
52
53reg = 0.000001
54constraint = WeightClip(.998)
55
56print('Build model...')
57
58main_input = Input(shape=(None, 25), name='main_input')
59x = Dense(32, activation='tanh', kernel_constraint=constraint, bias_constraint=constraint)(main_input)
60#x = CuDNNGRU(24, return_sequences=True, kernel_constraint=constraint, recurrent_constraint=constraint, bias_constraint=constraint)(x)
61x = GRU(24, recurrent_activation='sigmoid', activation='tanh', return_sequences=True, kernel_constraint=constraint, recurrent_constraint=constraint, bias_constraint=constraint)(x)
62x = Dense(2, activation='sigmoid', kernel_constraint=constraint, bias_constraint=constraint)(x)
63model = Model(inputs=main_input, outputs=x)
64
65batch_size = 2048
66
67print('Loading data...')
68with h5py.File('features10b.h5', 'r') as hf:
69 all_data = hf['data'][:]
70print('done.')
71
72window_size = 1500
73
74nb_sequences = len(all_data)//window_size
75print(nb_sequences, ' sequences')
76x_train = all_data[:nb_sequences*window_size, :-2]
77x_train = np.reshape(x_train, (nb_sequences, window_size, 25))
78
79y_train = np.copy(all_data[:nb_sequences*window_size, -2:])
80y_train = np.reshape(y_train, (nb_sequences, window_size, 2))
81
82print("Marking ignores")
83for s in y_train:
84 for e in s:
85 if (e[1] >= 1):
86 break
87 e[0] = 0.5
88
89all_data = 0;
90x_train = x_train.astype('float32')
91y_train = y_train.astype('float32')
92
93print(len(x_train), 'train sequences. x shape =', x_train.shape, 'y shape = ', y_train.shape)
94
95model.load_weights('newweights10a1b_ep206.hdf5')
96
97#weights = model.get_weights()
98#for k in range(len(weights)):
99# weights[k] = np.round(128*weights[k])*0.0078125
100#model.set_weights(weights)
101
102# try using different optimizers and different optimizer configs
103model.compile(loss=binary_crossentrop2,
104 optimizer=Adam(0.0001),
105 metrics=[binary_accuracy2])
106
107print('Train...')
108quant_model(model)
109model.fit(x_train, y_train,
110 batch_size=batch_size,
111 epochs=10, validation_data=(x_train, y_train))
112model.save("newweights10a1c_ep10.hdf5")
113
114quant_model(model)
115model.fit(x_train, y_train,
116 batch_size=batch_size,
117 epochs=50, initial_epoch=10)
118model.save("newweights10a1c_ep50.hdf5")
119
120model.compile(loss=binary_crossentrop2,
121 optimizer=Adam(0.0001),
122 metrics=[binary_accuracy2])
123
124quant_model(model)
125model.fit(x_train, y_train,
126 batch_size=batch_size,
127 epochs=100, initial_epoch=50)
128model.save("newweights10a1c_ep100.hdf5")
129
130quant_model(model)
131model.fit(x_train, y_train,
132 batch_size=batch_size,
133 epochs=150, initial_epoch=100)
134model.save("newweights10a1c_ep150.hdf5")
135
136quant_model(model)
137model.fit(x_train, y_train,
138 batch_size=batch_size,
139 epochs=200, initial_epoch=150)
140model.save("newweights10a1c_ep200.hdf5")
141
142quant_model(model)
143model.fit(x_train, y_train,
144 batch_size=batch_size,
145 epochs=201, initial_epoch=200)
146model.save("newweights10a1c_ep201.hdf5")
147
148quant_model(model)
149model.fit(x_train, y_train,
150 batch_size=batch_size,
151 epochs=202, initial_epoch=201, validation_data=(x_train, y_train))
152model.save("newweights10a1c_ep202.hdf5")
153
154quant_model(model)
155model.fit(x_train, y_train,
156 batch_size=batch_size,
157 epochs=203, initial_epoch=202, validation_data=(x_train, y_train))
158model.save("newweights10a1c_ep203.hdf5")
159
160quant_model(model)
161model.fit(x_train, y_train,
162 batch_size=batch_size,
163 epochs=204, initial_epoch=203, validation_data=(x_train, y_train))
164model.save("newweights10a1c_ep204.hdf5")
165
166quant_model(model)
167model.fit(x_train, y_train,
168 batch_size=batch_size,
169 epochs=205, initial_epoch=204, validation_data=(x_train, y_train))
170model.save("newweights10a1c_ep205.hdf5")
171
172quant_model(model)
173model.fit(x_train, y_train,
174 batch_size=batch_size,
175 epochs=206, initial_epoch=205, validation_data=(x_train, y_train))
176model.save("newweights10a1c_ep206.hdf5")
177