'The model for Alice, Bob, and Eve.  If key=None, the first FC layer
takes only the message as inputs.  Otherwise, it uses both the key
and the message.
Args:
collection:  The graph keys collection to add new vars to.
message:  The input message to process.
key:  The input key (if any) to use.'

def model(self, collection, message, key=None):

    if (key is not None):
        combined_message = tf.concat(axis=1, values=[message, key])
    else:
        combined_message = message
    with tf.contrib.framework.arg_scope([tf.contrib.layers.fully_connected, tf.contrib.layers.conv2d], variables_collections=[collection]):
        fc = tf.contrib.layers.fully_connected(combined_message, (TEXT_SIZE + KEY_SIZE), biases_initializer=tf.constant_initializer(0.0), activation_fn=None)
        fc = tf.expand_dims(fc, 2)
        conv = tf.contrib.layers.conv2d(fc, 2, 2, 2, 'SAME', activation_fn=tf.nn.sigmoid)
        conv = tf.contrib.layers.conv2d(conv, 2, 1, 1, 'SAME', activation_fn=tf.nn.sigmoid)
        conv = tf.contrib.layers.conv2d(conv, 1, 1, 1, 'SAME', activation_fn=tf.nn.tanh)
        conv = tf.squeeze(conv, 2)
        return conv
