【问题标题】:Adding a rescaling layer (or any layer for that matter) to a trained tensorflow keras model向训练有素的 tensorflow keras 模型添加重新缩放层(或任何层)
【发布时间】:2021-05-18 17:26:47
【问题描述】:

我有一个使用 tensorflow 2.3 训练的 tensorflow keras 模型。该模型将图像作为输入,但是该模型是使用缩放输入进行训练的,因此我们必须将图像缩放 255 才能将它们输入到模型中。

当我们在各种平台上使用这个模型时,我试图通过修改模型来简化这一点,以便在 keras 模型的开头(即紧接在输入之后)插入一个重新缩放层。因此,该模型的任何未来使用都可以简单地传递图像而无需缩放它们。

我在让它工作时遇到了很多麻烦。我知道我需要使用以下函数来创建缩放层;

tf.keras.layers.experimental.preprocessing.Rescaling(255, 0.0, "rescaling")

但我不确定如何将其插入模型的开头。

提前谢谢你

【问题讨论】:

    标签: python tensorflow machine-learning keras tf.keras


    【解决方案1】:

    您可以将此层插入到已训练模型的顶部。下面是一个示例,首先我们训练模型手动缩放输入,然后我们使用相同的训练模型,但在顶部添加Rescaling

    from tensorflow.keras.layers.experimental.preprocessing import Rescaling
    
    # generate dummy data
    input_dim = (28,28,3)
    n_sample = 10
    
    X = np.random.randint(0,255, (n_sample,)+input_dim)
    y = np.random.uniform(0,1, (n_sample,))
    
    # create base model
    inp = Input(input_dim)
    x = Conv2D(8, (3,3))(inp)
    x = Flatten()(x)
    out = Dense(1)(x)
    
    # fit base model with manual scaling
    model = Model(inp, out)
    model.compile('adam', 'mse')
    model.fit(X/255, y, epochs=3)
    
    # create new model with pretrained weight + rescaling at the top
    inp = Input(input_dim)
    scaled_input = Rescaling(1/255, 0.0, "rescaling")(inp)
    out = model(scaled_input)
    scaled_model = Model(inp, out)
    
    # compare prediction with manual scaling vs layer scaling
    pred = model.predict(X/255)
    pred_scaled = scaled_model.predict(X)
    
    (pred.round(5) == pred_scaled.round(5)).all() # True
    

    【讨论】:

      【解决方案2】:

      重新缩放图像是数据预处理的一部分,重新​​缩放图像也称为图像标准化,此过程对于在构建模型之前为您正在使用的数据集或数值提供统一的缩放比例非常有用。在 keras 中,您可以根据您的目标使用以下方法之一以多种方式执行此操作:

      如果您使用人工神经网络模型进行训练,您可以使用:-

      “Batch normalization layer”或“Layer Normalization”或通过你提到的keras的rescale方法。您可以查看此资源以获取有关规范化的更多信息。 https://machinelearningknowledge.ai/keras-normalization-layers-explained-for-beginners-batch-normalization-vs-layer-normalization/

      使用您提到的重新缩放方法:

      #importing you libraries 1st
      import tensorflow as tf
      from tensorflow.keras.layers import BatchNormalization
      #if your are using dataset from directory 
      import pathlib 
      

      然后导入您的数据集:

      Dataset_Dir = '/Dataset/ path'
      image size = (256,256) #the image size in your dataset
      image shape = (96,96,3) #The shape you wish for your images in your network
      

      然后将您的数据集划分为我使用 70-30% 的训练测试

      Training_set = tf.keras.preprocessing.image_dataset_from_directory(Dataset_Dir,batch_size= 32,
                                                                     image_size= image_size,
                                                                     validation_split= 0.3,subset = "training",seed =123)
      

      测试集

      Testing_set = tf.keras.preprocessing.image_dataset_from_directory(Dataset_Dir,image_size= image_size,
                                                                    validation_split=0.3,seed=123,subset ="validation")
      

      标准化层:

      normalization_layer = tf.keras.layers.experimental.preprocessing.Rescaling(1./255)
      normalized_training_set = Training_set.map(lambda x, y: (normalization_layer(x), y))
      training_image_batch,training_labels_batch = next(iter(normalized_training_set))
      

      有关此方法的更多信息: 看张量流教程: https://www.tensorflow.org/tutorials/images/classification

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-08
        • 2021-05-20
        • 2021-10-07
        • 1970-01-01
        • 2019-05-31
        • 1970-01-01
        相关资源
        最近更新 更多