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
Exemplo n.º 2
0
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