NumPy код работает в REPL, скрипт говорит об ошибке типа - PullRequest
0 голосов
/ 11 октября 2018

Копирование и вставка этого кода в python3 REPL работает, но когда я запускаю его как скрипт, я получаю ошибку типа.

"""Softmax."""

scores = [3.0, 1.0, 0.2]

import numpy as np
from math import e

def softmax(x):
    """Compute softmax values for each sets of scores in x."""
    results = []
    x = np.transpose(x)
    for j in range(len(x)):
        exps = [np.exp(s) for s in x[j]]
        _sum = np.sum(np.exp(x[j]))
        softmax = [i / _sum for i in exps]
        results.append(softmax)
    final = np.vstack(results)
    return np.transpose(final)
#    pass  # TODO: Compute and return softmax(x)


print(softmax(scores))

# Plot softmax curves
import matplotlib.pyplot as plt 
x = np.arange(-2.0, 6.0, 0.1)
scores = np.vstack([x, np.ones_like(x), 0.2 * np.ones_like(x)])

plt.plot(x, softmax(scores).T, linewidth=2)
plt.show()

Ошибка, которую я получаю при запуске скрипта через CLI:следующее:

bash$ python3 softmax.py 
Traceback (most recent call last):
  File "softmax.py", line 22, in <module>
    print(softmax(scores))
  File "softmax.py", line 13, in softmax
    exps = [np.exp(s) for s in x[j]]
TypeError: 'numpy.float64' object is not iterable

Этот вид дерьма заставляет меня нервничать из-за запуска интерпретируемого кода при работе с библиотеками, подобными этим, серьезно ненадежное и неопределенное поведение совершенно неприемлемо для IMO.

1 Ответ

0 голосов
/ 11 октября 2018

В верхней части вашего сценария вы определяете

scores = [3.0, 1.0, 0.2]

Это аргумент в вашем первом вызове softmax(scores).При преобразовании в массив NumPy scores это 1-й массив с формой (3,).Вы передаете scores в функцию, а затем она преобразуется в массив numpy с помощью вызова

    x = np.transpose(x)

Однако, он все еще 1-й, с формой (3,).Функция transpose меняет местами измерения, но не добавляет измерение в 1-й массив.В действительности, transpose является «безоперационным» при применении к массиву 1-й.

Затем в следующем цикле x[j] является скаляром типа numpy.float64, поэтомуНе имеет смысла писать [np.exp(s) for s in x[j]].x[j] является скаляром, а не последовательностью, поэтому вы не можете итерировать по нему.

В нижней части вашего сценария вы переопределяете scores как

x = np.arange(-2.0, 6.0, 0.1)
scores = np.vstack([x, np.ones_like(x), 0.2 * np.ones_like(x)])

Теперьscores - это двумерный массив (scores.shape - (3, 80)), поэтому при вызове softmax(scores).

вы не получите сообщение об ошибке.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...