Keras模型的TensorFlow图?
是否可以在原生TensorFlow中定义一个图,然后将该图转换为Keras模型Keras模型的TensorFlow图?,tensorflow,keras,deep-learning,Tensorflow,Keras,Deep Learning,是否可以在原生TensorFlow中定义一个图,然后将该图转换为Keras模型 我的意图只是(对我来说)将两个世界中最好的结合起来 我非常喜欢Keras模型API用于原型设计和新实验,即使用awesome多gpu(model,gpu=4)进行多gpu训练,使用OneLiner保存/加载权重或整个模型,所有方便的功能,如.fit(),.predict(),等等 然而,我更喜欢用原生TensorFlow定义我的模型。TF中的上下文管理器非常棒,在我看来,用它们实现GAN之类的东西要容易得多: wi
我的意图只是(对我来说)将两个世界中最好的结合起来 我非常喜欢Keras模型API用于原型设计和新实验,即使用awesome
多gpu(model,gpu=4)
进行多gpu训练,使用OneLiner保存/加载权重或整个模型,所有方便的功能,如.fit()
,.predict()
,等等
然而,我更喜欢用原生TensorFlow定义我的模型。TF中的上下文管理器非常棒,在我看来,用它们实现GAN之类的东西要容易得多:
with tf.variable_scope("Generator"):
# define some layers
with tf.variable_scope("Discriminator"):
# define some layers
# model losses
G_train_op = ...AdamOptimizer(...)
.minimize(gloss,
var_list=tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES,
scope="Generator")
D_train_op = ...AdamOptimizer(...)
.minimize(dloss,
var_list=tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES,
scope="Discriminator")
另一个好处是以这种方式构建图表。在TensorBoard调试中,复杂的本地Keras模型是地狱,因为它们根本没有结构化。通过在本机TF中大量使用变量作用域,您可以“解开”图形并查看复杂模型的非常结构化的版本以进行调试
通过利用这一点,我可以直接设置自定义损失函数,并且不必在每次训练迭代中冻结任何内容,因为TF只会更新正确范围内的权重,这(至少在我看来)比Keras解决方案更容易在所有现有层上循环并设置。trainable=False
TL;医生:
长话短说:我喜欢直接访问TF中的所有内容,但大多数情况下,一个简单的Keras模型足以用于培训、推理。。。后来。模型API在Keras中更容易、更方便
因此,我更愿意在native TF中建立一个图表,并将其转换为KERA,用于培训、评估等。有什么方法可以做到这一点吗?我认为不可能为任何TF图创建一个通用的自动转换器,它将产生一组有意义的层,并具有适当的命名等。仅仅因为图比一系列Keras层更灵活 但是,您可以使用包装来包装您的模型。在函数中构建模型,用Lambda包装,然后将其放入Keras中:
def model_fn(x):
layer_1 = tf.layers.dense(x, 100)
layer_2 = tf.layers.dense(layer_1, 100)
out_layer = tf.layers.dense(layer_2, num_classes)
return out_layer
model.add(Lambda(model_fn))
这就是使用时有时会发生的情况:您可以使用三个层:输入层、模型层和输出层
Keras道歉
然而,TensorFlow和Keras之间的整合可能更加紧密和有意义。有关用例,请参见
例如,变量作用域的使用方式与TensorFlow非常相似:
x = tf.placeholder(tf.float32, shape=(None, 20, 64))
with tf.name_scope('block1'):
y = LSTM(32, name='mylstm')(x)
手动放置设备的方法相同:
with tf.device('/gpu:0'):
x = tf.placeholder(tf.float32, shape=(None, 20, 64))
y = LSTM(32)(x) # all ops / variables in the LSTM layer will live on GPU:0
此处讨论了自定义损失:
这就是我在Keras中定义的模型在Tensorboard中的外观:
因此,Keras实际上只是TensorFlow的一个简化前端,因此您可以非常灵活地混合它们。我建议您检查的源代码,寻找聪明的解决方案和模式,使您能够使用Keras的干净API构建复杂模型。您可以将TensorFlow代码直接插入Keras模型或培训管道自2017年年中以来,Keras已完全采用并融入TensorFlow。更详细地说
这意味着您的TensorFlow模型已经是Keras模型,反之亦然。您可以在Keras中开发,并在需要时切换到TensorFlow。TensorFlow代码将与Keras API一起使用,包括用于培训、推断和保存模型的Keras API。您正在寻找这个吗?我不这么认为。看起来这将在TensorFlow中包装功能。我正在寻找一种解决方案,在原生TensorFlow中实现NNs,然后将生成的图转换为Keras模型,这样我就可以使用TF语法构建一些复杂的图,但是要有一个易于使用的Keras运行时模型。一篇关于未来使用TensorFlow和Keras API的不同方式的可能相关文章:只想补充一点,lambda层中定义的任何东西都是不可训练的(无状态的),所以只在那里使用函数,而不是具有可训练权重的层。看见