Python 如何在Tensorflow中使用预先训练好的模型而不必上课?

Python 如何在Tensorflow中使用预先训练好的模型而不必上课?,python,tensorflow,keras,resnet,Python,Tensorflow,Keras,Resnet,我正在尝试使用一个预训练的网络,例如tf.keras.applications.ResNet50,但我有两个问题: 我只想在网络的末端获得最上面的嵌入层,因为我不想做任何图像分类。因此,我认为不需要一个班级编号 tf.keras.applications.ResNet50采用默认参数'classes=1000' 有没有办法省略这个参数 我输入的图片是128*128*1像素,而不是224*224*3 修复输入数据形状的最佳方法是什么 我的目标是用resnet网络的输出制作一个三重损耗网

我正在尝试使用一个预训练的网络,例如
tf.keras.applications.ResNet50
,但我有两个问题:

我只想在网络的末端获得最上面的嵌入层,因为我不想做任何图像分类。因此,我认为不需要一个班级编号

  • tf.keras.applications.ResNet50
    采用默认参数
    'classes=1000'

    • 有没有办法省略这个参数
  • 我输入的图片是
    128*128*1
    像素,而不是
    224*224*3

    • 修复输入数据形状的最佳方法是什么
我的目标是用
resnet
网络的输出制作一个三重损耗网络

非常感谢

  • ResNet50
    有一个参数
    include_top
    正好用于此目的——将其设置为
    False
    跳过最后一个完全连接的层。(然后输出长度为2048的特征向量)
  • 减小图像大小的最佳方法是对图像重新采样,例如使用专用功能

    • 而且,我一开始并没有注意到您的输入图像只有三个通道,thx@Daniel。我建议您在GPU上构建3通道灰度图像(而不是在主机上使用numpy),以避免使用
      tf.tile将数据传输到GPU内存的时间增加三倍:

      im3 = tf.tile(im, (1, 1, 1, 3))
      
      • ResNet50
        有一个参数
        include_top
        正好用于此目的——将其设置为
        False
        跳过最后一个完全连接的层。(然后输出长度为2048的特征向量)
      • 减小图像大小的最佳方法是对图像重新采样,例如使用专用功能

        • 而且,我一开始并没有注意到您的输入图像只有三个通道,thx@Daniel。我建议您在GPU上构建3通道灰度图像(而不是在主机上使用numpy),以避免使用
          tf.tile将数据传输到GPU内存的时间增加三倍:

          im3 = tf.tile(im, (1, 1, 1, 3))
          

      作为另一个答案的补充。您还需要使图像具有三个通道,尽管从技术上讲,这不是Resnet的最佳输入,但它是最简单的解决方案(如果您访问源代码并自己更改输入形状,则更改Resnet模型也是一个选项)

      使用numpy在三个通道中打包图像:

      images3ch = np.concatenate([images,images,images], axis=-1)
      

      作为对另一个答案的补充。您还需要使图像具有三个通道,尽管从技术上讲,这不是Resnet的最佳输入,但它是最简单的解决方案(如果您访问源代码并自己更改输入形状,则更改Resnet模型也是一个选项)

      使用numpy在三个通道中打包图像:

      images3ch = np.concatenate([images,images,images], axis=-1)
      

      对于第一个问题:您可以创建整个网络,加载预训练权重,然后删除最后一层。对于第二个问题:您可能需要寻找一些支持任何图像大小的现代架构。(他们使用
      Adaptive Pooling
      而不是
      Max Pooling
      )。对于第一个问题:您可以创建整个网络,加载预训练权重,然后删除最后一层。对于第二个问题:您可能想寻找一些支持任何图像大小的现代体系结构。(他们使用
      自适应池
      而不是
      最大池
      )。