mirror of https://github.com/drowe67/phasenn.git
fixed custom loss function - good matches and even overfitting - but still probs with UV
parent
5c19633779
commit
c1484a76c1
|
@ -56,8 +56,10 @@ for i in range(nb_samples):
|
||||||
amp[i,bin] = np.log10(A[i,m])
|
amp[i,bin] = np.log10(A[i,m])
|
||||||
#phase_rect[i,2*bin] = np.max((1,amp[i,bin]))*np.cos(phase[i,m])
|
#phase_rect[i,2*bin] = np.max((1,amp[i,bin]))*np.cos(phase[i,m])
|
||||||
#phase_rect[i,2*bin+1] = np.max((1,amp[i,bin]))*np.sin(phase[i,m])
|
#phase_rect[i,2*bin+1] = np.max((1,amp[i,bin]))*np.sin(phase[i,m])
|
||||||
phase_rect[i,2*bin] = amp[i,bin]*np.cos(phase[i,m])
|
#phase_rect[i,2*bin] = amp[i,bin]*np.cos(phase[i,m])
|
||||||
phase_rect[i,2*bin+1] = amp[i,bin]*np.sin(phase[i,m])
|
#phase_rect[i,2*bin+1] = amp[i,bin]*np.sin(phase[i,m])
|
||||||
|
phase_rect[i,2*bin] = np.cos(phase[i,m])
|
||||||
|
phase_rect[i,2*bin+1] = np.sin(phase[i,m])
|
||||||
|
|
||||||
# our model
|
# our model
|
||||||
model = models.Sequential()
|
model = models.Sequential()
|
||||||
|
@ -66,24 +68,28 @@ model.add(layers.Dense(4*pairs, activation='relu'))
|
||||||
model.add(layers.Dense(pairs))
|
model.add(layers.Dense(pairs))
|
||||||
model.summary()
|
model.summary()
|
||||||
|
|
||||||
# custom loss function
|
# custom loss function - we only care about (cos,sin) outputs at the
|
||||||
|
# non-zero positions in the sparse y_true vector. To avoid driving the
|
||||||
|
# other samples to 0 we use a sparse loss function. The normalisation
|
||||||
|
# term accounts for the time varying number of no-zero samples.
|
||||||
def sparse_loss(y_true, y_pred):
|
def sparse_loss(y_true, y_pred):
|
||||||
mask = K.cast( K.not_equal(y_pred, 0), dtype='float32')
|
mask = K.cast( K.not_equal(y_true, 0), dtype='float32')
|
||||||
n = K.sum(mask)
|
n = K.sum(mask)
|
||||||
return K.sum(K.square((y_pred - y_true)*mask))/n
|
return K.sum(K.square((y_pred - y_true)*mask))/n
|
||||||
|
|
||||||
# testing custom loss function
|
# testing custom loss function
|
||||||
x = Input(shape=(None,))
|
y_true = Input(shape=(None,))
|
||||||
y = Input(shape=(None,))
|
y_pred = Input(shape=(None,))
|
||||||
loss_func = K.Function([x, y], [sparse_loss(x, y)])
|
loss_func = K.Function([y_true, y_pred], [sparse_loss(y_true, y_pred)])
|
||||||
assert loss_func([[[1,1,1]], [[0,2,0]]]) == np.array([1])
|
assert loss_func([[[0,1,0]], [[2,2,2]]]) == np.array([1])
|
||||||
|
assert loss_func([[[1,1,0]], [[3,2,2]]]) == np.array([2.5])
|
||||||
assert loss_func([[[0,1,0]], [[0,2,0]]]) == np.array([1])
|
assert loss_func([[[0,1,0]], [[0,2,0]]]) == np.array([1])
|
||||||
|
|
||||||
# fit the model
|
# fit the model
|
||||||
from keras import optimizers
|
from keras import optimizers
|
||||||
sgd = optimizers.SGD(lr=0.8, decay=1e-6, momentum=0.9, nesterov=True)
|
sgd = optimizers.SGD(lr=0.05, decay=1e-6, momentum=0.9, nesterov=True)
|
||||||
model.compile(loss=sparse_loss, optimizer=sgd)
|
model.compile(loss=sparse_loss, optimizer=sgd)
|
||||||
history = model.fit(amp, phase_rect, batch_size=nb_batch, epochs=args.epochs)
|
history = model.fit(amp, phase_rect, batch_size=nb_batch, epochs=args.epochs, validation_split=0.1)
|
||||||
model.save(args.nnout)
|
model.save(args.nnout)
|
||||||
|
|
||||||
# measure error in angle over all samples
|
# measure error in angle over all samples
|
||||||
|
@ -113,11 +119,14 @@ def sample_time(r, phase):
|
||||||
s = s + A[r,m]*np.cos(m*Wo[r]*range(-N,N) + phase[r,m])
|
s = s + A[r,m]*np.cos(m*Wo[r]*range(-N,N) + phase[r,m])
|
||||||
return s
|
return s
|
||||||
|
|
||||||
nb_plotsy = np.floor(np.sqrt(nb_plots)); nb_plotsx=nb_plots/nb_plotsy;
|
|
||||||
frames = np.array(args.frames,dtype=int)
|
frames = np.array(args.frames,dtype=int)
|
||||||
|
nb_plots = frames.size
|
||||||
|
nb_plotsy = np.floor(np.sqrt(nb_plots)); nb_plotsx=nb_plots/nb_plotsy;
|
||||||
|
|
||||||
plt.figure(1)
|
plt.figure(1)
|
||||||
plt.plot(history.history['loss'])
|
plt.plot(history.history['loss'])
|
||||||
|
plt.plot(history.history['val_loss'])
|
||||||
|
plt.legend(['train', 'valid'], loc='upper right')
|
||||||
plt.title('model loss')
|
plt.title('model loss')
|
||||||
plt.xlabel('epoch')
|
plt.xlabel('epoch')
|
||||||
plt.show(block=False)
|
plt.show(block=False)
|
||||||
|
|
15
train.sh
15
train.sh
|
@ -4,9 +4,16 @@
|
||||||
|
|
||||||
PATH=$PATH:~/codec2/build_linux/src:~/codec2/build_linux/misc
|
PATH=$PATH:~/codec2/build_linux/src:~/codec2/build_linux/misc
|
||||||
|
|
||||||
speech=~/Downloads/train_8k.sw
|
if [ "$#" -eq 0 ]; then
|
||||||
|
echo "usage: ./train.sh rawFile [secs]"
|
||||||
|
fi
|
||||||
|
|
||||||
|
speech=$1
|
||||||
x=$(basename $speech)
|
x=$(basename $speech)
|
||||||
base="${x%.*}"
|
base="${x%.*}"
|
||||||
|
if [ "$#" -eq 2 ]; then
|
||||||
sox -t .sw -r 8000 -c 1 $speech -t .sw - trim 0 6000 | c2sim - --modelout - | est_n0 -r > $base'_nolinear.model'
|
sox -t .sw -r 8000 -c 1 $speech -t .sw - trim 0 $2 | c2sim - --modelout - | est_n0 -r > $base'_nolinear.model'
|
||||||
./phasenn_train.py $base'_nolinear.model' --frames 1572,1908,6792,9600,24536,25116 --epochs 200
|
else
|
||||||
|
c2sim $speech --modelout - | est_n0 -r > $base'_nolinear.model'
|
||||||
|
fi
|
||||||
|
./phasenn_train.py $base'_nolinear.model' --frames 1572,1908,6792,9600,24536,25116 --epochs 10
|
||||||
|
|
Loading…
Reference in New Issue