import tensorflow as tf


        if not do_rnn:
            assert rnn_nunroll == 1

        if cnn_rnn_zack:
            assert audio_context_len == 1
            assert zack_hack > 0 and zack_hack % 2 == 0

        export_feat_tensors = {}

        # Input tensors
        feats_audio_nunroll = tf.placeholder(dtype, shape=[batch_size, rnn_nunroll + zack_hack, audio_context_len, audio_nbands, audio_nchannels], name='feats_audio')
        feats_other_nunroll = tf.placeholder(dtype, shape=[batch_size, rnn_nunroll, nfeats], name='feats_other')
        print('feats_audio: {}'.format(feats_audio_nunroll.get_shape()))
        print('feats_other: {}'.format(feats_other_nunroll.get_shape()))

        if mode != 'gen':
            targets_nunroll = tf.placeholder(dtype, shape=[batch_size, rnn_nunroll])
            # TODO: tf.ones acts as an overridable placeholder but this is still awkward
            target_weights_nunroll = tf.ones([batch_size, rnn_nunroll], dtype)

        # Reshape input tensors to remove nunroll dim; will briefly restore later during RNN if necessary
        if cnn_rnn_zack:
            feats_audio = tf.reshape(feats_audio_nunroll, shape=[batch_size, rnn_nunroll + zack_hack, audio_nbands, audio_nchannels])
