首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在经过训练的tensorflow keras模型中添加重新标度层(或任何相关层)

在经过训练的tensorflow keras模型中添加重新标度层(或任何相关层)
EN

Stack Overflow用户
提问于 2021-02-15 19:55:12
回答 2查看 7.4K关注 0票数 3

我用tensorflow 2.3训练了tensorflow keras模型。该模型以图像作为输入,但是模型经过了缩放输入的训练,因此在将它们输入到模型中之前,我们必须将图像缩放到255。

当我们在各种平台上使用这个模型时,我试图通过修改模型来简化它,只需在keras模型的开头插入一个渐升层(即在输入之后)。因此,该模型今后的任何消耗都可以简单地传递图像,而不必对其进行缩放。

我很难把这件事办好。我知道我需要使用以下功能来创建一个重标度层;

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

但我不知道如何将这个插入到模型的开头。

提前谢谢你

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-15 21:11:53

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

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2021-11-06 00:05:37

重新缩放图像是数据预处理的一部分,而且重标度图像也称为图像规范化,此过程对于为在构建model.In角之前使用的数据集或数值提供一个统一的比例非常有用,因为您可以根据目标使用以下几种方法之一这样做:

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

“批归一化层”或“层规范化”或通过您提到的角化的渐减方法。有关规范化的更多信息,您可以查看此资源。https://machinelearningknowledge.ai/keras-normalization-layers-explained-for-beginners-batch-normalization-vs-layer-normalization/

要使用您提到的rescale方法:

代码语言:javascript
复制
#importing you libraries 1st
import tensorflow as tf
from tensorflow.keras.layers import BatchNormalization
#if your are using dataset from directory 
import pathlib 

然后导入数据集:

代码语言:javascript
复制
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 %。

代码语言:javascript
复制
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)

测试集

代码语言:javascript
复制
Testing_set = tf.keras.preprocessing.image_dataset_from_directory(Dataset_Dir,image_size= image_size,
                                                              validation_split=0.3,seed=123,subset ="validation")

归一化层:

代码语言:javascript
复制
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))

有关此方法的更多信息,请参见tensorflow教程:https://www.tensorflow.org/tutorials/images/classification

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66214588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档