Tensorflow 2 中 tf.data.Dataset.from_generator 的 keras 模型的多个输入
Multiple inputs of keras model with tf.data.Dataset.from_generator in Tensorflow 2
我正在尝试在 keras 中实现一个具有多个输入的模型:
- 图片 (200x200)
- 一些数字 (1x50)
- 三个一维信号(1x50000、2x100000)
为了给该模型提供数据,我想编写一个生成器与 tf.data.Dataset.from_generator
一起使用。从 docs of from_generator 开始,我不清楚应该如何提供其参数 output_types
、output_shapes
。谁能帮我解决这个问题?
所以假设你有一个类似于这个模拟的生成器:
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([input_1, input_2, input_3], y, epochs=EPOCHS)
您的模型中必须有 n(在上述情况下为 3)个输入层。
我遇到了类似的问题,我尝试了很多次才使这些输入的结构正确。这是一个具有 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)
我正在尝试在 keras 中实现一个具有多个输入的模型:
- 图片 (200x200)
- 一些数字 (1x50)
- 三个一维信号(1x50000、2x100000)
为了给该模型提供数据,我想编写一个生成器与 tf.data.Dataset.from_generator
一起使用。从 docs of from_generator 开始,我不清楚应该如何提供其参数 output_types
、output_shapes
。谁能帮我解决这个问题?
所以假设你有一个类似于这个模拟的生成器:
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([input_1, input_2, input_3], y, epochs=EPOCHS)
您的模型中必须有 n(在上述情况下为 3)个输入层。
我遇到了类似的问题,我尝试了很多次才使这些输入的结构正确。这是一个具有 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)