Closed kalyc closed 5 years ago
Tested using H5 model saving -
import time
from scipy import sparse
from keras import Model
from keras.layers import Dense, Input
from keras.optimizers import SGD
from keras import backend as K
from keras.utils import multi_gpu_model
import keras as k
import mxnet as mx
from keras import models
from keras.utils.data_utils import prepare_sliced_sparse_data
feature_dimension = 100
train_data = mx.test_utils.rand_ndarray((1000, feature_dimension), 'csr')
target_weight = mx.nd.arange(1, feature_dimension + 1).reshape((feature_dimension, 1))
train_label = mx.nd.dot(train_data, target_weight)
eval_data = train_data
eval_label = mx.nd.dot(eval_data, target_weight)
batch_size = 1
gpus = 0
epochs = 1
train_data = prepare_sliced_sparse_data(train_data, batch_size)
train_label = prepare_sliced_sparse_data(train_label, batch_size)
eval_data = prepare_sliced_sparse_data(eval_data, batch_size)
eval_label = prepare_sliced_sparse_data(eval_label, batch_size)
import numpy as np
label = eval_label
eval_iter = mx.io.NDArrayIter({'csr_data': eval_data},
{'softmax_label': label}, batch_size,
shuffle=True, last_batch_handle='discard'
)
train_data = sparse.csr_matrix(train_data.asnumpy())
train_label = train_label.asnumpy()
eval_data = sparse.csr_matrix(eval_data.asnumpy())
eval_label=eval_label.asnumpy()
inputs = Input(batch_shape=(None, train_data.shape[1]), dtype='float32', sparse=True)
predictions = Dense(units=1, activation='linear', kernel_initializer='normal')(inputs)
model = Model(inputs=inputs, outputs=predictions)
model.summary()
sgd = SGD(lr=0.1, momentum=0.9)
if gpus > 1:
model = multi_gpu_model(model, gpus=gpus)
model.compile(loss='mse', optimizer=sgd, metrics=['accuracy'])
start = time.time()
model.fit(train_data,
train_label,
epochs=epochs,
batch_size=batch_size, verbose=1)
import tempfile
_, fname = tempfile.mkstemp('.h5')
models.save_model(model, fname)
model = models.load_model(fname)
print("Keras Benchmark Results")
print("Dataset: Synthetic Sparse Data")
print("Backend: ", K.backend().capitalize())
print("Batch Size: ", batch_size)
if gpus >= 1:
print("Benchmark run on %d GPU", gpus)
else:
print("Benchmark run on CPU")
print("Total Time: ", time.time() - start)
mse = model.evaluate(eval_data, eval_label, verbose=0, batch_size=batch_size)
print("Achieved {0:.6f} validation MSE".format(mse[0]))
print(model.evaluate(eval_data, eval_label, verbose=1, batch_size=batch_size))
Summary
Add sparse weight kernel
Related Issues
Improve sparse keras benchmark performance
PR Overview
PR has been tested on mnist_cnn & imdb_lstm example & end-to-end tests are passing
We can consider merging PR to another branch until all sparse benchmark work is updated.