Tensorflow Keras功能API模型可以训练Tensorflow变量吗?可以在功能性API模型中使用Tensorflow操作吗?

时间:2019-01-05 08:30:45

标签: python tensorflow keras

我想知道Keras模型是否可以使用tf.get_variable定义的功能性API训练变量进行编译/训练? Keras培训还可以合并Tensorflow操作吗?

所以基本上我想用Tensorflow变量和操作定义Keras模型,然后使用

model = tf.keras.Model(inputs=inputs, outputs=predictions)
model.compile(optimizer=optimizer, loss=loss)
model.fit(data, labels, batch_size=batch_size, epochs=epochs)

训练模型。原因是Google的TPU需要Keras或TF.Estimator API,更推荐使用Keras,因此,我希望了解如何轻松转换模型。

BackGround

由于Tensorflow是后端,因此看起来有多种混合Keras / Tensorflow变量的方法。这篇博客文章展示了如何使用Tensorflow图/会话训练Keras变量 https://blog.keras.io/keras-as-a-simplified-interface-to-tensorflow-tutorial.html

from keras.layers import Dropout
from keras import backend as K

img = tf.placeholder(tf.float32, shape=(None, 784))
labels = tf.placeholder(tf.float32, shape=(None, 10))

x = Dense(128, activation='relu')(img)
x = Dropout(0.5)(x)
x = Dense(128, activation='relu')(x)
x = Dropout(0.5)(x)
preds = Dense(10, activation='softmax')(x)

loss = tf.reduce_mean(categorical_crossentropy(labels, preds))

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(loss)
with sess.as_default():
    for i in range(100):
        batch = mnist_data.train.next_batch(50)
        train_step.run(feed_dict={img: batch[0],
                                  labels: batch[1],
                                  K.learning_phase(): 1})

acc_value = accuracy(labels, preds)
with sess.as_default():
    print acc_value.eval(feed_dict={img: mnist_data.test.images,
                                    labels: mnist_data.test.labels,
                                    K.learning_phase(): 0})

而且这里还显示Tensorflow变量可以用作Keras模型的输入

How to set the input of a Keras layer of a functional model, with a Tensorflow tensor?

tf_embedding_input = ...    # pre-processing output tensor

# Keras model
model = Sequential()
model.add(Input(tensor=tf_embedding_input)) 
model.add(Embedding(max_features, 128, input_length=maxlen))

所以我想知道Keras是否可以训练Tensorflow变量。

示例

我想在下面的Tensorflow体系结构中训练embed和softmax变量

  embeddings = tf.get_variable( 'embeddings', 
    initializer= tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))

  softmax_weights = tf.get_variable( 'softmax_weights',
    initializer= tf.truncated_normal([vocabulary_size, embedding_size],
                         stddev=1.0 / math.sqrt(embedding_size)))

  softmax_biases = tf.get_variable('softmax_biases', 
    initializer= tf.zeros([vocabulary_size]),  trainable=False )

  embed = tf.nn.embedding_lookup(embeddings, train_dataset) #train data set is

  embed_reshaped = tf.reshape( embed, [batch_size*num_inputs, embedding_size] )

  segments= np.arange(batch_size).repeat(num_inputs)

  averaged_embeds = tf.segment_mean(embed_reshaped, segments, name=None)

  loss = tf.reduce_mean(
    tf.nn.sampled_softmax_loss(weights=softmax_weights, biases=softmax_biases, inputs=averaged_embeds,
                               labels=train_labels, num_sampled=num_sampled, num_classes=vocabulary_size))

由于Tensorflow Keras使用Tensorflow后端,所以我猜想在某种程度上可以使用和训练Tensorflow变量,并在训练中使用Tensorflow操作。

我为什么要这样做?

Google的TPU要求您的架构必须通过Estimator API或Keras API实现。由于更推荐使用Keras API,因此可能有兴趣将常规Tensorflow图形/会话转换为使用Keras API,并且对其代码的更改尽可能少。

了解如何使用Keras模型编译/训练来合并Tensorflow操作和训练Tensorflow变量将对此有很大帮助。

2 个答案:

答案 0 :(得分:3)

小背景:

我们知道Keras是模型级库,为开发深度学习模型提供了高级构建块。

最重要的是:Keras API不处理张量操作。为此,它需要一个经过优化的张量操纵库,被称为Keras的“后端引擎”。

目前,Keras提供了三种后端引擎:TensorFlow后端(Google),Theano后端和CNTK后端(MSFT)。

  

了解如何使用Keras模型编译/训练来合并Tensorflow操作和训练Tensorflow变量将对此有很大帮助。

您唯一要问自己的是Keras变量和常规Tensorflow变量之间的区别是什么。

可能是Keras变量具有元数据。因此,为了在Keras中使用TensorFlow变量,您需要转换them

注意:TensorFlow变量作用域对Keras层或模型没有影响。

最终变量共享可以通过初始化Keras层(或模型)来完成。

答案 1 :(得分:1)

此解决方案有帮助吗?

keras add external trainable variable to graph

您可以使用以下方式将嵌入层和softmax层输入Keras模型中

model.add()

,然后使用

将这些变量定义为可训练的
model.layers[-1].trainable_weights.extend()