是否有Keras函数来计算单元总数?

是否有Keras函数来计算单元总数?,keras,Keras,Keras有一个count_param()Python函数来计算人工神经网络(ANN)模型的可训练参数的总数 同样,是否有一个Keras函数来计算ANN模型的单元总数?似乎没有简单的方法。例如,输入层将返回一个元组列表,其中(大多数?)其他层只返回一个元组。但在大多数情况下,以下功能应该可以工作 很明显,此函数接受一个模型并返回两个输出 输出单元总数 将每层中的单位作为列表输出 如果它在任何特定情况下都不起作用,请告诉我(因为我还没有对此进行详尽的测试) 你想要一个可以推广到任何网络或完全连

Keras有一个count_param()Python函数来计算人工神经网络(ANN)模型的可训练参数的总数


同样,是否有一个Keras函数来计算ANN模型的单元总数?

似乎没有简单的方法。例如,输入层将返回一个元组列表,其中(大多数?)其他层只返回一个元组。但在大多数情况下,以下功能应该可以工作

很明显,此函数接受一个模型并返回两个输出

  • 输出单元总数
  • 将每层中的单位作为列表输出
如果它在任何特定情况下都不起作用,请告诉我(因为我还没有对此进行详尽的测试)


你想要一个可以推广到任何网络或完全连接的网络的解决方案吗?实际上,我想要一个适用于lstm_seq2seq示例(c.f.)的解决方案。没有辍学,但有LSTM单元,所以我不确定它是否是完全连接的网络。它在“基本”ANN上运行良好,但在包含LSTM的ANN上运行不好。@XavierM,我实际上在LSTM上测试了它,它工作正常。但这取决于你需要什么样的输出。例如,假设您使用
LSTM(return\u sequences=True)
,这将以
timesteps*n\u单位的形式输出单位。但是,如果您只想要
n_单位
,您可能需要根据图层类型执行if-else i定义的输出大小为除批量大小外的所有倍数,因为批量大小一次概括为密集、Conv2D、LSTM(如果您采用上述计算单位的方法)
model.count_params()
from functools import reduce
from itertools import chain
import operator 
def count_units(model):
  tot_out = 0
  out_list = []
  for lyr in model.layers:
    if lyr.trainable:
      # This is to tackle any layers that have the output shape as a list of tuples (e.g Input layer)
      if isinstance(lyr.output_shape, list):
        curr_out = reduce(operator.mul, chain(*[s[1:] for s in lyr.output_shape]), 1)
      # This is to tackle other layers like Dense and Conv2D
      elif isinstance(lyr.output_shape, tuple):
        curr_out = reduce(operator.mul, lyr.output_shape[1:], 1)
      else:
        raise TypeError
      tot_out += curr_out
      out_list.append(curr_out)
  return tot_out, out_list

print(count_units(model))