Tensorflow低级API:无法复制高级API结果

时间:2018-11-14 10:44:39

标签: tensorflow

我正在尝试使用低级API,以便在不久的将来使用一些自定义解决方案。

因此,我尝试在MNIST上同时使用高级API和低级API来实现自动编码器。

因此模型是这样的:

input_img = keras.Input(shape=(784,))
encoder_layer = keras.layers.Dense(encoding_dimension, activation='sigmoid', weights=[W, bias])
encoded = encoder_layer(input_img)
decoder_layer = keras.layers.Dense(784, activation='sigmoid', weights=[Wt, bias_2])
decoded = decoder_layer(encoded)

autoencoder = keras.Model(input_img, decoded)

以及培训过程:

autoencoder.compile(optimizer=tf.train.GradientDescentOptimizer(0.01), loss='binary_crossentropy')
autoencoder.fit(x_train, x_train, epochs=100, batch_size=100, callbacks=[tf.keras.callbacks.EarlyStopping(monitor='loss', patience=10, min_delta=0.001)])

因此,我想使用低级API复制该过程,并编写了以下代码:

dim = 784
x = tf.placeholder(tf.float32, shape=[None, dim])
encoding_layer = tf.layers.Dense(units=encoding_dimension, activation='sigmoid', weights=[W, bias])
h = encoding_layer(x)
decoding_layer = tf.layers.Dense(units=dim, activation='sigmoid', weights=[Wt, bias_2])
y = decoding_layer(h)

loss = tf.keras.losses.binary_crossentropy(y_true=x, y_pred=y)

optimizer = tf.train.GradientDescentOptimizer(lr)
train = optimizer.minimize(loss)

培训时间:

sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)


dataset = tf.data.Dataset.from_tensor_slices(x_train)
dataset.batch(100)
iterator = dataset.make_initializable_iterator()
next = iterator.get_next()

with sess.as_default():
    for _ in range(nEpoq):
        sess.run(iterator.initializer)
        while True:
            try:
                train_value, loss_value = sess.run((train, loss), feed_dict={x: np.reshape(next.eval(), newshape=(-1, 784))})
            except tf.errors.OutOfRangeError:
                break
        print(loss_value)

问题是,相对于高级API,使用低级API执行单个纪元训练所需的时间过长。 我还注意到,当tf.errors.OutOfRangeError上升到某个时期结束时,会返回loss_value,但是我收到的值类似于在使用高级API的50个时期之后获得的结果! 那么我应该如何编写训练循环? get_next()实际如何工作?我想念什么?

非常感谢您!

0 个答案:

没有答案