In [5]:
import dml.data as D
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import random
import seaborn
import sklearn.metrics as M
import sklearn.neighbors as N
seaborn.set()
%matplotlib inline
In [13]:
num_train = 50000
num_valid = 5000
In [7]:
train = pd.read_json("/media/ejhumphrey/workspace/icml-dml/datasets/train.json")
valid = pd.read_json("/media/ejhumphrey/workspace/icml-dml/datasets/valid.json")
test = pd.read_json("/media/ejhumphrey/workspace/icml-dml/datasets/test.json")
In [14]:
In [8]:
# Instrument embedding
inst_full = pd.read_json(
"/media/ejhumphrey/workspace/icml-dml/embeddings/"
"instrument-000-050000-20160611_18h21m39s/output_index.json")
In [6]:
x_train, y_train = D.sample_embeddings(inst_full.loc[train.index], num_train)
In [8]:
x_valid, y_valid = D.sample_embeddings(inst_full.loc[valid.index], num_valid)
In [59]:
knn_inst = N.KNeighborsClassifier(75).fit(x_train, y_train.instrument)
num_inst_classes = len(knn_inst.classes_)
In [10]:
print("Train: {:.4f}\tValid: {:.4f}".format(
knn_inst.score(x_train, y_train.instrument),
knn_inst.score(x_valid, y_valid.instrument)))
In [39]:
train_confmat = M.confusion_matrix(y_train.instrument, knn_inst.predict(x_train))
norm = 1.*train_confmat.sum(axis=0, keepdims=True)
norm[norm == 0] = 1.0
In [60]:
fig, ax = plt.subplots(1, 1, figsize=(10, 10))
ax.imshow(train_confmat / norm, vmin=0, vmax=1.0,
aspect='equal', interpolation='nearest')
ax.set_yticks(range(num_inst_classes))
ax.set_yticklabels(knn_inst.classes_)
ax.set_xticks(range(num_inst_classes))
ax.set_xticklabels(knn_inst.classes_);
In [68]:
fig, ax = plt.subplots(1, 1, figsize=(14, 6))
ax.bar(range(num_inst_classes),
(train_confmat / norm)[[range(num_inst_classes)]*2])
ax.set_xticks(np.arange(len(knn_inst.classes_))+0.45)
ax.set_xticklabels(knn_inst.classes_)
ax.set_ylim(0, 1)
ax.set_xlim(0, num_inst_classes);
In [21]:
knn_pitch = N.KNeighborsClassifier(75).fit(x_train, y_train.note_number)
print("Train: {:.4f}\tValid: {:.4f}".format(
knn_pitch.score(x_train, y_train.note_number),
knn_pitch.score(x_valid, y_valid.note_number)))
In [44]:
train_pitch_confmat = M.confusion_matrix(y_train.note_number, knn_pitch.predict(x_train))
pitch_norm = 1.*train_pitch_confmat.sum(axis=0, keepdims=True)
pitch_norm[pitch_norm == 0] = 1.0
In [45]:
fig, ax = plt.subplots(1, 1, figsize=(10, 10))
ax.imshow(train_pitch_confmat / pitch_norm, vmin=0, vmax=1.0,
aspect='equal', interpolation='nearest')
Out[45]:
In [70]:
num_pitches = len(train_pitch_confmat)
fig, ax = plt.subplots(1, 1, figsize=(14, 6))
ax.bar(range(num_pitches),
(train_pitch_confmat / pitch_norm)[[range(num_pitches)]*2])
# ax.set_xticks(np.arange(len(knn_inst.classes_))+0.45)
# ax.set_xticklabels(knn_inst.classes_)
ax.set_ylim(0, 1)
ax.set_xlim(0, num_pitches);
In [46]:
# Instrument embedding
pitch_full = pd.read_json(
"/media/ejhumphrey/workspace/icml-dml/embeddings/"
"pitch-000-050000-20160611_21h02m48s/output_index.json")
In [17]:
def do_the_thing(dframe, train, valid, num_train, num_valid):
num_inst_classes = len(train.instrument.unique())
num_pitches = len(train.note_number.unique())
x_train, y_train = D.sample_embeddings(dframe.loc[train.index], num_train)
x_valid, y_valid = D.sample_embeddings(dframe.loc[valid.index], num_valid)
knn_inst = N.KNeighborsClassifier(75).fit(x_train, y_train.instrument)
print("Instrument!\nTrain: {:.4f}\tValid: {:.4f}".format(
knn_inst.score(x_train, y_train.instrument),
knn_inst.score(x_valid, y_valid.instrument)))
inst_confmat = M.confusion_matrix(y_valid.instrument, knn_inst.predict(x_valid))
inst_norm = 1.*inst_confmat.sum(axis=0, keepdims=True)
inst_norm[inst_norm == 0] = 1.0
fig, ax = plt.subplots(1, 1, figsize=(14, 4))
ax.bar(range(num_inst_classes),
(inst_confmat / inst_norm)[[range(num_inst_classes)]*2])
ax.set_xticks(np.arange(len(knn_inst.classes_))+0.45)
ax.set_xticklabels(knn_inst.classes_)
ax.set_ylim(0, 1)
ax.set_xlim(0, num_inst_classes);
ax.set_xlabel("Instrument Class")
ax.set_ylabel("Accuracy")
knn_pitch = N.KNeighborsClassifier(75).fit(x_train, y_train.note_number)
print("Pitch!\nTrain: {:.4f}\tValid: {:.4f}".format(
knn_pitch.score(x_train, y_train.note_number),
knn_pitch.score(x_valid, y_valid.note_number)))
pitch_confmat = M.confusion_matrix(y_valid.note_number, knn_pitch.predict(x_valid))
pitch_norm = 1.*pitch_confmat.sum(axis=0, keepdims=True)
pitch_norm[pitch_norm == 0] = 1.0
num_pitches = pitch_confmat.shape[0]
# print(pitch_confmat.shape)
fig, ax = plt.subplots(1, 1, figsize=(14, 4))
ax.bar(range(num_pitches),
(pitch_confmat / pitch_norm)[[range(num_pitches)]*2])
ax.set_ylim(0, 1)
ax.set_xlim(0, num_pitches);
ax.set_xlabel("Pitch (semitones)")
ax.set_ylabel("Accuracy")
In [18]:
# Instrument embedding
inst_full = pd.read_json(
"/media/ejhumphrey/workspace/icml-dml/embeddings/"
"instrument-000-050000-20160611_18h21m39s/output_index.json")
do_the_thing(inst_full, train, test, 100000, 50000)
In [19]:
# Pitch embedding
pitch_full = pd.read_json(
"/media/ejhumphrey/workspace/icml-dml/embeddings/"
"pitch-000-050000-20160611_21h02m48s/output_index.json")
do_the_thing(pitch_full, train, test, 100000, 50000)
In [20]:
# Instrument-pitch embedding
instpitch_full = pd.read_json(
"/media/ejhumphrey/workspace/icml-dml/embeddings/"
"instpitch-000-050000-20160611_23h46m35s/output_index.json")
do_the_thing(instpitch_full, train, test, 100000, 50000)
In [21]:
# Instrument-pitch-d2 embedding
instpitch_d2_full = pd.read_json(
"/media/ejhumphrey/workspace/icml-dml/embeddings/"
"instpitch-d2-000-050000-20160612_02h32m03s/output_index.json")
do_the_thing(instpitch_d2_full, train, test, 100000, 50000)
In [86]:
x_train, y_train = D.sample_embeddings(instpitch_full.loc[train.index], 100000)
x_test, y_test = D.sample_embeddings(instpitch_full.loc[test.index], 50000)
In [148]:
inst_classes = sorted(y_test.instrument.unique())
class_map = {k: n for n, k in enumerate(inst_classes)}
y_train['instrument_idx'] = [class_map[c] for c in y_train.instrument]
y_test['instrument_idx'] = [class_map[c] for c in y_test.instrument]
In [105]:
x_vectors = []
for n in range(10000):
vi_idx = random.choice(y_test[(y_test.instrument == 'trc') & (y_test.note_number == 48)].index)
vc_idx = random.choice(y_test[(y_test.instrument == 'ho') & (y_test.note_number == 48)].index)
trc_idx = random.choice(y_test[(y_test.instrument == 'klb') & (y_test.note_number == 48)].index)
x_vectors.append(x_test[vc_idx] - x_test[vi_idx] + x_test[trc_idx])
In [152]:
knn = N.KNeighborsClassifier(75).fit(x_train, y_train.instrument_idx)
In [157]:
x_vectors = []
for n in range(10000):
a1_idx = random.choice(y_test[(y_test.instrument_idx == class_map['sxt'])].index)
a0_idx = random.choice(y_test[(y_test.instrument_idx == class_map['sxs'])].index)
b0_idx = random.choice(y_test[(y_test.instrument_idx == class_map['ho'])].index)
x_vectors.append(x_test[a1_idx] - x_test[a0_idx] + x_test[b0_idx])
counts = np.bincount(knn.predict(np.asarray(x_vectors)).astype(np.int32))
idx = counts.argsort()[:-6:-1]
print(counts[idx], np.array(inst_classes)[idx])
In [158]:
# bp -- bass trombone
# tp -- tenor trombone
# kb -- bass
# bt -- bass trumpet
In [167]:
x_vectors = []
for n in range(10000):
a1_idx = random.choice(y_test[(y_test.instrument_idx == class_map['sxt'])].index)
a0_idx = random.choice(y_test[(y_test.instrument_idx == class_map['vc'])].index)
b0_idx = random.choice(y_test[(y_test.instrument_idx == class_map['vi'])].index)
x_vectors.append(x_test[a1_idx] - x_test[a0_idx] + x_test[b0_idx])
counts = np.bincount(knn.predict(np.asarray(x_vectors)).astype(np.int32))
idx = counts.argsort()[:-6:-1]
print(counts[idx], np.array(inst_classes)[idx])
In [ ]:
#
#
#
In [156]:
counts = np.bincount(knn.predict(np.asarray(x_vectors)).astype(np.int32))
idx = counts.argsort()[:-6:-1]
print(counts[idx], np.array(inst_classes)[idx])
In [130]:
knn = N.KNeighborsClassifier(75).fit(x_train, y_train.note_number)
In [171]:
x_vectors = []
for n in range(10000):
a1_idx = random.choice(y_test[(y_test.note_number == 60) & (y_test.instrument_idx == class_map['ho'])].index)
a0_idx = random.choice(y_test[(y_test.note_number == 55) & (y_test.instrument_idx == class_map['ho'])].index)
b0_idx = random.choice(y_test[(y_test.note_number == 40) & (y_test.instrument_idx == class_map['ho'])].index)
x_vectors.append(x_test[a1_idx] - x_test[a0_idx] + x_test[b0_idx])
counts = np.bincount(knn.predict(np.asarray(x_vectors)).astype(np.int32))
idx = counts.argsort()[:-6:-1]
print(counts[idx], idx)
In [ ]: