Tensorflow застрял в первой эпохе | macOS

#python #macos #tensorflow #keras #spyder

Вопрос:

Итак, как говорится в названии, если я выполню следующий код Python на Spyder, моя машина зависнет в первую эпоху. Что происходит: использование оперативной памяти достигает ~94%, через некоторое время Spyder выплевывает окно проблемы, но я не получаю сообщения об ошибке в консоли. Код просто зависает.

Я делаю это с более чем 6 миллионами наблюдений, поэтому я попробовал это с 10, и это сработало. Затем я попробовал с 100 000, и это работает, но очень и очень медленно, что я считаю странным.

Может ли кто-нибудь проверить это на своей машине? Это может быть какая-то проблема с пакетом. Или это может быть код, я не слишком уверен в функции constrained_mse.

Код:

 from os import path
import pandas as pd
from sklearn.model_selection import train_test_split
from tensorflow import keras
import tensorflow as tf
tf.compat.v1.enable_eager_execution()
from tensorflow.keras import layers, losses
import numpy as np


# Hyperparameters
n_hidden_layers = 2 # Number of hidden layers.
n_units = 128 # Number of neurons of the hidden layers.
n_batch = 64 # Number of observations used per gradient update.
n_epochs = 30


# Create DataFrame (df) with random floats
call_df = pd.DataFrame(np.random.rand(6000000, 6) * 100, 
                       columns=['Strike', "Time to Maturity", 
                                "Option_Average_Price", "RF Rate", 
                                "Sigma 20 Days Annualized", 
                                "Underlying Price"])
# call_df = call_df.iloc[-10:,:]

# Split call_df into random train and test subsets, for inputs (X) and output (y)
call_X_train, call_X_test, call_y_train, call_y_test = (train_test_split(
    call_df.drop(["Option_Average_Price"], axis = 1), 
    call_df.Option_Average_Price, test_size = 0.01))


# Create model using Keras' Functional API
def mlp3_call(n_hidden_layers, n_units):
    # Create input layer
    inputs = keras.Input(shape = (call_X_train.shape[1],))
    x = layers.LeakyReLU(alpha = 1)(inputs)

    # Create hidden layers
    for _ in range(n_hidden_layers):
        x = hl(x, n_units)

    # Create output layer
    outputs = layers.Dense(1, activation = keras.activations.softplus)(x)

    # Actually create the model
    model = keras.Model(inputs=inputs, outputs=outputs)
    
    return model


# Hidden layer generation function
def hl(tensor, n_units):
    hl_output = layers.Dense(n_units, 
                             activation = layers.LeakyReLU(alpha=1))(tensor)
    return hl_output


# Custom loss function that is a MSE function plus three soft constraints
def constrained_mse(y_true, y_pred):
    
    mse = losses.mse(y_true, y_pred)
    
    x = tf.convert_to_tensor(call_X_train, np.float32)
    
    with tf.GradientTape() as tape:
        tape.watch(x)
        with tf.GradientTape(persistent=True) as tape2:
            tape2.watch(x)
            y = model(x)
        
    grad_y = tape2.gradient(y, x)
    dy_dstrike = grad_y[0, 0]
    dy_dttm = grad_y[0, 1]
    
    grad_y2 = tape.gradient(y, x)
    d2y_dstrike2 = grad_y2[0, 0]
    
    loss = mse   dy_dstrike   dy_dttm   d2y_dstrike2

    return loss


model = mlp3_call(n_hidden_layers, n_units) 
model.compile(loss = constrained_mse, optimizer = keras.optimizers.Adam(),)
history = model.fit(call_X_train, call_y_train, batch_size = n_batch, 
                    epochs = n_epochs, validation_split = 0.01, verbose = 1)

# Save the model's architecture, weights and optimizer's state
directory = path.join("Saved_models", "mlp3_call_1")
model.save(directory)

# Save the model's train and validation losses for each epoch.
train_loss = history.history["loss"]
validation_loss = history.history["val_loss"]
numpy_train_loss = np.array(train_loss)
numpy_validation_loss = np.array(validation_loss)
np.savetxt("Saved_models/mlp3_call_1_train_losses.txt", 
            numpy_train_loss, delimiter=",")
np.savetxt("Saved_models/mlp3_call_1_validation_losses.txt", 
            numpy_validation_loss, delimiter=",")


 

ПРАВКА: Моя машина-это Mac с 16 ГБ оперативной памяти и процессором 3210 М 2,5 ГГц. Этот, кроме моего, имеет SSD и 16 ГБ оперативной памяти

Комментарии:

1. Можете ли вы опубликовать все свои спецификации Mac с Choose Apple menu  > About This Mac

2. Вы используете компьютер Intel или Mac M1?

3. Возможно, проблема в том, что вы используете постоянную градиентную ленту и не удаляете ее. Это может привести к утечке памяти, но я не знаю наверняка. Вы можете попробовать вставить del tape2 после того, как закончите с этой лентой. Или просто удалите настойчивость, так как, по-видимому, в вашем коде для этого нет причин.

4. @Люк закончил. Нет, это не M1 Mac

5. @Люк, я разбил Google Colab, лол. «Ваш сеанс прервался после использования всей доступной оперативной памяти». Так что у моего кода есть некоторые проблемы с оптимизацией.