cnn_regression

 avatar
unknown
python
a year ago
4.5 kB
10
Indexable
import tensorflow as tf
import numpy as np
from src import helper
from tensorflow import keras
from tensorflow.keras import layers
from pathlib import Path
import time


class CWI_CNN(keras.Model):
    def __init__(
            self,
            embedding_dims,
            filter_sizes,
            num_filters,
            lang="French",
    ):
        super(CWI_CNN, self).__init__()
        self.lang = lang

        self.conv_layers = []
        for filter_size in filter_sizes:
            conv = layers.Conv2D(
                filters=num_filters,
                kernel_size=(filter_size, embedding_dims),
                activation='relu'
            )
            self.conv_layers.append(conv)

        self.pooling = layers.GlobalMaxPooling2D()
        self.dropout1 = layers.Dropout(0.5)
        self.dense1 = layers.Dense(256, activation='relu')
        self.dropout2 = layers.Dropout(0.5)
        self.dense2 = layers.Dense(64, activation='relu')
        self.output_layer = layers.Dense(1)

    def call(self, inputs, training=False):
        x = tf.expand_dims(inputs, -1)
        conv_outputs = []
        for conv in self.conv_layers:
            conv_out = conv(x)
            conv_outputs.append(conv_out)

        x = tf.concat(conv_outputs, axis=3)
        x = self.pooling(x)
        x = self.dropout1(x, training=training)
        x = self.dense1(x)
        x = self.dropout2(x, training=training)
        x = self.dense2(x)
        return self.output_layer(x)


def run_training(out_dir, x_train, y_train, x_valid, y_valid, feature_args, lang, configs):
    print("x_train.shape:", x_train.shape)
    print("y_train.shape:", y_train.shape)

    model = CWI_CNN(
        embedding_dims=x_train.shape[2],
        filter_sizes=list(map(int, configs.FILTER_SIZES.split(","))),
        num_filters=configs.NUM_FILTERS,
        lang=lang
    )

    optimizer = keras.optimizers.Adam(learning_rate=configs.LEARNING_RATE)
    model.compile(optimizer=optimizer, loss='mse', metrics=['mae'])

    # Callbacks
    checkpoint_path = str(Path(out_dir) / "checkpoints" / "model.ckpt")
    cp_callback = keras.callbacks.ModelCheckpoint(
        checkpoint_path, save_weights_only=True, save_best_only=True, monitor='val_mae', mode='min'
    )
    early_stopping = keras.callbacks.EarlyStopping(patience=10, restore_best_weights=True)

    # Train the model
    history = model.fit(
        x_train, y_train,
        epochs=configs.NUM_EPOCHS,
        batch_size=configs.BATCH_SIZE,
        validation_data=(x_valid, y_valid),
        callbacks=[cp_callback, early_stopping]
    )

    # Save the entire model
    model.save(str(Path(out_dir) / "saved_model"))

    return out_dir.stem


def evaluate(x_test, y_test, x_test_sents, model_dir=None, features=None, output_dir=None, test_name=None, lang=None):
    p = Path(f'models/{lang}/CNNReg')
    dirs = sorted(p.iterdir(), key=lambda f: f.stat().st_mtime)

    if len(dirs) > 0:
        if model_dir is not None:
            checkpoint_dir = Path(f'models/{lang}/CNNReg/{model_dir}')
        else:
            checkpoint_dir = Path(str(dirs[-1]))  # load the last checkpoint

        print(f"Checkpoint dir: {checkpoint_dir}")

        # Load the saved model
        model = keras.models.load_model(str(checkpoint_dir / "saved_model"))

        # Make predictions
        all_predictions = model.predict(x_test)

        if output_dir is None:
            output_dir = checkpoint_dir

        Path(output_dir).mkdir(parents=True, exist_ok=True)
        model_name = checkpoint_dir.parent.stem + '_' + checkpoint_dir.stem

        y_test = np.argmax(y_test, axis=1)

        save_evaluation_report_reg(all_predictions, y_test, x_test_sents, output_dir, model_name, test_name, features)
        return all_predictions
    else:
        print("You haven't trained a model yet.")


def save_evaluation_report_reg(all_predictions, y_test, x_test_sents, output_dir, model_name, test_name, features):
    helper.save_evaluation_report_reg(all_predictions, y_test, x_test_sents, output_dir, model_name, test_name,
                                      features)



def train(x_train, y_train, x_valid, y_valid, feature_args, lang=None, configs=None):
    timestamp = str(int(time.time()))
    out_dir = Path(f'models/{lang}/CNNReg/{timestamp}')
    out_dir.mkdir(parents=True, exist_ok=True)

    with open(out_dir / 'logs.txt', 'w') as f:
        return run_training(out_dir, x_train, y_train, x_valid, y_valid, feature_args, lang, configs)

Editor is loading...
Leave a Comment