将重新缩放层(或与此相关的任何层)添加到经过训练的 tensorflow keras 模型
Adding a rescaling layer (or any layer for that matter) to a trained tensorflow keras model
我有一个用 tensorflow 2.3 训练的 tensorflow keras 模型。该模型将图像作为输入,但是该模型是使用缩放输入训练的,因此我们必须在将图像输入模型之前将图像缩放 255。
当我们在各种平台上使用这个模型时,我试图通过修改模型来简化这一点,以便在 keras 模型的开头插入一个重新缩放层(即紧接在输入之后)。因此,此模型的任何未来消费都可以简单地传递图像而无需缩放它们。
我很难让它工作。我知道我需要使用以下函数来创建一个缩放图层;
tf.keras.layers.experimental.preprocessing.Rescaling(255, 0.0, "rescaling")
但我不确定如何将其插入模型的开头。
提前致谢
您可以将此层插入训练模型的顶部。下面是一个例子,首先我们训练一个模型手动缩放输入,然后我们使用相同的训练模型但在顶部添加一个 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
重新缩放图像是数据预处理的一部分,重新缩放图像也称为图像归一化,此过程有助于为您正在使用的数据集或数值提供统一的比例在构建 model.In 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
我有一个用 tensorflow 2.3 训练的 tensorflow keras 模型。该模型将图像作为输入,但是该模型是使用缩放输入训练的,因此我们必须在将图像输入模型之前将图像缩放 255。
当我们在各种平台上使用这个模型时,我试图通过修改模型来简化这一点,以便在 keras 模型的开头插入一个重新缩放层(即紧接在输入之后)。因此,此模型的任何未来消费都可以简单地传递图像而无需缩放它们。
我很难让它工作。我知道我需要使用以下函数来创建一个缩放图层;
tf.keras.layers.experimental.preprocessing.Rescaling(255, 0.0, "rescaling")
但我不确定如何将其插入模型的开头。
提前致谢
您可以将此层插入训练模型的顶部。下面是一个例子,首先我们训练一个模型手动缩放输入,然后我们使用相同的训练模型但在顶部添加一个 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
重新缩放图像是数据预处理的一部分,重新缩放图像也称为图像归一化,此过程有助于为您正在使用的数据集或数值提供统一的比例在构建 model.In 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