def AddCnnLayers(config_lines, cnn_layer, cnn_bottleneck_dim, cepstral_lifter, config_dir, feat_dim, splice_indexes=[0], ivector_dim=0): cnn_args = ParseCnnString(cnn_layer) num_cnn_layers = len(cnn_args) # We use an Idct layer here to convert MFCC to FBANK features common_lib.write_idct_matrix(feat_dim, cepstral_lifter, config_dir.strip() + "/idct.mat") prev_layer_output = {'descriptor': "input", 'dimension': feat_dim} prev_layer_output = nodes.AddFixedAffineLayer(config_lines, "Idct", prev_layer_output, config_dir.strip() + '/idct.mat') list = [('Offset({0}, {1})'.format(prev_layer_output['descriptor'],n) if n != 0 else prev_layer_output['descriptor']) for n in splice_indexes] splice_descriptor = "Append({0})".format(", ".join(list)) cnn_input_dim = len(splice_indexes) * feat_dim prev_layer_output = {'descriptor': splice_descriptor, 'dimension': cnn_input_dim, '3d-dim': [len(splice_indexes), feat_dim, 1], 'vectorization': 'yzx'} for cl in range(0, num_cnn_layers): prev_layer_output = AddConvMaxpLayer(config_lines, "L{0}".format(cl), prev_layer_output, cnn_args[cl]) if cnn_bottleneck_dim > 0: prev_layer_output = nodes.AddAffineLayer(config_lines, "cnn-bottleneck", prev_layer_output, cnn_bottleneck_dim, "") if ivector_dim > 0: iv_layer_output = {'descriptor': 'ReplaceIndex(ivector, t, 0)', 'dimension': ivector_dim} iv_layer_output = nodes.AddAffineLayer(config_lines, "ivector", iv_layer_output, ivector_dim, "") prev_layer_output['descriptor'] = 'Append({0}, {1})'.format(prev_layer_output['descriptor'], iv_layer_output['descriptor']) prev_layer_output['dimension'] = prev_layer_output['dimension'] + iv_layer_output['dimension'] return prev_layer_output