python - keras 的 Model.train_on_batch 和 tensorflow 的 Session.run([train_optimizer]) 有什么区别?

标签 python tensorflow machine-learning keras

在下面的神经网络训练的 Keras 和 Tensorflow 实现中,keras 实现中的 model.train_on_batch([x], [y])sess 有何不同。 run([train_optimizer, cross_entropy, accuracy_op], feed_dict=feed_dict) 在 Tensorflow 实现中?特别是:这两行如何导致训练中的不同计算?:

keras_version.py

input_x = Input(shape=input_shape, name="x")
c = Dense(num_classes, activation="softmax")(input_x)

model = Model([input_x], [c])
opt = Adam(lr)
model.compile(loss=['categorical_crossentropy'], optimizer=opt)

nb_batchs = int(len(x_train)/batch_size)

for epoch in range(epochs):
    loss = 0.0
    for batch in range(nb_batchs):
        x = x_train[batch*batch_size:(batch+1)*batch_size]
        y = y_train[batch*batch_size:(batch+1)*batch_size]

        loss_batch, acc_batch = model.train_on_batch([x], [y])

        loss += loss_batch
    print(epoch, loss / nb_batchs)

tensorflow_version.py

input_x = Input(shape=input_shape, name="x")
c = Dense(num_classes)(input_x)

input_y = tf.placeholder(tf.float32, shape=[None, num_classes], name="label")
cross_entropy = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits_v2(labels=input_y, logits=c, name="xentropy"),
    name="xentropy_mean"
)
train_optimizer = tf.train.AdamOptimizer(learning_rate=lr).minimize(cross_entropy)

nb_batchs = int(len(x_train)/batch_size)

init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for epoch in range(epochs):
        loss = 0.0
        acc = 0.0

        for batch in range(nb_batchs):
            x = x_train[batch*batch_size:(batch+1)*batch_size]
            y = y_train[batch*batch_size:(batch+1)*batch_size]

            feed_dict = {input_x: x,
                         input_y: y}
            _, loss_batch = sess.run([train_optimizer, cross_entropy], feed_dict=feed_dict)

            loss += loss_batch
        print(epoch, loss / nb_batchs)

注意:此问题遵循 Same (?) model converges in Keras but not in Tensorflow ,这被认为过于宽泛,但我在其中准确说明了为什么我认为这两个陈述在某种程度上不同并导致不同的计算。

最佳答案

是的,结果可能不同。如果您事先了解以下内容,结果就不足为奇了:

  1. cross-entropy 在 Tensorflow 和 Keras 中的实现是不同的。 Tensorflow 将 tf.nn.softmax_cross_entropy_with_logits_v2 的输入假定为原始非标准化 logits,而 Keras 将输入作为概率接受
  2. Keras 和 Tensorflow 中优化器的实现是不同的。
  3. 可能是因为您正在打乱数据并且传递的批处理顺序不同。虽然长时间运行模型并不重要,但最初的几个时期可能完全不同。确保将同一批处理传递给两者,然后比较结果。

关于python - keras 的 Model.train_on_batch 和 tensorflow 的 Session.run([train_optimizer]) 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53396147/

相关文章:

python - 如何将 log base 2 与 GEKKO (Python) 一起使用

python - 如何在每次迭代时仅从一个类中对批处理进行采样

python - 如何让 scikit 从预标记文档中计算文档术语矩阵?

python - 类型错误 : while_loop() got an unexpected keyword argument 'maximum_iterations' In Jupyter Azure

TensorFlow CUDA_ERROR_OUT_OF_MEMORY

python - scikit-learn 如何绘制 k 个均值文档簇?

machine-learning - 分类时,在预测真实数据时是否需要对新输入的特征进行标准化?

python - 非常大的数组的 Numpy 点积

python - 如何从 Graphlab 迁移到 pandas

python - 为什么在 scrapyd 中禁用了 HttpCacheMiddleware?