def network(self, weights=None): if weights: model = load_model(weights) print(model) else: model = Sequential() model.add(Dense(30, activation='relu', input_dim=9)) #model.add(Dense(output_dim=70, activation='relu')) model.add(Dropout(0.2)) model.add(Dense(30, activation='relu')) model.add(Dropout(0.2)) model.add(Dense(30, activation='relu')) model.add(Dropout(0.2)) model.add(Dense(9, activation='sigmoid')) opt = Adam(self.learning_rate) model.compile(loss='mse', optimizer=opt) model._make_predict_function() return model
class DigitClassifier(object): batch_size = 128 epochs = 12 layer_1_size = 32 layer_2_size = 64 layer_3_size = 128 first_available_train_samples = 1000 mnist_data = MnistData(0,0) num_classes = mnist_data.num_classes x_test = mnist_data.x_test y_test = mnist_data.y_test def save(self, path): with self.graph.as_default(): self.model.save(path) def load(self, path): with self.graph.as_default(): self.model = load_model(path) def build_graph(self): self.model = Sequential() self.model.add(Conv2D(DigitClassifier.layer_1_size, kernel_size=(3, 3), activation='relu', input_shape=DigitClassifier.mnist_data.input_shape)) self.model.add(Conv2D(DigitClassifier.layer_2_size, (3, 3), activation='relu')) self.model.add(MaxPooling2D(pool_size=(2, 2))) self.model.add(Dropout(0.25)) self.model.add(Flatten()) self.model.add(Dense(DigitClassifier.layer_3_size, activation='relu')) self.model.add(Dropout(0.5)) # self.model.add(Flatten(input_shape=DigitClassifier.mnist_data.input_shape)) self.model.add(Dense(DigitClassifier.num_classes, activation='softmax')) self.model.compile(loss=categorical_crossentropy, optimizer=Adadelta(), metrics=['accuracy']) self.model._make_predict_function() self.graph = tf.get_default_graph() def predict(self, data): with self.graph.as_default(): return self.model.predict(data, verbose=0) def predict_classes(self, data): return np.argmax(self.predict(data),1) def evaluate(self): with self.graph.as_default(): score = self.model.evaluate(DigitClassifier.x_test, DigitClassifier.y_test, verbose=0) def train(self, x_train, y_train): with self.graph.as_default(): self.model.fit(x_train, y_train, batch_size=DigitClassifier.batch_size, epochs=1, verbose=0, validation_data=(DigitClassifier.x_test, DigitClassifier.y_test)) def train_and_return_accuracy_change(self, x_train, y_train): with self.graph.as_default(): score_before = self.model.evaluate(DigitClassifier.x_test, DigitClassifier.y_test, verbose=0) score_after = score_before tempfile = join(gettempdir(), str(uuid4())) self.save(tempfile) try: while True: self.train(x_train, y_train) last_score = self.model.evaluate(DigitClassifier.x_test, DigitClassifier.y_test, verbose=0) if last_score[1] <= score_after[1]: break score_after = last_score finally: score_after = last_score if score_before[1] > score_after[1]: self.load(tempfile) score_after = score_before os.remove(tempfile) return score_before, score_after