Tensorflow 改变TF 2.3和TF.keras中的完全卷积网络输入形状

Tensorflow 改变TF 2.3和TF.keras中的完全卷积网络输入形状,tensorflow,keras,deep-learning,tf.keras,Tensorflow,Keras,Deep Learning,Tf.keras,我正在使用tensorflow 2.3和tf.keras 我用输入的shape(None,120120,12)训练了一个图像网络。实际上,由于一个编码错误,我还能够训练模型,同时将输入声明为(None,128128,12),同时输入(None,120120,12)批。TF只是打印了一条警告,并不在意。这不是以前版本中的行为。我的网络只有卷积层,如果考虑到深度,输入大小有足够的2次幂,它提供与输入形状相同的输出图像,它只有卷积层 我终于完全训练了这个模型,我想把它也应用到不同形状的图像上。有没有合

我正在使用tensorflow 2.3和
tf.keras

我用输入的shape
(None,120120,12)
训练了一个图像网络。实际上,由于一个编码错误,我还能够训练模型,同时将输入声明为
(None,128128,12)
,同时输入
(None,120120,12)
批。TF只是打印了一条警告,并不在意。这不是以前版本中的行为。我的网络只有卷积层,如果考虑到深度,输入大小有足够的2次幂,它提供与输入形状相同的输出图像,它只有卷积层


我终于完全训练了这个模型,我想把它也应用到不同形状的图像上。有没有合适的方法来改变我训练过的模型的输入形状?或者我应该定义一个新模型,然后逐层复制权重?还是我应该忘记它,接受警告,忘记它们,因为它无论如何都能工作?

啊。你又来了。我认为你的问题基本上很简单。使用输入大小训练模型后。如果要运行模型,输入必须是相同的形状。但是,如果您想利用经过培训的模型,并且认为所学的功能没有太大不同,那么您可以应用transferlearning,当然,可以再次对其进行再培训。您不必复制权重,只需冻结模型并只训练输入和输出。您可以使用VGG检查一些基本示例

base_model = tensorflow.keras.applications.VGG19(
        weights='imagenet',  # Load weights pre-trained on ImageNet.
        input_shape=(224, 224, 3),
        include_top=False)
base_model.trainable = False

inputs = layers.Input(shape=150,150,3)
x = base_model(inputs, training=False)
x = keras.layers.GlobalAveragePooling2D()(x)
outputs = keras.layers.Dense(1)(x)
model = keras.Model(inputs, outputs)
model.summary()
Model: "model"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_4 (InputLayer)         [(None, 150, 150, 3)]     0         
_________________________________________________________________
vgg19 (Model)                multiple                  20024384  
_________________________________________________________________
global_average_pooling2d (Gl (None, 512)               0         
_________________________________________________________________
dense (Dense)                (None, 1)                 513       
=================================================================

啊。你又来了。我认为你的问题基本上很简单。使用输入大小训练模型后。如果要运行模型,输入必须是相同的形状。但是,如果您想利用经过培训的模型,并且认为所学的功能没有太大不同,那么您可以应用transferlearning,当然,可以再次对其进行再培训。您不必复制权重,只需冻结模型并只训练输入和输出。您可以使用VGG检查一些基本示例

base_model = tensorflow.keras.applications.VGG19(
        weights='imagenet',  # Load weights pre-trained on ImageNet.
        input_shape=(224, 224, 3),
        include_top=False)
base_model.trainable = False

inputs = layers.Input(shape=150,150,3)
x = base_model(inputs, training=False)
x = keras.layers.GlobalAveragePooling2D()(x)
outputs = keras.layers.Dense(1)(x)
model = keras.Model(inputs, outputs)
model.summary()
Model: "model"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_4 (InputLayer)         [(None, 150, 150, 3)]     0         
_________________________________________________________________
vgg19 (Model)                multiple                  20024384  
_________________________________________________________________
global_average_pooling2d (Gl (None, 512)               0         
_________________________________________________________________
dense (Dense)                (None, 1)                 513       
=================================================================

不,输入不必是相同的形状。事实上,现在在TF2.3中,我可以在128x128上训练一个模型,它将在256x256上运行,只需一个警告(而且精度很高)。我没有任何致密层,所以没有尺寸不匹配。我已经多次阅读了您在这里提供的链接,但它只适用于keras提供的模型,而我有自己的模型!好的精度是奇怪的,但根据你的模型没有密集的层,所以它是合理的。然而,正如我刚才所建议的,利用冻结模型而不是逐层复制更好,我有理由期望针对我的问题获得适当的精度(固定像素大小的显微镜,128x128是补丁,256x256是整个图像)。但这与编程基本无关。那么,我如何“冻结”我的模型呢。在推断过程中,权重不会得到更新。我找不到一种方法来表示更改任意模型的模型输入大小。您只需要声明一个具有不同形状的输入层,并将其与您选择的冻结层连接。您可以选择一系列要冻结的层:
用于vgg_conv.layers[:]:layer.trainable=False
我给您的链接是一个使用不同iputI重用模型的示例,我很容易理解如何冻结层。但是,我不知道如何连接到我创建的现有模型(不是keras中已经存在的模型,就像他们在链接中所做的那样)一个不同的层!我是说。。。我知道如何将一个层连接到现有的输出,但不知道如何在切掉一些层后注入不同的输入不,输入不必是相同的形状。事实上,现在在TF2.3中,我可以在128x128上训练一个模型,它将在256x256上运行,只需一个警告(而且精度很高)。我没有任何致密层,所以没有尺寸不匹配。我已经多次阅读了您在这里提供的链接,但它只适用于keras提供的模型,而我有自己的模型!好的精度是奇怪的,但根据你的模型没有密集的层,所以它是合理的。然而,正如我刚才所建议的,利用冻结模型而不是逐层复制更好,我有理由期望针对我的问题获得适当的精度(固定像素大小的显微镜,128x128是补丁,256x256是整个图像)。但这与编程基本无关。那么,我如何“冻结”我的模型呢。在推断过程中,权重不会得到更新。我找不到一种方法来表示更改任意模型的模型输入大小。您只需要声明一个具有不同形状的输入层,并将其与您选择的冻结层连接。您可以选择一系列要冻结的层:
用于vgg_conv.layers[:]:layer.trainable=False
我给您的链接是一个使用不同iputI重用模型的示例,我很容易理解如何冻结层。但是,我不知道如何连接到我创建的现有模型(不是keras中已经存在的模型,就像他们在链接中所做的那样)一个不同的层!我是说。。。我知道如何将一个层连接到现有的输出,但不知道如何在切掉一些层后注入不同的输入