awslabs / keras-apache-mxnet

[DEPRECATED] Amazon Deep Learning's Keras with Apache MXNet support
https://github.com/awslabs/keras-apache-mxnet/wiki
Other
290 stars 65 forks source link

Add sparse weight kernel #187

Closed kalyc closed 5 years ago

kalyc commented 5 years ago

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.

kalyc commented 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))