def create_classifier_base(n_input_hops, n_filters, n_hidden_units, kernel_size, pool_size, base_wd=0.001): # Input n_mels = localmodule.get_pcen_settings()["top_freq_id"] tfr_input = keras.layers.Input(shape=(n_mels, n_input_hops, 1), name="tfr_input") # Layer 1 bn = keras.layers.normalization.BatchNormalization()(tfr_input) conv1 = keras.layers.Convolution2D(n_filters[0], kernel_size, padding="same", kernel_initializer="he_normal", activation="relu", name="conv1")(bn) pool1 = keras.layers.MaxPooling2D(pool_size=pool_size, name="pool1")(conv1) # Layer 2 conv2 = keras.layers.Convolution2D(n_filters[1], kernel_size, padding="same", kernel_initializer="he_normal", activation="relu", name="conv2")(pool1) pool2 = keras.layers.MaxPooling2D(pool_size=pool_size, name="pool2")(conv2) # Layer 3 conv3 = keras.layers.Convolution2D(n_filters[2], kernel_size, padding="same", kernel_initializer="he_normal", activation="relu", name="conv3")(pool2) # Layer 4 flatten = keras.layers.Flatten()(conv3) dense1 = keras.layers.Dense(n_hidden_units, kernel_initializer="he_normal", activation="relu", kernel_regularizer=keras.regularizers.l2(base_wd), use_bias=False, name="dense1")(flatten) return tfr_input, dense1
def create_hierarchical_baseline_model(n_input_hops, n_filters, n_hidden_units, kernel_size, pool_size, base_wd): # Input n_mels = localmodule.get_pcen_settings()["top_freq_id"] tfr_input = keras.layers.Input(shape=(n_mels, n_input_hops, 1), name="tfr_input") # Layer 1 bn = keras.layers.normalization.BatchNormalization()(tfr_input) conv1 = keras.layers.Convolution2D(n_filters[0], kernel_size, padding="same", kernel_initializer="he_normal", activation="relu", name="conv1")(bn) pool1 = keras.layers.MaxPooling2D(pool_size=pool_size, name="pool1")(conv1) # Layer 2 conv2 = keras.layers.Convolution2D(n_filters[1], kernel_size, padding="same", kernel_initializer="he_normal", activation="relu", name="conv2")(pool1) pool2 = keras.layers.MaxPooling2D(pool_size=pool_size, name="pool2")(conv2) # Layer 3 conv3 = keras.layers.Convolution2D(n_filters[2], kernel_size, padding="same", kernel_initializer="he_normal", activation="relu", name="conv3")(pool2) # Layer 4 flattened = keras.layers.Flatten()(conv3) wd = base_wd / 43.0 y_coarse = keras.layers.Dense(annotations.NUM_MOD_COARSE - 1, kernel_initializer="normal", activation="sigmoid", kernel_regularizer=keras.regularizers.l2(wd), use_bias=False, name="y_coarse")(flattened) dense1 = keras.layers.Dense(n_hidden_units, kernel_initializer="he_normal", activation="relu", use_bias=False, kernel_regularizer=keras.regularizers.l2(base_wd))(flattened) wd = base_wd / (43.0 / annotations.NUM_MOD_MEDIUM) y_medium = keras.layers.Dense(annotations.NUM_MOD_MEDIUM, kernel_initializer="normal", activation="softmax", kernel_regularizer=keras.regularizers.l2(wd), use_bias=False, name="y_medium")(dense1) wd = base_wd / (43.0 / annotations.NUM_MOD_FINE) y_fine = keras.layers.Dense(annotations.NUM_MOD_FINE, kernel_initializer="normal", activation="softmax", kernel_regularizer=keras.regularizers.l2(wd), use_bias=False, name="y_fine")(dense1) return [tfr_input], [y_coarse, y_medium, y_fine]
import localmodule # Define constants. data_dir = localmodule.get_data_dir() dataset_name = localmodule.get_dataset_name() sample_rate = localmodule.get_sample_rate() args = sys.argv[1:] aug_str = args[0] instance_id = int(args[1]) instance_str = str(instance_id) unit_str = args[2] if aug_str == "original": instanced_aug_str = aug_str else: instanced_aug_str = "-".join([aug_str, instance_str]) pcen_settings = localmodule.get_pcen_settings() # Print header. start_time = int(time.time()) print(str(datetime.datetime.now()) + " Start.") print("Computing per-channel energy normalization (PCEN) for " +\ dataset_name + " clips, with domain-specific librosa parameters.") print("Unit: " + unit_str + ".") print("Augmentation: " + instanced_aug_str + ".") print("") print("h5py version: {:s}".format(h5py.__version__)) print("librosa version: {:s}".format(librosa.__version__)) print("") # Open HDF5 container of waveforms. hdf5_dataset_name = "_".join([dataset_name, "hdf5"])
def create_hierarchical_containment_model(n_input_hops, n_filters, n_hidden_units, kernel_size, pool_size, base_wd): # Input n_mels = localmodule.get_pcen_settings()["top_freq_id"] tfr_input = keras.layers.Input(shape=(n_mels, n_input_hops, 1), name="tfr_input") # Layer 1 bn = keras.layers.normalization.BatchNormalization()(tfr_input) conv1 = keras.layers.Convolution2D(n_filters[0], kernel_size, padding="same", kernel_initializer="he_normal", activation="relu", name="conv1")(bn) pool1 = keras.layers.MaxPooling2D(pool_size=pool_size, name="pool1")(conv1) # Layer 2 conv2 = keras.layers.Convolution2D(n_filters[1], kernel_size, padding="same", kernel_initializer="he_normal", activation="relu", name="conv2")(pool1) pool2 = keras.layers.MaxPooling2D(pool_size=pool_size, name="pool2")(conv2) # Layer 3 conv3 = keras.layers.Convolution2D(n_filters[2], kernel_size, padding="same", kernel_initializer="he_normal", activation="relu", name="conv3")(pool2) # Layer 4 coarse_layer = keras.layers.Flatten()(conv3) y_coarse = keras.layers.Lambda(hierarchical_containment_layer_sum_activation, name="y_coarse")(coarse_layer) # Don't include other num_medium_classes = len(annotations.MOD_MEDIUM_COUNTS) medium_children_counts = [0 for _ in range(num_medium_classes)] for medium_code, medium_count in annotations.MOD_MEDIUM_COUNTS.items(): medium_idx = annotations.MOD_MEDIUM_IDXS[medium_code] medium_children_counts[medium_idx] = medium_count - 1 med_props = np.array(medium_children_counts) / float(sum(medium_children_counts)) class_sublayer_sizes = partition(n_hidden_units, med_props) medium_layer = keras.layers.Dense(n_hidden_units, kernel_initializer="he_normal", activation="relu", use_bias=False, kernel_regularizer=keras.regularizers.l2(base_wd))(coarse_layer) medium_nodes = [] fine_sublayers = [] start = 0 for med_idx, (sublayer_size, fine_count) in enumerate(zip(class_sublayer_sizes, medium_children_counts)): medium_sublayer = keras.layers.Lambda(make_slice_func(int(start), int(start+sublayer_size)), name="medium_sublayer_{}".format(med_idx))(medium_layer) # med_node = keras.layers.Lambda(hierarchical_containment_layer_sum_activation)(medium_sublayer) medium_nodes.append(med_node) start += sublayer_size # Make fine layer wd = base_wd / (43.0 / fine_count) fine_sublayer = keras.layers.Dense(fine_count, kernel_initializer="he_normal", activation="relu", use_bias=False, kernel_regularizer=keras.regularizers.l2(wd), name="fine_sublayer_{}".format(med_idx))(medium_sublayer) fine_sublayers.append(fine_sublayer) medium_output = keras.layers.Concatenate()(medium_nodes) fine_layer = keras.layers.Concatenate()(fine_sublayers) fine_output = keras.layers.Lambda(K.tanh)(fine_layer) medium_other_output = keras.layers.Lambda(other_activation)(medium_output) fine_other_output = keras.layers.Lambda(other_activation)(fine_output) y_medium = keras.layers.Concatenate(name="y_medium")([medium_output, medium_other_output]) y_fine = keras.layers.Concatenate(name="y_fine")([fine_output, fine_other_output]) return [tfr_input], [y_coarse, y_medium, y_fine]
def create_taxonet_model(n_input_hops, n_filters, n_hidden_units, kernel_size, pool_size, base_wd): # Input n_mels = localmodule.get_pcen_settings()["top_freq_id"] tfr_input = keras.layers.Input(shape=(n_mels, n_input_hops, 1), name="tfr_input") # Layer 1 bn = keras.layers.normalization.BatchNormalization()(tfr_input) conv1 = keras.layers.Convolution2D(n_filters[0], kernel_size, padding="same", kernel_initializer="he_normal", activation="relu", name="conv1")(bn) pool1 = keras.layers.MaxPooling2D(pool_size=pool_size, name="pool1")(conv1) # Layer 2 conv2 = keras.layers.Convolution2D(n_filters[1], kernel_size, padding="same", kernel_initializer="he_normal", activation="relu", name="conv2")(pool1) pool2 = keras.layers.MaxPooling2D(pool_size=pool_size, name="pool2")(conv2) # Layer 3 conv3 = keras.layers.Convolution2D(n_filters[2], kernel_size, padding="same", kernel_initializer="he_normal", activation="relu", name="conv3")(pool2) # Layer 4 coarse_layer = keras.layers.Flatten()(conv3) # why do we divide it by 43 ? wd = base_wd / 43.0 # single output because coarse layer has only single taxa/class which is # Passeriforme in the original data y_coarse = keras.layers.Dense(1, kernel_initializer="normal", activation="sigmoid", kernel_regularizer=keras.regularizers.l2(wd), use_bias=False, name="y_coarse")(coarse_layer) # medium_children_counts: number of sub-taxa in the next layer # class_sublayer_sizes: number of neurons on the next layer correlated with # medium_children_counts # Don't include other num_medium_classes = len(annotations.MOD_MEDIUM_COUNTS) medium_children_counts = [0 for _ in range(num_medium_classes)] for medium_code, medium_count in annotations.MOD_MEDIUM_COUNTS.items(): medium_idx = annotations.MOD_MEDIUM_IDXS[medium_code] medium_children_counts[medium_idx] = int(medium_count - 1) # partition neurons correlated with number of childrens of the taxa, (paper # says this number is only children not grandchildren etc included) med_props = np.array(medium_children_counts) / float( sum(medium_children_counts)) class_sublayer_sizes = partition(n_hidden_units, med_props) # Adjust number of hidden units so that we nicely partition layer in terms of medium classes # sum(class_sublayer_sizes) should already be equal to the n_hidden_units actually # just making sure I guess ~? n_hidden_units = sum(class_sublayer_sizes) medium_layer = keras.layers.Dense( n_hidden_units, kernel_initializer="he_normal", activation="relu", use_bias=False, kernel_regularizer=keras.regularizers.l2(base_wd))(coarse_layer) medium_nodes = [] fine_sublayers = [] start = 0 for med_idx, (sublayer_size, fine_count) in enumerate( zip(class_sublayer_sizes, medium_children_counts)): medium_sublayer = keras.layers.Lambda( make_slice_func(int(start), int(start + sublayer_size)), name="medium_sublayer_{}".format(med_idx))(medium_layer) wd = base_wd / 43.0 med_node = keras.layers.Dense( 1, kernel_initializer="normal", activation="sigmoid", kernel_regularizer=keras.regularizers.l2(wd), use_bias=False)(medium_sublayer) medium_nodes.append(med_node) start += sublayer_size # Make fine layer wd = base_wd / (43.0 / fine_count) fine_sublayer = keras.layers.Dense( fine_count, kernel_initializer="he_normal", activation="sigmoid", use_bias=False, kernel_regularizer=keras.regularizers.l2(wd), name="fine_sublayer_{}".format(med_idx))(medium_sublayer) fine_sublayers.append(fine_sublayer) medium_output = keras.layers.Concatenate()(medium_nodes) fine_output = keras.layers.Concatenate()(fine_sublayers) medium_other_output = keras.layers.Lambda(other_activation)(medium_output) fine_other_output = keras.layers.Lambda(other_activation)(fine_output) y_medium = keras.layers.Concatenate(name="y_medium")( [medium_output, medium_other_output]) y_fine = keras.layers.Concatenate(name="y_fine")( [fine_output, fine_other_output]) return [tfr_input], [y_coarse, y_medium, y_fine]