我正在尝试使用低级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()
实际如何工作?我想念什么?
非常感谢您!