web-dev-qa-db-ja.com

Tensorflow Keras関数APIモデルを使用してTensorflow変数をトレーニングできますか? Tensorflowオペレーションを関数型APIモデルで使用できますか?

tf.get_variableで定義された機能的なAPIトレイン変数を使用してKerasモデルをコンパイルまたはトレーニングするかどうか疑問に思っています。 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の方が推奨されるため、モデルを簡単に変換できるかどうかを確認するためです。

バックグラウンド

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モデルへの入力として使用できることを示しています。

Tensorflowテンソルを使用して、機能モデルのKerasレイヤーの入力を設定するには?

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アーキテクチャで埋め込み変数とソフトマックス変数をトレーニングしたいと思います

  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を使用することに関心があると思われます。

Tensorflow演算を組み込み、Kerasモデルのコンパイル/トレーニングを使用してTensorflow変数をトレーニングする方法を知ることは、これに大きく役立ちます。

11
SantoshGupta7

このソリューションは役に立ちますか?

kerasはグラフに外部のトレーニング可能な変数を追加します

次のコマンドを使用して、埋め込みとソフトマックスレイヤーをKerasモデルにフィードできます。

model.add()

次に、これらの変数を使用してトレーニング可能な変数として定義します

model.layers[-1].trainable_weights.extend()
1
Filipe Aleixo