将短的 tensorflow 1.13 脚本转换为 tensorflow 2.0

Converting short tensorflow 1.13 script into tensorflow 2.0

我试图通过将我的 tensorflow1.13 脚本(如下)转换为 tensorflow2.0 脚本来学习 tensorflow2.0 的动态。但是我正在努力做到这一点。

我认为我挣扎的主要原因是因为我看到的 tensorflow2.0 的例子训练神经网络所以他们有一个 model 他们 compilefit.然而,在我下面的简单示例中,我没有使用神经网络,所以我看不到如何将此代码调整为 tensorflow2.0(例如,如何替换会话?)。非常感谢您的帮助,并提前致谢。

data = tf.placeholder(tf.int32)
theta = tf.Variable(np.zeros(100))
p_s = tf.nn.softmax(theta)

loss = tf.reduce_mean(-tf.log(tf.gather(p_s, data)))
train_step = tf.train.AdamOptimizer().minimize(loss)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for epoch in range(10):
        for datum in sample_data(): #sample_data() is a list of integer datapoints
            _ = sess.run([train_step], feed_dict={data:datum})
    print(sess.run(p_s))

我查看了 this(这是最相关的),到目前为止我已经得出以下结论:

#data = tf.placeholder(tf.int32)
theta = tf.Variable(np.zeros(100))
p_s = tf.nn.softmax(theta)

loss = tf.reduce_mean(-tf.math.log(tf.gather(p_s, **data**)))
optimizer = tf.keras.optimizers.Adam()

for epoch in range(10):
    for datum in sample_data(): 
        optimizer.apply_gradients(loss)

print(p_s)

但是上面显然不是 运行 因为损失函数中的占位符 data 不再存在 - 但是我不确定如何替换它。 :S

有人吗? 请注意,我没有 def forward(x) 因为我的输入 datum 没有转换- 直接用于计算损失。

而不是使用转换工具(存在,但我不喜欢它,因为它只是(或多或少)为 API 调用加上前缀 tf.compat.v1 并使用旧的 Tensoflow 1.x API) 我帮你把你的代码转换成新版本。

会话消失了,占位符也消失了。原因?代码逐行执行——也就是Tensorflow eager模式。

要正确训练模型,您必须使用优化器。如果你想使用 minimize 方法,在 Tensorflowe 2.0 中你必须定义函数来最小化(损失)作为 Python 可调用。

# This is your "model"
theta = tf.Variable(np.zeros(100))
p_s = tf.nn.softmax(theta)

# Define the optimizer
optimizer = tf.keras.optimizers.Adam()

# Define the training loop with the loss inside (because we use the
# .minimnize method that requires a callable with no arguments)

trainable_variables = [theta]

for epoch in range(10):
    for datum in sample_data():
        # The loss must be callable and return the value to minimize
        def loss_fn():
            loss = tf.reduce_mean(-tf.math.log(tf.gather(p_s, datum)))
            return loss
        optimizer.minimize(loss_fn, var_list=trainable_variables)
    tf.print("epoch ", epoch, " finished. ps: ", p_s)

免责声明:我还没有测试过代码 - 但它应该可以工作(或者至少让您了解如何在 TF 2 中实现您想要实现的目标)