Tensorflow 2 中带有 tf.data.Dataset.from_generator 的 keras 模型的多个输入

Raq*_*nak 7 keras tensorflow tensorflow-datasets

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

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

为了提供该模型,我想编写一个生成器以与tf.data.Dataset.from_generator. 从from_generator文档中,我不清楚我应该如何提供它的参数output_typesoutput_shapes。谁能帮我这个?

Mar*_*rkV 7

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

以下工作在张量流中 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)


Run Code Online (Sandbox Code Playgroud)


Ste*_*t_R 5

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

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
Run Code Online (Sandbox Code Playgroud)

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

out_types = (tf.float32, tf.float32, tf.float32, tf.float32, tf.float32)
Run Code Online (Sandbox Code Playgroud)

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

out_shapes = ((200,200,3), (50,), (50000,), (100000,), (100000,))
Run Code Online (Sandbox Code Playgroud)

所以现在我们可以调用from_generator

ds = tf.data.Dataset.from_generator(dummy_generator, 
                                    output_types=out_types,
                                    output_shapes=out_shapes)
Run Code Online (Sandbox Code Playgroud)

  • 那么如何使用“model.fit()”将其输入 Keras 模型?我有问题。 (3认同)