changeset 101:9416e88d7c56

- Pretty-plotting - Test on everything - Generalised beyond standard AMI
author tomwalters
date Tue, 14 Sep 2010 00:18:47 +0000
parents ae195c41c7bd
children 63bd7787ff98
files experiments/scripts/HTK/install_htk.sh experiments/scripts/aimc/build_aimc.sh experiments/scripts/cnbh-syllables/feature_generation/run_mfcc_vtln_conversion.sh experiments/scripts/cnbh-syllables/results_plotting/gen_results.py experiments/scripts/cnbh-syllables/results_plotting/spider_plot.py experiments/scripts/cnbh-syllables/run_training_and_testing/run_test_instance.sh experiments/scripts/cnbh-syllables/run_training_and_testing/test_features.sh experiments/scripts/master.sh
diffstat 8 files changed, 182 insertions(+), 113 deletions(-) [+]
line wrap: on
line diff
--- a/experiments/scripts/HTK/install_htk.sh	Mon Sep 13 18:34:23 2010 +0000
+++ b/experiments/scripts/HTK/install_htk.sh	Tue Sep 14 00:18:47 2010 +0000
@@ -1,15 +1,17 @@
 #!/bin/bash
 set -e
 set -u
-if [ ! -e /mnt/experiments/htk/.htk_installed_success ]; then
-sudo mkdir -p /mnt/experiments/htk
-sudo chown `whoami` /mnt/experiments/htk
-cd /mnt/experiments/htk
+WORKING=$1
+PREV_DIR=`pwd`
+if [ ! -e $WORKING/.htk_installed_success ]; then
+mkdir -p $WORKING
+cd $WORKING
 wget --user $HTK_USERNAME --password $HTK_PASSWORD http://htk.eng.cam.ac.uk/ftp/software/HTK-3.4.1.tar.gz
 tar -xzf HTK-3.4.1.tar.gz
 cd htk
 ./configure --disable-hslab
 make
 sudo make install
-touch /mnt/experiments/htk/.htk_installed_success
-fi
\ No newline at end of file
+touch $WORKING/.htk_installed_success
+fi
+cd $PREV_DIR
--- a/experiments/scripts/aimc/build_aimc.sh	Mon Sep 13 18:34:23 2010 +0000
+++ b/experiments/scripts/aimc/build_aimc.sh	Tue Sep 14 00:18:47 2010 +0000
@@ -3,10 +3,9 @@
 set -e
 set -u
 
-AIMC_DIR=/mnt/experiments/aimc
-
-sudo mkdir -p $AIMC_DIR
-sudo chown `whoami` $AIMC_DIR
+AIMC_DIR=$1
+PREV_DIR=`pwd`
+mkdir -p $AIMC_DIR
 cd $AIMC_DIR
 svn checkout http://aimc.googlecode.com/svn/trunk/ aimc-read-only
 cd aimc-read-only
@@ -14,4 +13,4 @@
 cd ..
 export PATH=$PATH:$AIMC_DIR/aimc-read-only/build/posix-release/
 touch $AIMC_DIR/.aimc_build_success
-cd -
\ No newline at end of file
+cd $PREV_DIR
--- a/experiments/scripts/cnbh-syllables/feature_generation/run_mfcc_vtln_conversion.sh	Mon Sep 13 18:34:23 2010 +0000
+++ b/experiments/scripts/cnbh-syllables/feature_generation/run_mfcc_vtln_conversion.sh	Tue Sep 14 00:18:47 2010 +0000
@@ -132,7 +132,8 @@
 WARPLCUTOFF = 10 
 # Upper frequency is the Nyquist freq. (24000Hz) 
 # so choose the break freq. close to that
-WARPUCUTOFF = 23000
+#WARPUCUTOFF = 23000
+WARPUCUTOFF = 10500
 EOF
 
 for TALKER in $(cat $FEATURES_DIR/${TALKERS}.tmp); do
@@ -158,4 +159,4 @@
 rm $FEATURES_DIR/$SYLLIST.tmp
 rm $FEATURES_DIR/${TALKERS}.tmp
 touch $FEATURES_DIR/.features_script_success
-fi
\ No newline at end of file
+fi
--- a/experiments/scripts/cnbh-syllables/results_plotting/gen_results.py	Mon Sep 13 18:34:23 2010 +0000
+++ b/experiments/scripts/cnbh-syllables/results_plotting/gen_results.py	Tue Sep 14 00:18:47 2010 +0000
@@ -68,6 +68,8 @@
         total_value_count = int(value)
       if option in ("-p", "--spoke_pattern_file"):
         spoke_pattern_file = value
+      if option in ("-o", "--output_filename")
+        output_filename = value
   
   except Usage, err:
     print >> sys.stderr, sys.argv[0].split("/")[-1] + ": " + str(err.msg)
--- a/experiments/scripts/cnbh-syllables/results_plotting/spider_plot.py	Mon Sep 13 18:34:23 2010 +0000
+++ b/experiments/scripts/cnbh-syllables/results_plotting/spider_plot.py	Tue Sep 14 00:18:47 2010 +0000
@@ -3,9 +3,10 @@
 spider_plot.py
 
 Created by Thomas Walters on 2010-09-12.
-Copyright 2010 Google. All rights reserved.
 """
 
+import sys
+import getopt
 import numpy as np
 import pylab as p
 import mpl_toolkits.mplot3d.axes3d as p3
@@ -13,73 +14,109 @@
 from matplotlib import cm
 import matplotlib.ticker as ticker 
 
-total_value_count=185
+help_message = '''
+Plot the spider.
 
-central_vtl=15
-central_vtl_scaling=112.32
+Arguments:
+-i --input_file
+-o --output_file
+'''
 
-# Read in a file with lines in the form
-# Pitch Scale Percentage
-xs=[]
-ys=[]
-zs=[]
-f = open('plottable_results.txt', 'r')
-for line in f:
-  if line[0] != "#":
-    values = line.strip().split(' ')
-    xs.append(central_vtl*central_vtl_scaling/float(values[1]))
-    ys.append(float(values[0]))
-    zs.append(float(values[2]))
+class Usage(Exception):
+  def __init__(self, msg):
+    self.msg = msg
 
 
-# Define a tiny sphere, centered on the origin, which
-# we'll shift to the desired position. 
-u=np.r_[0:2*np.pi:50j]
-v=np.r_[0:np.pi:50j]
-sx=0.01*np.outer(np.cos(u),np.sin(v))
-sy=0.01*np.outer(np.sin(u),np.sin(v))
-sz=2.5*np.outer(np.ones(np.size(u)),np.cos(v))
+def main(argv=None):
+  if argv is None:
+    argv = sys.argv
+  try:
+    try:
+      opts, args = getopt.getopt(argv[1:], "hi:o:",
+                                 ["help", "input_file=", "output_file="])
+    except getopt.error, msg:
+      raise Usage(msg)
+  
+    # defaults
+    input_file = "results_iteration_15.txt"
+    output_filename = "results_iteration_15.png"
+    
+    # option processing
+    for option, value in opts:
+      if option in ("-h", "--help"):
+        raise Usage(help_message)
+      if option in ("-i", "--input_file"):
+        input_file = value
+      if option in ("-o", "--output_file"):
+        output_file = value
+  
+  except Usage, err:
+    print >> sys.stderr, sys.argv[0].split("/")[-1] + ": " + str(err.msg)
+    print >> sys.stderr, "\t for help use --help"
+    return 2
 
-fig=p.figure()
-ax = p3.Axes3D(fig, azim=-80, elev=60)
+  # Read in a file with lines in the form
+  # Pitch Scale Percentage
+  xs=[]
+  ys=[]
+  zs=[]
+  f = open(input_file, 'r')
+  for line in f:
+    if line[0] != "#":
+      values = line.strip().split(' ')
+      xs.append(central_vtl*central_vtl_scaling/float(values[1]))
+      ys.append(float(values[0]))
+      zs.append(float(values[2]))
 
-colormap = cm.get_cmap('jet', 100)
 
-# Note: here I fake out the lack of proper logarihmic scales on 3D axes in
-# matplotlib by just plotting log values on a linear scale and renaming
-# the labels.
-# (This doesn't work: ax.w_yaxis.set_scale('log') ax.w_xaxis.set_scale('log'))
+  # Define a tiny sphere, centered on the origin, which
+  # we'll shift to the desired position. 
+  u=np.r_[0:2*np.pi:50j]
+  v=np.r_[0:np.pi:50j]
+  sx=0.01*np.outer(np.cos(u),np.sin(v))
+  sy=0.01*np.outer(np.sin(u),np.sin(v))
+  sz=2.5*np.outer(np.ones(np.size(u)),np.cos(v))
 
-# Plot the values seven at a time as dark lines.
-# These are the individual spokes of the spoke pattern.
-n=7
-for i in xrange(0,8):
-  ax.plot(np.log(xs[i*n:(i+1)*n]), np.log(ys[i*n:(i+1)*n]), zs[i*n:(i+1)*n], color=[0,0,0])
+  fig=p.figure()
+  ax = p3.Axes3D(fig, azim=-80, elev=60)
 
-for x,y,z in zip(xs,ys,zs):
-  ax.plot(np.log([x, x]), np.log([y, y]), [z, 0], color=[0.8,0.8,0.8])
-  ax.plot_surface(sx+np.log(x),sy+np.log(y),sz+z, color=colormap(int(z)), linewidth=0)
+  colormap = cm.get_cmap('jet', 100)
 
-ax.set_ylabel('GPR/Hz')
-ax.set_xlabel('VTL/cm')
-ax.set_zlabel('Percent correct')
-ax.set_ylim3d(np.log([131,225]))
-ax.set_xlim3d(np.log([9.9, 22.1]))
-ax.set_zlim3d([-1, 101])
-ax.w_zaxis.set_major_locator(ticker.FixedLocator([0, 20, 40, 60, 80, 100]))
+  # Note: here I fake out the lack of proper logarihmic scales on 3D axes in
+  # matplotlib by just plotting log values on a linear scale and renaming
+  # the labels.
+  # (This doesn't work: ax.w_yaxis.set_scale('log') ax.w_xaxis.set_scale('log'))
 
-ax.w_xaxis.set_major_locator(ticker.FixedLocator(np.log([10,15,22])))
-ax.w_xaxis.set_ticklabels(['10', '15', '22'])
-ax.w_yaxis.set_major_locator(ticker.FixedLocator(np.log([132, 172, 224])))
-ax.w_yaxis.set_ticklabels(['132', '172', '224'])
+  # Plot the values seven at a time as dark lines.
+  # These are the individual spokes of the spoke pattern.
+  n=7
+  for i in xrange(0,8):
+    ax.plot(np.log(xs[i*n:(i+1)*n]), np.log(ys[i*n:(i+1)*n]), zs[i*n:(i+1)*n], color=[0,0,0])
 
-#for a in ax.w_xaxis.get_ticklines()+ax.w_xaxis.get_ticklabels(): 
-#    a.set_visible(False) 
+  for x,y,z in zip(xs,ys,zs):
+    ax.plot(np.log([x, x]), np.log([y, y]), [z, 0], color=[0.8,0.8,0.8])
+    ax.plot_surface(sx+np.log(x),sy+np.log(y),sz+z, color=colormap(int(z)), linewidth=0)
 
-#for a in ax.w_yaxis.get_ticklines()+ax.w_yaxis.get_ticklabels(): 
-#    a.set_visible(False) 
+  ax.set_ylabel('GPR/Hz')
+  ax.set_xlabel('VTL/cm')
+  ax.set_zlabel('Percent correct')
+  ax.set_ylim3d(np.log([131,225]))
+  ax.set_xlim3d(np.log([9.9, 22.1]))
+  ax.set_zlim3d([-1, 101])
+  ax.w_zaxis.set_major_locator(ticker.FixedLocator([0, 20, 40, 60, 80, 100]))
 
+  ax.w_xaxis.set_major_locator(ticker.FixedLocator(np.log([10,15,22])))
+  ax.w_xaxis.set_ticklabels(['10', '15', '22'])
+  ax.w_yaxis.set_major_locator(ticker.FixedLocator(np.log([132, 172, 224])))
+  ax.w_yaxis.set_ticklabels(['132', '172', '224'])
 
-#p.show()
-p.savefig('results.png')
+  #for a in ax.w_xaxis.get_ticklines()+ax.w_xaxis.get_ticklabels(): 
+  #    a.set_visible(False) 
 
+  #for a in ax.w_yaxis.get_ticklines()+ax.w_yaxis.get_ticklabels(): 
+  #    a.set_visible(False) 
+
+
+  #p.show()
+  p.savefig(output_filename)
+
--- a/experiments/scripts/cnbh-syllables/run_training_and_testing/run_test_instance.sh	Mon Sep 13 18:34:23 2010 +0000
+++ b/experiments/scripts/cnbh-syllables/run_training_and_testing/run_test_instance.sh	Tue Sep 14 00:18:47 2010 +0000
@@ -35,7 +35,7 @@
 hmm_type=${total_hmm_states}_states_${mixture_components}_mixture_components
 echo "HMM type: ${hmm_type}..."
 
-if [ -e $WORKING_DIRECTORY/.hmm_success ]; then
+if [ -e $WORKING_DIRECTORY/$hmm_type/.hmm_success ]; then
   echo " already done"
   return 0
 fi
@@ -62,7 +62,7 @@
   echo "~h $syllable" >> $WORKING_DIRECTORY/$hmm_type/hmm0/hmmdefs
   cat $WORKING_DIRECTORY/$hmm_type/hmm0/hmms >> $WORKING_DIRECTORY/$hmm_type/hmm0/hmmdefs
 done
- 
+
 echo -n "~o<STREAMINFO> 1 ${input_vector_size}<VECSIZE> ${input_vector_size}<NULLD><${feature_code}><DIAGC>" > $WORKING_DIRECTORY/$hmm_type/hmm0/macros
 
 cat $WORKING_DIRECTORY/$hmm_type/hmm0/vFloors >> $WORKING_DIRECTORY/$hmm_type/hmm0/macros
@@ -90,4 +90,9 @@
     -I $TEST_MLF $WORKING_DIRECTORY/$SYLLIST_COMPLETE $WORKING_DIRECTORY/$hmm_type/$RECOUT > $WORKING_DIRECTORY/$hmm_type/${RESULTS_FILE}_iteration_$iter
   # Count the number of instances of each talker appearing in the list of errors.
   grep Aligned $WORKING_DIRECTORY/$hmm_type/${RESULTS_FILE}_iteration_$iter| sed -E "s/.*\/..\/([a-z]{2})([0-9]{2,3}\.[0-9])p([0-9]{2,3}\.[0-9])s.*/\2 \3/" | sort | uniq -c > $WORKING_DIRECTORY/$hmm_type/${MISCLASSIFIED}_iteration_$iter
+  python ./cnbh-syllables/results_plotting/gen_results.py --input_file=$WORKING_DIRECTORY/$hmm_type/${MISCLASSIFIED}_iteration_$iter --train_talkers=$WORKING_DIRECTORY/$hmm_type/training_talkers --test_talkers=$WORKING_DIRECTORY/$hmm_type/testing_talkers --output_filename=$WORKING_DIRECTORY/$hmm_type/results_iteration_${iter}.txt --spoke_pattern=cnbh-syllables/run_training_and_testing/train_test_sets/gen_spoke_points/spoke_pattern.txt
+  python ./cnbh-syllbles/results_plotting/spider_plot.py --input_file=$WORKING_DIRECTORY/$hmm_type/results_iteration_${iter}.txt --output_file=$WORKING_DIRECTORY/$hmm_type/results_iteration_${iter}.png
 done
+touch $WORKING_DIRECTORY/$hmm_type/.hmm_success
+
+
--- a/experiments/scripts/cnbh-syllables/run_training_and_testing/test_features.sh	Mon Sep 13 18:34:23 2010 +0000
+++ b/experiments/scripts/cnbh-syllables/run_training_and_testing/test_features.sh	Tue Sep 14 00:18:47 2010 +0000
@@ -5,7 +5,7 @@
 #
 # Copyright 2009-2010 University of Cambridge
 # Author: Thomas Walters <tom@acousticscale.org>
-# 
+#
 # Run multiple HMMs
 
 set -e
--- a/experiments/scripts/master.sh	Mon Sep 13 18:34:23 2010 +0000
+++ b/experiments/scripts/master.sh	Tue Sep 14 00:18:47 2010 +0000
@@ -5,21 +5,26 @@
 # AIM features generated using AIM-C using a series of syllable recogntiton
 # tasks.
 # This script expects to be run from within the AIM-C source tree.
-# It builds the HTK binaries and AIM-C AIMCopy binary if they're not 
-# present. 
+# It builds the HTK binaries and AIM-C AIMCopy binary if they're not
+# present.
 # The following environment varaibles should be set before this script is run:
 # SYLLABLES_DATABASE_URL - URL of a tar file containing the CNBH syllables
 # database in FLAC format
-# HTK_USERNAME and HTK_PASSWORD - username and password for the site at 
+# HTK_USERNAME and HTK_PASSWORD - username and password for the site at
 # http://htk.eng.cam.ac.uk/
 # NUMBER_OF_CORES - total number of machine cores
 
 # Set these to be the location of your input database, and desired output
-# locations.
-SYLLABLES_DATABASE_TAR=/mnt/sounds/cnbh-syllables.tar
-SOUNDS_ROOT=/mnt/experiments/sounds/
-FEATURES_ROOT=/mnt/experiments/features/
-HMMS_ROOT=/mnt/experiments/hmms/
+# locations. (Note: the user running this script needs write permissions on
+# the $WORKING_VOLUME.)
+WORKING_VOLUME=/mnt/scratch1
+
+SYLLABLES_DATABASE_TAR=$WORKING_VOLUME/001-downloaded_sounds_data/cnbh-syllables.tar
+SOUNDS_ROOT=$WORKING_VOLUME/002-sounds/
+FEATURES_ROOT=$WORKING_VOLUME/003-features/
+HMMS_ROOT=$WORKING_VOLUME/004-hmms/
+HTK_ROOT=$WORKING_VOLUME/software/htk/
+AIMC_ROOT=$WORKING_VOLUME/software/aimc/
 
 # Number of cores on the experimental machine. Various scripts will try to use
 # this if it's set.
@@ -31,18 +36,18 @@
 # Fail if any variable is unset
 set -u
 
+######
+# Step 001 - Get the sounds database
 if [ ! -e $SYLLABLES_DATABASE_TAR ]; then
-  sudo mkdir -p `dirname $SYLLABLES_DATABASE_TAR`
-  sudo chown `whoami` `dirname $SYLLABLES_DATABASE_TAR`
+  mkdir -p `dirname $SYLLABLES_DATABASE_TAR`
   wget -O $SYLLABLES_DATABASE_TAR $SYLLABLES_DATABASE_URL
 fi
 
 if [ ! -d $SOUNDS_ROOT ]; then
-  sudo mkdir -p $SOUNDS_ROOT
-  sudo chown `whoami` $SOUNDS_ROOT
+  mkdir -p $SOUNDS_ROOT
 fi
 
-# Untar the CNBH syllables database, and convert the files from FLAC to WAV
+# Untar the CNBH syllables database, and convert the files from FLAC to WAV.
 if [ ! -e $SOUNDS_ROOT/.untar_db_success ]; then
   tar -x -C $SOUNDS_ROOT -f $SYLLABLES_DATABASE_TAR
   touch $SOUNDS_ROOT/.untar_db_success
@@ -51,7 +56,11 @@
 # Convert the database to .WAV format and place it in $SOUNDS_ROOT/clean
 echo "Converting CNBH-syllables database from FLAC to WAV..."
 ./cnbh-syllables/feature_generation/convert_flac_to_wav.sh $SOUNDS_ROOT
+#
+######
 
+#####
+# Step 002 -
 # Generate versions of the CNBH syllables spoke pattern with a range of
 # signal-to-noise ratios (SNRs). The versions are put in the directory
 # ${SOUNDS_ROOT}/${SNR}_dB/ for each SNR in $SNRS.
@@ -68,66 +77,59 @@
 # Generate feature sets (for the full range of SNRs in $FEATURE_DIRS)
 # 1. Standard MFCC features
 # 2. AIM features
-# 3. MFCC features with optimal VTLN 
-
+# 3. MFCC features with optimal VTLN
 
 if [ ! -d $FEATURES_ROOT ]; then
-  sudo mkdir -p $FEATURES_ROOT
-  sudo chown `whoami` $FEATURES_ROOT
+ mkdir -p $FEATURES_ROOT
 fi
 
-if [ ! -e /mnt/experiments/htk/.htk_installed_success ]; then
-  ./HTK/install_htk.sh
+if [ ! -e $HTK_ROOT/.htk_installed_success ]; then
+  ./HTK/install_htk.sh $HTK_ROOT
 fi
 
-if [ ! -e /mnt/experiments/aimc/.aimc_build_success ]; then
-# ./aimc/build_aimc.sh
-  cd ../../
-  scons
-  export PATH=$PATH:`pwd`/build/posix-release/
-  cd -
+if [ ! -e $AIMC_ROOT/.aimc_build_success ]; then
+ ./aimc/build_aimc.sh $AIMC_ROOT
 fi
 
 for SOURCE_SNR in $FEATURE_DIRS; do
-  
   if [ ! -e $FEATURES_ROOT/mfcc/$SOURCE_SNR/.make_mfcc_features_success ]; then
     mkdir -p $FEATURES_ROOT/mfcc/$SOURCE_SNR/
     # Generate the list of files to convert
     ./cnbh-syllables/feature_generation/gen_hcopy_aimcopy_script.sh $FEATURES_ROOT/mfcc/$SOURCE_SNR/ $SOUNDS_ROOT/$SOURCE_SNR/ htk
     # Run the conversion
-    #./cnbh-syllables/feature_generation/run_hcopy.sh $FEATURES_ROOT/mfcc/$SOURCE_SNR/ $NUMBER_OF_CORES
-    #touch $FEATURES_ROOT/mfcc/$SOURCE_SNR/.make_mfcc_features_success
+    ./cnbh-syllables/feature_generation/run_hcopy.sh $FEATURES_ROOT/mfcc/$SOURCE_SNR/ $NUMBER_OF_CORES
+    touch $FEATURES_ROOT/mfcc/$SOURCE_SNR/.make_mfcc_features_success
   fi
 
   if [ ! -e $FEATURES_ROOT/mfcc_vtln/$SOURCE_SNR/.make_mfcc_vtln_features_success ]; then
     mkdir -p $FEATURES_ROOT/mfcc_vtln/$SOURCE_SNR/
     # Generate the file list and run the conversion (all one step, since this
     # version uses a different configuration for each talker)
-    #./cnbh-syllables/feature_generation/run_mfcc_vtln_conversion.sh $FEATURES_ROOT/mfcc_vtln/$SOURCE_SNR/ $SOUNDS_ROOT/$SOURCE_SNR/
-    #touch $FEATURES_ROOT/mfcc_vtln/$SOURCE_SNR/.make_mfcc_vtln_features_success
+    ./cnbh-syllables/feature_generation/run_mfcc_vtln_conversion.sh $FEATURES_ROOT/mfcc_vtln/$SOURCE_SNR/ $SOUNDS_ROOT/$SOURCE_SNR/
+    touch $FEATURES_ROOT/mfcc_vtln/$SOURCE_SNR/.make_mfcc_vtln_features_success
   fi
 
   if [ ! -e $FEATURES_ROOT/aim/$SOURCE_SNR/.make_aim_features_success ]; then
-    mkdir -p $FEATURES_ROOT/aim/$SOURCE_SNR/ 
+    mkdir -p $FEATURES_ROOT/aim/$SOURCE_SNR/
     ./cnbh-syllables/feature_generation/gen_hcopy_aimcopy_script.sh $FEATURES_ROOT/aim/$SOURCE_SNR/ $SOUNDS_ROOT/$SOURCE_SNR/ ""
     # Run the conversion
     ./cnbh-syllables/feature_generation/run_aimcopy.sh $FEATURES_ROOT/aim/$SOURCE_SNR/ $NUMBER_OF_CORES
     touch $FEATURES_ROOT/aim/$SOURCE_SNR/.make_aim_features_success
   fi
-done 
+done
 
-sudo mkdir -p $HMMS_ROOT
-sudo chown `whoami` $HMMS_ROOT
+mkdir -p $HMMS_ROOT
 
 # Now run a bunch of experiments.
 # For each of the feature types, we want to run HMMs with a bunch of
 # parameters.
-TRAINING_ITERATIONS="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20"
-TESTING_ITERATIONS="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20"
-HMM_STATES="3 4 5 6 7 8"
-HMM_OUTPUT_COMPONENTS="1 2 3 4 5 6 7"
-
-return 0
+TRAINING_ITERATIONS="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15" # 16 17 18 19 20"
+#TESTING_ITERATIONS="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20"
+TESTING_ITERATIONS="15"
+#HMM_STATES="3 4 5 6 7 8"
+HMM_STATES="4"
+#HMM_OUTPUT_COMPONENTS="1 2 3 4 5 6 7"
+HMM_OUTPUT_COMPONENTS="4"
 
 run_train_test () {
 # TODO(tom): Make sure that the training SNR is generated first
@@ -167,7 +169,6 @@
 done
 }
 
-
 ########################
 # Standard MFCCs
 FEATURE_CLASS=mfcc
@@ -214,11 +215,33 @@
 run_train_test
 ########################
 
+AIM_FEATURE_SUFFIXES="slice_1_no_cutoff ssi_profile_no_cutoff slice_1_cutoff ssi_profile_cutoff smooth_nap_profile"
+for f in $AIM_FEATURE_SUFFIXES
+do
 ########################
 # AIM Features
-# TODO (loop over all feature suffixes)
+# Inner talkers
+FEATURE_CLASS=aim
+FEATURE_SUFFIX=$f
+FEATURE_SIZE=12
+FEATURE_TYPE=USER_E_D_A
+TALKERS=inner_talkers
+TRAINING_SNR=clean
+run_train_test
 ########################
 
+########################
+# AIM Features
+# Inner talkers
+FEATURE_CLASS=aim
+FEATURE_SUFFIX=$f
+FEATURE_SIZE=12
+FEATURE_TYPE=USER_E_D_A
+TALKERS=outer_talkers
+TRAINING_SNR=clean
+run_train_test
+########################
+done