Мультиклассовая логистическая регрессия

Я пытаюсь написать многоклассовую логистическую регрессию с помощью numpy и выполнить перекрестное проверочное тестирование с использованием MNIST:

num_classes = 10
num_features = 784
learning_rate = 0.0001
training_steps = 50
batch_size = 256
display_step = 50

from tensorflow.keras.datasets import mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train, x_test = np.array(x_train, np.float32), np.array(x_test, np.float32)

x_train, x_test = x_train.reshape([-1, num_features]), x_test.reshape([-1, num_features])

x_train, x_test = x_train/255., x_test/255.

def logistic_regression(x, b, b0):
  return 1./(1.+np.exp(-np.dot(b,x)-b0))

b = np.random.uniform(-1, 1, num_features*num_classes).reshape((num_classes, num_features))
b0 = np.random.uniform(-1, 1, num_classes)

for step in range(training_steps):
  db = np.zeros((num_classes, num_features), dtype = 'float32')
  db0 = np.zeros(num_classes, dtype = 'float32')

  for x, y in zip (x_train, y_train):
    yy = tf.one_hot(y, depth=num_classes).numpy()
    a = logistic_regression(x, b, b0)
    db += np.matmul(np.expand_dims(yy - a, axis =- 1), np.expand_dims(x, axis = 0))
    db0 += yy - a

  b += learning_rate * db
  b0 += learning_rate * db0

def accuracy(y_pred, y_true):
  correct_prediction = np.equal(np.argmax(y_pred, axis = 1), y_true.astype(np.int64))
  return np.mean(correct_prediction.astype(np.float32))

pred = np.vectorize(logistic_regression, signature='(n),(n),()->()')(x_test, b, b0)

Но приведенный выше код выдает мне следующую ошибку:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-12-a37a0ec6d637> in <module>()
----> 1 pred = np.vectorize(logistic_regression, signature='(n),(n),()->()')(x_test, b, b0)

4 frames
/usr/local/lib/python3.7/dist-packages/numpy/lib/function_base.py in __call__(self, *args, **kwargs)
   2106             vargs.extend([kwargs[_n] for _n in names])
   2107 
-> 2108         return self._vectorize_call(func=func, args=vargs)
   2109 
   2110     def _get_ufunc_and_otypes(self, func, args):

/usr/local/lib/python3.7/dist-packages/numpy/lib/function_base.py in _vectorize_call(self, func, args)
   2180         """Vectorized call to `func` over positional `args`."""
   2181         if self.signature is not None:
-> 2182             res = self._vectorize_call_with_signature(func, args)
   2183         elif not args:
   2184             res = func()

/usr/local/lib/python3.7/dist-packages/numpy/lib/function_base.py in _vectorize_call_with_signature(self, func, args)
   2210 
   2211         broadcast_shape, dim_sizes = _parse_input_dimensions(
-> 2212             args, input_core_dims)
   2213         input_shapes = _calculate_shapes(broadcast_shape, dim_sizes,
   2214                                          input_core_dims)

/usr/local/lib/python3.7/dist-packages/numpy/lib/function_base.py in _parse_input_dimensions(args, input_core_dims)
   1875         dummy_array = np.lib.stride_tricks.as_strided(0, arg.shape[:ndim])
   1876         broadcast_args.append(dummy_array)
-> 1877     broadcast_shape = np.lib.stride_tricks._broadcast_shape(*broadcast_args)
   1878     return broadcast_shape, dim_sizes
   1879 

/usr/local/lib/python3.7/dist-packages/numpy/lib/stride_tricks.py in _broadcast_shape(*args)
    187     # use the old-iterator because np.nditer does not handle size 0 arrays
    188     # consistently
--> 189     b = np.broadcast(*args[:32])
    190     # unfortunately, it cannot handle 32 or more arguments directly
    191     for pos in range(32, len(args), 31):

ValueError: shape mismatch: objects cannot be broadcast to a single shape

Подскажите, пожалуйста, что не так с кодом?


Ответы (0 шт):