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
    还原,我们从
    文档中阅读该标志:

  • 从SavedModel加载时,层通常可以恢复为 通用层包装器。但是,有时,层可能会实现 超出此包装器的方法,如 预处理层“
    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'