【问题标题】:Multiple inputs of keras model with tf.data.Dataset.from_generator in Tensorflow 2Tensorflow 2中带有tf.data.Dataset.from_generator的keras模型的多个输入
【发布时间】:2019-07-24 04:37:03
【问题描述】:

我正在尝试在 keras 中实现一个具有多个输入的模型:

  • 图片 (200x200)
  • 一些数字 (1x50)
  • 三个一维信号(1x50000、2x100000)

为了给该模型提供数据,我想编写一个生成器来与tf.data.Dataset.from_generator 一起使用。从docs of from_generator,我不清楚我应该如何提供它的参数output_typesoutput_shapes。谁能帮我解决这个问题?

【问题讨论】:

    标签: tensorflow keras tensorflow-datasets


    【解决方案1】:

    我遇到了类似的问题,我尝试了很多次才使结构适合这些输入。这是一个具有 3 个输入和 2 个输出的网络示例,完成了 .fit 调用。

    以下在tensorflow中工作2.1.0

    import tensorflow as tf
    import numpy as np
    
    def generator(N=10):
        """
        Returns tuple of (inputs,outputs) where
        inputs  = (inp1,inp2,inp2)
        outputs = (out1,out2)
        """
        dt=np.float32
        for i in range(N):
            inputs  = (np.random.rand(N,3,3,1).astype(dt), 
                       np.random.rand(N,3,3,1).astype(dt), 
                       np.random.rand(N,3,3,1).astype(dt))
            outputs = (np.random.rand(N,3,3,1).astype(dt),
                       np.random.rand(N,3,3,1).astype(dt))
            yield inputs,outputs
    
    # Create dataset from generator
    types = ( (tf.float32,tf.float32,tf.float32),
              (tf.float32,tf.float32) )
    shapes = (([None,3,3,1],[None,3,3,1],[None,3,3,1]),
              ([None,3,3,1],[None,3,3,1]))
    data = tf.data.Dataset.from_generator(generator,
                                          output_types=types,
                                          output_shapes=shapes
                                         )
    # Define a model
    inp1 = tf.keras.Input(shape=(3,3,1),name='inp1')
    inp2 = tf.keras.Input(shape=(3,3,1),name='inp2')
    inp3 = tf.keras.Input(shape=(3,3,1),name='inp3')
    out1 = tf.keras.layers.Conv2D(1,kernel_size=3,padding='same')(inp1)
    out2 = tf.keras.layers.Conv2D(1,kernel_size=3,padding='same')(inp2)
    model = tf.keras.Model(inputs=[inp1,inp2,inp3],outputs=[out1,out2])
    model.compile(loss=['mse','mse'])
    
    # Train
    model.fit(data)
    
    
    

    【讨论】:

      【解决方案2】:

      所以假设你有一个类似于这个模拟的生成器:

      def dummy_generator():
        number_of_records = 100
      
        for i in range(100):
          an_image = tf.random.uniform((200,200,3))
          some_numbers = tf.random.uniform((50,))
          signal1 = tf.random.uniform((50000,))
          signal2 = tf.random.uniform((100000,))
          signal3 = tf.random.uniform((100000,))
          yield an_image, some_numbers, signal1, signal2, signal3
      

      每条记录的数据类型为float32,因此输出类型很简单:

      out_types = (tf.float32, tf.float32, tf.float32, tf.float32, tf.float32)
      

      对于输出形状,我们只是按相同顺序列出形状:

      out_shapes = ((200,200,3), (50,), (50000,), (100000,), (100000,))
      

      所以现在我们可以拨打from_generator:

      ds = tf.data.Dataset.from_generator(dummy_generator, 
                                          output_types=out_types,
                                          output_shapes=out_shapes)
      

      【讨论】:

      • 那么如何使用model.fit() 将其输入到 Keras 模型中?我遇到了问题。
      • @arat 这里有同样的问题。你搞清楚了吗?
      • 也有这个问题,在网上找不到一个处理这个问题的例子
      【解决方案3】:
      model.fit([input_1, input_2, input_3], y, epochs=EPOCHS)
      

      你的模型中必须有 n(3) 个输入层。

      【讨论】:

        猜你喜欢
        • 2021-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-31
        • 1970-01-01
        • 2021-04-18
        • 2019-08-09
        • 1970-01-01
        相关资源
        最近更新 更多