Creates a new fully connected layer.

        :param name: name for the layer.
        :param output_count: number of outputs of the fully connected layer.
        :param relu: boolean flag to set if ReLu should be applied at the end of this layer.
        :param input_layer_name: name of the input layer for this layer. If None, it will take the last added layer of
        the network.

def new_fully_connected(self, name: str, output_count: int, relu=True, input_layer_name: str=None):
        """
        Creates a new fully connected layer.

        :param name: name for the layer.
        :param output_count: number of outputs of the fully connected layer.
        :param relu: boolean flag to set if ReLu should be applied at the end of this layer.
        :param input_layer_name: name of the input layer for this layer. If None, it will take the last added layer of
        the network.
        """

        with tf.variable_scope(name):
            input_layer = self.__network.get_layer(input_layer_name)
            vectorized_input, dimension = self.vectorize_input(input_layer)

            weights = self.__make_var('weights', shape=[dimension, output_count])
            biases = self.__make_var('biases', shape=[output_count])
            operation = tf.nn.relu_layer if relu else tf.nn.xw_plus_b

            fc = operation(vectorized_input, weights, biases, name=name)

        self.__network.add_layer(name, layer_output=fc)