diff --git a/toolkit.py b/toolkit.py index 6f2437876daf24ef80489dd2065c4a380336426e..3c50858a06681071642d5119f8559c2c17281eff 100755 --- a/toolkit.py +++ b/toolkit.py @@ -110,7 +110,9 @@ class ClassificationProject(object): :param nodes: list number of nodes in each layer. If only a single number is given, use this number for every layer - :param dropout: dropout fraction after each hidden layer. Set to None for no Dropout + :param dropout: dropout fraction after each hidden layer. You can also pass a list for dropout fractions for each layer. Set to None for no Dropout. + + :param dropout_input: dropout fraction for the input layer. Set to None for no Dropout. :param batch_size: size of the training batches @@ -196,6 +198,7 @@ class ClassificationProject(object): layers=3, nodes=64, dropout=None, + dropout_input=None, batch_size=128, validation_split=0.33, activation_function='relu', @@ -243,6 +246,11 @@ class ClassificationProject(object): logger.warning("Number of layers not equal to the given nodes " "per layer - adjusted to " + str(self.layers)) self.dropout = dropout + if not isinstance(self.dropout, list): + self.dropout = [self.dropout for i in range(self.layers)] + if len(self.dropout) != self.layers: + raise ValueError("List of dropout fractions has to be of equal size as the number of layers!") + self.dropout_input = dropout_input self.batch_size = batch_size self.validation_split = validation_split self.activation_function = activation_function @@ -588,15 +596,21 @@ class ClassificationProject(object): self._model = Sequential() - # first hidden layer - self._model.add(Dense(self.nodes[0], input_dim=len(self.fields), activation=self.activation_function)) - # the other hidden layers - for node_count, layer_number in zip(self.nodes[1:], range(self.layers-1)): + if self.dropout_input is None: + self._model.add(Dense(self.nodes[0], input_dim=len(self.fields), activation=self.activation_function)) + # in case of no Dropout we already have the first hidden layer + start_layer = 1 + else: + self._model.add(Dropout(rate=self.dropout_input, input_shape=(len(self.fields),))) + start_layer = 0 + # the (other) hidden layers + for node_count, dropout_fraction in zip(self.nodes[start_layer:], self.dropout[start_layer:]): self._model.add(Dense(node_count, activation=self.activation_function)) - if self.dropout is not None: - self._model.add(Dropout(rate=self.dropout)) + if dropout_fraction > 0: + self._model.add(Dropout(rate=dropout_fraction)) # last layer is one neuron (binary classification) self._model.add(Dense(1, activation=self.activation_function_output)) + logger.info("Using {}(**{}) as Optimizer".format(self.optimizer, self.optimizer_opts)) Optimizer = getattr(keras.optimizers, self.optimizer) optimizer = Optimizer(**self.optimizer_opts) @@ -607,9 +621,11 @@ class ClassificationProject(object): loss=self.loss, metrics=['accuracy']) np.random.set_state(rn_state) + if os.path.exists(os.path.join(self.project_dir, "weights.h5")): if self.is_training: - continue_training = self.query_yn("Found previously trained weights - continue training (choosing N will restart)? (Y/N) ") + continue_training = self.query_yn("Found previously trained weights - " + "continue training (choosing N will restart)? (Y/N) ") else: continue_training = True if continue_training: