diff --git a/bob/learn/libsvm/machine.cpp b/bob/learn/libsvm/machine.cpp
index b4b8300b1d10a4df8940844a95255ab0a11b180a..5dfb98cead32ac3939bcb1c83ae7e5a252895f9e 100644
--- a/bob/learn/libsvm/machine.cpp
+++ b/bob/learn/libsvm/machine.cpp
@@ -444,11 +444,11 @@ PyObject* PyBobLearnLibsvmMachine_Repr(PyBobLearnLibsvmMachineObject* self) {
    * <bob.learn.libsvm.Machine float64@(3, 2)>
    */
 
-  auto shape = make_safe(PyObject_GetAttrString((PyObject*)self, "shape"));
-  auto shape_str = make_safe(PyObject_Str(shape.get()));
+  PyObject* shape = Py_BuildValue("(nn)", self->cxx->inputSize(),
+      self->cxx->outputSize());
 
   PyObject* retval = PyUnicode_FromFormat("<%s float64@%U>",
-      Py_TYPE(self)->tp_name, shape_str.get());
+      Py_TYPE(self)->tp_name, PYOBJECT_STR(shape));
 
 #if PYTHON_VERSION_HEX < 0x03000000
   if (!retval) return 0;
diff --git a/bob/learn/libsvm/test_machine.py b/bob/learn/libsvm/test_machine.py
index c05d912647da2bed404b2eb94a2dcf25ddaf3de6..76a00acba4534f3f16571d7f9ef6709df53b547d 100644
--- a/bob/learn/libsvm/test_machine.py
+++ b/bob/learn/libsvm/test_machine.py
@@ -79,6 +79,7 @@ def test_can_load():
   assert -1 in machine.labels
   assert +1 in machine.labels
   assert abs(machine.gamma - 0.0769231) < 1e-6
+  assert type(machine.__repr__()) is str
 
 def test_can_save():
 
@@ -251,6 +252,7 @@ def test_correctness_iris():
   pred_labels, pred_probs = machine.predict_class_and_probabilities(data)
   assert numpy.array_equal(pred_labels, real_labels)
   assert numpy.all(abs(numpy.vstack(pred_probs) - numpy.vstack(real_probs)) < 1e-6)
+  
 
 @nose.tools.raises(RuntimeError)
 def test_correctness_inputsize_exceeds():