[英]How to use tf.data.Dataset and tf.keras do multi-inputs and multi-outpus?
[英]How to use a tf.keras model in a tf.data.Dataset generator?
我想使用預訓練的 Keras 模型作為數據處理的一部分,為第二個 Keras 模型生成訓練數據。 理想情況下,我想通過為第二個模型調用數據生成器中的第一個模型來做到這一點。
我正在使用 tensorflow 1.15。
我正在嘗試做的一個簡單示例如下:
import numpy as np
import tensorflow as tf
from tensorflow_core.python.keras import Sequential
from tensorflow_core.python.keras.layers import Dense
batch_size = 4
data_size = 16
model_generator = Sequential([Dense(data_size)])
model_generator.compile(optimizer='adam', loss='mae')
model_generator.build((batch_size, data_size))
sess = tf.keras.backend.get_session()
def generator():
while True:
data = np.random.random((batch_size, data_size))
targets = tf.random.uniform((batch_size, 1))
data = model_generator(data, training=False)
data = data.eval(session=sess)
yield (data, targets)
model_train = Sequential([Dense(data_size)])
model_train.compile(optimizer='adam', loss='mae')
model_train.build((batch_size, data_size))
output_types = (tf.float64, tf.float64)
output_shapes = (tf.TensorShape((batch_size, data_size)), tf.TensorShape((batch_size, 1)))
dataset = tf.data.Dataset.from_generator(
generator,
output_types=output_types,
output_shapes=output_shapes,
)
if next(generator()) is not None:
print("Generator works outside of model.fit()!")
model_train.fit(
dataset,
epochs=2,
steps_per_epoch=2
)
調用 .fit() 時,上面的代碼段會產生以下錯誤消息。:
2020-01-28 17:35:56.705549: W tensorflow/core/framework/op_kernel.cc:1639] Invalid argument: ValueError: Tensor("dense/kernel/Read/ReadVariableOp:0", shape=(16, 16), dtype=float32) must be from the same graph as Tensor("sequential/dense/Cast:0", shape=(4, 16), dtype=float32).
Traceback (most recent call last):
如果生成器不調用model_generator
模型,代碼將正常運行。 例如:
def generator():
while True:
data = np.random.random((batch_size, data_size))
targets = np.random.random((batch_size, 1))
yield (data, targets)
我相信 fit 調用會創建自己的張量流圖,其中不包括model_generator
所需的節點。 有沒有辦法在生成器中使用一個模型來訓練另一個這樣的模型? 如果是這樣,我該如何修改上面的例子來實現這一點?
我認為在tf.Dataset
和tf.Dataset
模型之間連接圖是tf.Dataset
。 相反,您需要做的是找到某種方法從兩者中創建一個模型。
如果model_generator
可以直接用作model_train
的輸入,那么我能想到的最簡單的方法是創建一個包含兩個模型的序列模型。 這是一個基於您上面的代碼段的簡單示例。 在這個例子中,只有model_train
會被反向傳播。
import numpy as np
import tensorflow as tf
from tensorflow_core.python.keras import Sequential, Model
from tensorflow_core.python.keras.layers import Dense, Input
batch_size = 4
data_size = 16
def generator():
while True:
data = np.random.random((batch_size, data_size))
targets = np.random.random((batch_size, 1))
yield (data, targets)
model_generator = Sequential([Dense(data_size)])
# Freeze weights in your generator so they don't get updated
for layer in model_generator.layers:
layer.trainable = False
model_train = Sequential([Dense(data_size)])
# Create a model to train which calls both model_generator and model_train
model_fit = Sequential([model_generator, model_train])
model_fit.compile(optimizer='adam', loss='mae')
model_fit.build((batch_size, data_size))
model_fit.summary()
output_types = (tf.float64, tf.float64)
output_shapes = (tf.TensorShape((batch_size, data_size)),
tf.TensorShape((batch_size, 1)))
dataset = tf.data.Dataset.from_generator(
generator,
output_types=output_types,
output_shapes=output_shapes,
)
model_fit.fit(
dataset,
epochs=2,
steps_per_epoch=2
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.