diff --git a/sknn/backend/lasagne/mlp.py b/sknn/backend/lasagne/mlp.py index 2a468e0..f49cfb2 100644 --- a/sknn/backend/lasagne/mlp.py +++ b/sknn/backend/lasagne/mlp.py @@ -259,7 +259,8 @@ def cast(array, indices): return None array = array[indices] - if type(array) != numpy.ndarray: + if not isinstance(array, numpy.ndarray): + assert hasattr(array, 'todense'), "Unknown data format and cannot convert to numpy.ndarray." array = array.todense() if array.dtype != theano.config.floatX: array = array.astype(theano.config.floatX) diff --git a/sknn/tests/test_types.py b/sknn/tests/test_types.py index 6b38f86..db05c83 100644 --- a/sknn/tests/test_types.py +++ b/sknn/tests/test_types.py @@ -1,7 +1,10 @@ import unittest from nose.tools import (assert_is_not_none, assert_raises, assert_equal, assert_true) +import os import random +import shutil +import tempfile import theano import numpy @@ -74,6 +77,33 @@ def test_Predict32(self): assert_equal(yp.dtype, numpy.float32) +class TestMemoryMap(unittest.TestCase): + + def setUp(self): + self.nn = MLP(layers=[L("Linear", units=3)], n_iter=1) + self.directory = tempfile.mkdtemp() + + def tearDown(self): + shutil.rmtree(self.directory) + + def make(self, name, shape, dtype): + filename = os.path.join(self.directory, name) + return numpy.memmap(filename, dtype=dtype, mode='w+', shape=shape) + + def test_FitAllTypes(self): + for t in ['float32', 'float64']: + theano.config.floatX = t + X = self.make('X', (12, 3), dtype=t) + y = self.make('y', (12, 3), dtype=t) + self.nn._fit(X, y) + + def test_PredictAllTypes(self): + for t in ['float32', 'float64']: + theano.config.floatX = t + X = self.make('X', (12, 3), dtype=t) + yp = self.nn._predict(X) + + class TestConvolution(unittest.TestCase): def setUp(self):