Tensorflow 用于加载数据的自定义图层
我将按照教程使用自定义图层进行预处理Tensorflow 用于加载数据的自定义图层,tensorflow,keras,keras-layer,Tensorflow,Keras,Keras Layer,我将按照教程使用自定义图层进行预处理 def pre_process(file_path): # loading file from disk and transforming into [90,13,1] 我正在将我的数据集创建为 files = ['file1,'file2`] labels = [0,1] 模型拟合因错误而失败 model.fit(train_dataset, epochs=1, verbose=1,validation_data=val_dataset)
def pre_process(file_path):
# loading file from disk and transforming into [90,13,1]
我正在将我的数据集创建为
files = ['file1,'file2`]
labels = [0,1]
模型拟合因错误而失败
model.fit(train_dataset, epochs=1, verbose=1,validation_data=val_dataset)
错误
AttributeError:在用户代码中:
/opt/conda/lib/python3.7/site packages/tensorflow/python/keras/engine/training.py:806 train_函数*
返回步骤_函数(self、迭代器)
:6电话*
返回预处理(inputs.numpy())
AttributeError:“Tensor”对象没有属性“numpy”
我的问题
这是实现模型管道的有效方法吗?层的结构和将所有预处理层组织到一个连续层中非常好。您不应该在层中加载任何学习示例(它不是模型的一部分,并且会降低其可移植性) 两个问题: 由于的原因,您没有
numpy()
方法。我建议坚持使用静态图,不要尝试在keras图中将任何内容转换为numpy,除非这是绝对必要的—性能问题。对张量的大多数操作都可以使用tf
完成
您的自定义预处理层应继承自tensorflow.keras.layers.Experiative.preprocessing.PreprocessingLayer
(来自tf.keras.layers.Experiative.preprocessing
的所有层直接或通过CombinerPreprocessingLayer
从同一包继承)。preprocesslayer
类的源代码中没有太多内容,但所有内容都很重要:
preprocesslayer
为adapt
方法提供接口:adapt(自我、数据、重置状态=True)
。请参阅“纯”keras为什么以及何时我们需要它
preprocesslayer
类具有标志\u必须\u从\u config=True
还原,我们从层
文档中阅读该标志:
adapt
方法。在这种情况下,层
实现者可以覆盖必须从配置中恢复才能返回
是的;具有此特性的图层必须恢复为其实际图层
对象(如果对象不可用于
恢复代码)
让我们举个例子,调整层代码的大小(注释是为了可读性):
类大小调整(预处理层):
定义初始化(自我,
高度,
宽度,
插值='双线性',
名称=无,
**kwargs):
self.target_height=高度
self.target_width=宽度
自插值=插值
自插值法=获取插值(插值)
self.input\u spec=InputSpec(ndim=4)
超级(调整大小,自我)。\uuuuu初始化\uuuuuuuuuuuuuuu(名称=名称,**kwargs)
基本预处理层。kpl规格。获取单元格('V2')。设置('Resizing'))
def呼叫(自我,输入):
输出=图像\操作。调整图像大小\ v2(
图像=输入,
大小=[self.target\u高度,self.target\u宽度],
方法=自内插法
返回输出
def计算输出形状(自身、输入形状):
input_shape=tensor_shape.TensorShape(input_shape).as_list()
返回张量_形.TensorShape(
[input_shape[0]、self.target_高度、self.target_宽度、input_shape[3])
def get_配置(自身):
配置={
“高度”:自我目标高度,
“宽度”:self.target\u宽度,
“插值”:自插值,
}
base\u config=super(调整大小,自我)。get\u config()
return dict(list(base_config.items())+list(config.items())
这是一个非常通用的层。它可以将图像调整到一定的宽度和高度。但是,预处理层的目的是将整个端到端管道保存在一个模型中。因此,在您的管道中,您将具有特定的宽度和高度,并且在进行推理时,您不想为实例化具有适当参数的层而烦恼-这应该与在培训中相同(实际上适用于任何预处理方法)。因此,在get_config()
方法中,除了基本配置之外,高度和宽度都被保存,并且在以后解析模型时可以轻松读取。请注意,该层不会覆盖adapt
方法,因为它对数据是不变的
model = keras.Sequential(
[
preprocess,
layers.Dense(256, activation = "relu"),
layers.Dropout(.5),
layers.Dense(len(LABELS))]
files = ['file1,'file2`]
labels = [0,1]
def get_data_set(files, labels, is_training=False):
dataset = tf.data.Dataset.from_tensor_slices((files, labels))
if is_training:
dataset = dataset.shuffle(SHUFFLE_BUFFER_SIZE, reshuffle_each_iteration = True)
dataset = dataset.batch(BATCH_SIZE)
dataset = dataset.prefetch(AUTOTUNE)
return dataset
train_dataset = get_data_set(files, labels, is_training=True)
val_dataset = get_data_set(files, labels)
model.fit(train_dataset, epochs=1, verbose=1,validation_data=val_dataset)
AttributeError: in user code:
/opt/conda/lib/python3.7/site-packages/tensorflow/python/keras/engine/training.py:806 train_function *
return step_function(self, iterator)
<ipython-input-158-3f6d9dd39f2f>:6 call *
return pre_process(inputs.numpy())
AttributeError: 'Tensor' object has no attribute 'numpy'