首页 > 解决方案 > 如何一一提供数据以使用 tensorflow 2.0 版本进行训练

问题描述

我使用注意方法研究自动编码器类型模型。大约 10000 批数据被输入模型,每批包含 30 张图像(30 是 ConvLSTM 中的“step_size”),形状为 (5, 5, 3 [R,G,B])。

因此,数组的形状是(10000, 30, 5, 5, 3) (batch_size、step_size、image_height、image_width、scale)。

我故意将输出数组形状设置为(1,5,5,3),因为必须独立处理每个图像才能应用注意力方法。

当我链接所有操作时tf.keras.Model,它的输入形状为(10000,30,5,5,3),输出形状为(1,5,5,3).

history = model.fit(train_data, train_data, batch_size = 1, epochs = 3)

我正在尝试修改模型模块中的参数,但它似乎不起作用,因为输出形状与输入不同。

是否有任何可能的方法来一一提供数据?

我最终正在运行类似的代码:


model = keras.Model(intput, output)

model.compile(optimizer='adam',loss= tf.keras.losses.MSE)

history = model.fit(train_data, train_data, batch_size = 1, epochs = 3)

标签: kerastensorflow2.0tf.keras

解决方案


它可以用 GradientTape 完成,一个一个地喂食。

def train(loss, model, opt, x_inp):
  with tf.GradientTape() as tape:
    gradients = tape.gradient(loss(model, x_inp), model.trainable_variables)
    gradient_variables = zip(gradients, model.trainable_variables)
    opt.apply_gradients(gradient_variables)


opt = tf.optimizers.Adam(learning_rate=learning_rate)

import datetime
current_time = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")

train_summary_writer = tf.summary.create_file_writer(train_log_dir)

epochs = 3

with train_summary_writer.as_default():
  with tf.summary.record_if(True):
    for epoch in range(epochs):
      for train_id in range(0, len(batch_data)):
          x_inp = np.reshape(np.asarray(batch_data), [-1, step_max, sensor_n, sensor_n, scale_n])
          train(loss, model, opt, x_inp)
          loss_values = loss(model, x_inp)
          reconstructed = np.reshape(model(x_inp), [1, sensor_n, sensor_n, scale_n])
      print("loss : {}".format(loss_values.numpy()))

推荐阅读