Как подсчитать общее количество обучаемых параметров в модели тензорного потока?
Есть ли вызов функции или другой способ подсчета общего количества параметров в модели тензорного потока?
По параметрам я имею в виду: N-мерный вектор обучаемых переменных имеет N параметров, NxM
матрица имеет N*M
параметры и т.д. Поэтому, по существу, я хотел бы суммировать произведение размерностей формы всех обучаемых переменных в сеансе тензорного потока,
Ответы
Ответ 1
tf.trainable_variables()
форму каждой переменной в tf.trainable_variables()
.
total_parameters = 0
for variable in tf.trainable_variables():
# shape is an array of tf.Dimension
shape = variable.get_shape()
print(shape)
print(len(shape))
variable_parameters = 1
for dim in shape:
print(dim)
variable_parameters *= dim.value
print(variable_parameters)
total_parameters += variable_parameters
print(total_parameters)
Обновление: я написал статью, чтобы прояснить динамические/статические фигуры в Tensorflow из-за этого ответа: https://pgaleone.eu/tensorflow/2018/07/28/understanding-tensorflow-tensors-shape-static-dynamic/
Ответ 2
У меня есть еще более короткая версия, однострочное решение с использованием numpy:
np.sum([np.prod(v.get_shape().as_list()) for v in tf.trainable_variables()])
Ответ 3
Не уверен, что данный ответ действительно выполняется (я обнаружил, что вам нужно преобразовать тусклый объект в int для его работы). Вот один, который работает, и вы можете просто скопировать вставку функций и вызвать их (добавлено несколько комментариев тоже):
def count_number_trainable_params():
'''
Counts the number of trainable variables.
'''
tot_nb_params = 0
for trainable_variable in tf.trainable_variables():
shape = trainable_variable.get_shape() # e.g [D,F] or [W,H,C]
current_nb_params = get_nb_params_shape(shape)
tot_nb_params = tot_nb_params + current_nb_params
return tot_nb_params
def get_nb_params_shape(shape):
'''
Computes the total number of params for a given shap.
Works for any number of shapes etc [D,F] or [W,H,C] computes D*F and W*H*C.
'''
nb_params = 1
for dim in shape:
nb_params = nb_params*int(dim)
return nb_params
Ответ 4
Два существующих ответа хороши, если вы сами изучаете количество параметров. Если ваш вопрос был в большей степени по строкам "есть ли простой способ профилировать мои модели TensorFlow?", Я бы настоятельно рекомендовал изучить tfprof. Он профилирует вашу модель, включая вычисление количества параметров.
Ответ 5
Я поставлю эквивалентную, но более короткую реализацию:
def count_params():
"print number of trainable variables"
size = lambda v: reduce(lambda x, y: x*y, v.get_shape().as_list())
n = sum(size(v) for v in tf.trainable_variables())
print "Model size: %dK" % (n/1000,)
Ответ 6
Если вы предпочитаете избегать numpy (это может быть опущено для многих проектов), тогда:
all_trainable_vars = tf.reduce_sum([tf.reduce_prod(v.shape) for v in tf.trainable_variables()])
Это перевод TF предыдущего ответа Юлиуса Кунзе.
Как и любая операция TF, для выполнения сеанса требуется выполнение сеанса:
print(sess.run(all_trainable_vars))
Ответ 7
Если ваша модель случается быть Keras
модель, определенно, tensorflow.python.keras.engine.training.Model
, то вы можете использовать model.count_params()
.
Документы находятся здесь: https://www.tensorflow.org/api_docs/python/tf/keras/backend/count_params