Mercurial > hg > aimc
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