'tensorflow optimization in deeplearning
I am a student learning keras.
I was studying about Tensorflow recently,
I am stuck in the problem of not being able to optimize as follows. (I am running on jupyter notebook)
How can I change the code? (I wonder how to modify the code to solve the problem of optimization.)
Imports & Settings
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline
import os, sys
from ast import literal_eval as make_tuple
from time import time
from pathlib import Path
from itertools import product
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from scipy.stats import spearmanr
import seaborn as sns
from sklearn.preprocessing import StandardScaler
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation
sys.path.insert(1, os.path.join(sys.path[0], '..'))
from utils import MultipleTimeSeriesCV, format_time
np.random.seed(42)
sns.set_style('whitegrid')
idx = pd.IndexSlice
DATA_STORE = '../data/assets.h5'
results_path = Path('results')
if not results_path.exists():
results_path.mkdir()
checkpoint_path = results_path / 'logs'
Create a stock return series to predict asset price moves
data = pd.read_hdf('../12_gradient_boosting_machines/data.h5', 'model_data').dropna().sort_index()```
outcomes = data.filter(like='fwd').columns.tolist()
lookahead = 1
outcome= f'r{lookahead:02}_fwd'
X_cv = data.loc[idx[:, :'2017'], :].drop(outcomes, axis=1)
y_cv = data.loc[idx[:, :'2017'], outcome]
Automate model generation
def make_model(dense_layers, activation, dropout):
'''Creates a multi-layer perceptron model
dense_layers: List of layer sizes; one number per layer
'''
model = Sequential()
for i, layer_size in enumerate(dense_layers, 1):
if i == 1:
model.add(Dense(layer_size, input_dim=X_cv.shape[1]))
model.add(Activation(activation))
else:
model.add(Dense(layer_size))
model.add(Activation(activation))
model.add(Dropout(dropout))
model.add(Dense(1))
model.compile(loss='mean_squared_error',
optimizer='Adam')
return model
Cross-validate multiple configurations with TensorFlow
n_splits = 12
train_period_length=21 * 12 * 4
test_period_length=21 * 3
cv = MultipleTimeSeriesCV(n_splits=n_splits,
train_period_length=train_period_length,
test_period_length=test_period_length,
lookahead=lookahead)
dense_layer_opts = [(16, 8), (32, 16), (32, 32), (64, 32)]
activation_opts = ['tanh']
dropout_opts = [0, .1, .2]
param_grid = list(product(dense_layer_opts, activation_opts, dropout_opts))
np.random.shuffle(param_grid)
def get_train_valid_data(X, y, train_idx, test_idx):
x_train, y_train = X.iloc[train_idx, :], y.iloc[train_idx]
x_val, y_val = X.iloc[test_idx, :], y.iloc[test_idx]
return x_train, y_train, x_val, y_val
ic = []
scaler = StandardScaler()
for params in param_grid:
dense_layers, activation, dropout = params
for batch_size in [64, 256]:
print(dense_layers, activation, dropout, batch_size)
checkpoint_dir = checkpoint_path / str(dense_layers) / activation / str(dropout) / str(batch_size)
if not checkpoint_dir.exists():
checkpoint_dir.mkdir(parents=True, exist_ok=True)
start = time()
for fold, (train_idx, test_idx) in enumerate(cv.split(X_cv)):
# get train & validation data
x_train, y_train, x_val, y_val = get_train_valid_data(X_cv, y_cv, train_idx, test_idx)
# scale features
x_train = scaler.fit_transform(x_train)
x_val = scaler.transform(x_val)
# set up dataframes to log results
preds = y_val.to_frame('actual')
r = pd.DataFrame(index=y_val.groupby(level='date').size().index)
# create model based on validation parameters
model = make_model(dense_layers, activation, dropout)
# cross-validate for 20 epochs
for epoch in range(20):
model.fit(x_train,
y_train,
batch_size=batch_size,
epochs=1,
verbose=0,
shuffle=True,
validation_data=(x_val, y_val))
model.save_weights((checkpoint_dir / f'ckpt_{fold}_{epoch}').as_posix())
preds[epoch] = model.predict(x_val).squeeze()
r[epoch] = preds.groupby(level='date').apply(lambda x: spearmanr(x.actual, x[epoch])[0]).to_frame(epoch)
print(format_time(time()-start), f'{fold + 1:02d} | {epoch + 1:02d} | {r[epoch].mean():7.4f} | {r[epoch].median():7.4f}')
ic.append(r.assign(dense_layers=str(dense_layers),
activation=activation,
dropout=dropout,
batch_size=batch_size,
fold=fold))
t = time()-start
pd.concat(ic).to_hdf(results_path / 'scores.h5', 'ic_by_day')
(64, 32) tanh 0 64
00:00:11 01 | 01 | nan | nan
00:00:20 01 | 02 | nan | nan
00:00:30 01 | 03 | nan | nan
00:00:39 01 | 04 | nan | nan
00:00:49 01 | 05 | nan | nan
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
