Tensorflow 当仍然没有维度时,Keras如何在早期计算参数数量?

Tensorflow 当仍然没有维度时,Keras如何在早期计算参数数量?,tensorflow,keras,parameters,resnet,Tensorflow,Keras,Parameters,Resnet,很抱歉问了一个非常基本的问题(我是Keras的新手)。我想知道Keras如何在早期阶段(拟合前)计算每一层的参数数量,尽管存在该模型。总结显示,在这一阶段,仍有维度没有值。这些值是否已经以某种方式确定,如果是,为什么不在摘要中显示它们 我问这个问题是因为我很难弄清楚我的“张量形状错误”(我试图确定我的resnet50模型的C5块的输出尺寸,但我无法在model.summary中看到它们,即使我看到了参数的数量) 下面我给出一个例子,它是基于视网膜网中的C5_还原层,由Resnet50的C5层馈电

很抱歉问了一个非常基本的问题(我是Keras的新手)。我想知道Keras如何在早期阶段(拟合前)计算每一层的参数数量,尽管存在该模型。总结显示,在这一阶段,仍有维度没有值。这些值是否已经以某种方式确定,如果是,为什么不在摘要中显示它们

我问这个问题是因为我很难弄清楚我的“张量形状错误”(我试图确定我的resnet50模型的C5块的输出尺寸,但我无法在model.summary中看到它们,即使我看到了参数的数量)

下面我给出一个例子,它是基于视网膜网中的C5_还原层,由Resnet50的C5层馈电。C5_减少了

Conv2D(256,kernel_size=1,strides=1,pad=1)
基于此特定层的model.summary:

C5_reduced (Conv2D)    (None, None, None, 256)          524544 

我猜测C5是(无,112048),因为2048*256+256=524544(我不知道如何确认或证实这个假设)。所以,如果已经知道了,为什么不在摘要上显示呢?如果尺寸2和3不同,参数的数量也会不同,对吗?

您需要为模型定义一个输入层。在a)编译模型并向其提供数据之前,可训练参数的总数是未知的,此时模型基于输入的维度生成一个图形,然后您将能够确定参数的数量,或者b)您使用指定的输入维度为模型定义一个输入层,然后可以使用model.summary()找到参数的数量


关键是,在定义输入层和第一个隐藏层之前,模型无法知道输入层和第一个隐藏层之间的参数数量,或者您运行推断并为其提供输入的形状。

您需要为模型定义一个输入层。在a)编译模型并向其提供数据之前,可训练参数的总数是未知的,此时模型基于输入的维度生成一个图形,然后您将能够确定参数的数量,或者b)您使用指定的输入维度为模型定义一个输入层,然后可以使用model.summary()找到参数的数量


关键是,在定义输入层和第一个隐藏层之前,模型无法知道输入层和第一个隐藏层之间的参数数量,或者您运行推断并为其提供输入的形状。

如果您将精确的输入形状传递给网络上的第一层或输入层,您将获得所需的输出。例如,我在这里使用了输入层:

input_1 (InputLayer)         [(None, 224, 224, 3)]     0         
_________________________________________________________________
block1_conv1 (Conv2D)        (None, 224, 224, 64)      1792      
_________________________________________________________________
block1_conv2 (Conv2D)        (None, 224, 224, 64)      36928     
将输入传递为(224,3)。3表示此处的深度。请注意,卷积参数的计算不同于致密层的计算

如果您执行以下操作:

tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(150, 150, 3))
你会看到:

conv2d (Conv2D) ---> (None, 148, 148, 16)    
尺寸减小到148x148,在Keras中,默认情况下填充是有效的。另外,
strips
为1。然后输出的形状将是148x148。(您可以搜索公式。)

那么什么是None值呢

  • 第一个None值是批量大小。在Keras中,第一个维度是批量大小。可以传递它们并进行修复,也可以在拟合模型或预测时确定它们
  • 在二维卷积中,预期输入为(批量大小、高度、宽度、通道),也可以具有(无、无、无、3)等形状,这意味着允许不同的图像大小
编辑:

产生:

conv2d_21 (Conv2D)           (None, None, None, 16)    448       
关于您的问题,即使我们将图像高度和宽度传递为,参数是如何计算的

根据以下公式计算的卷积参数:

(filter_height * filter_width * input_image_channels + 1) * number_of_filters
当我们把它们放入公式中

filter_height = 3
filter_width = 3
input_image_channel = 3
number_of_filters = 16
参数=(3x3x3+1)*16=28*16=448

注意,我们只需要输入_图像的通道号3,表示它是RGB图像

如果你想为后面的卷积计算PARAMs,你需要考虑的是前一层的滤波器数量成为当前层通道的数量。


这就是为什么您可以使用参数而不是批量大小。在这种情况下,Keras需要知道您的图像是否为RGB。或者,您在创建模型时不会指定尺寸,可以在使用数据集拟合模型时传递尺寸。

如果您将精确的输入形状传递到网络上的第一层或输入层,您将获得所需的输出。例如,我在这里使用了输入层:

input_1 (InputLayer)         [(None, 224, 224, 3)]     0         
_________________________________________________________________
block1_conv1 (Conv2D)        (None, 224, 224, 64)      1792      
_________________________________________________________________
block1_conv2 (Conv2D)        (None, 224, 224, 64)      36928     
将输入传递为(224,3)。3表示此处的深度。请注意,卷积参数的计算不同于致密层的计算

如果您执行以下操作:

tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(150, 150, 3))
你会看到:

conv2d (Conv2D) ---> (None, 148, 148, 16)    
尺寸减小到148x148,在Keras中,默认情况下填充是有效的。另外,
strips
为1。然后输出的形状将是148x148。(您可以搜索公式。)

那么什么是None值呢

  • 第一个None值是批量大小。在Keras中,第一个维度是批量大小。可以传递它们并进行修复,也可以在拟合模型或预测时确定它们
  • 在二维卷积中,预期输入为(批量大小、高度、宽度、通道),也可以具有(无、无、无、3)等形状,这意味着允许不同的图像大小
编辑:

产生:

conv2d_21 (Conv2D)           (None, None, None, 16)    448       
关于您的问题,即使我们将图像高度和宽度传递为,参数是如何计算的

根据以下公式计算的卷积参数:

(filter_height * filter_width * input_image_channels + 1) * number_of_filters
当我们把它们放入公式中

filter_height = 3
filter_width = 3
input_image_channel = 3
number_of_filters = 16
参数=(3x3x3+1)*16=28*16=448

注意,我们只需要输入_图像的通道号3,表示它是RGB图像

如果你想计算