如何在没有包含正确答案的训练数据的情况下训练模型但能够确定模型的适合度?

问题描述

我试图实现的是训练神经网络来完成某项工作。我可以生成测试输入,然后测量网络解决问题的程度。我无法为它提供训练输入数据的正确解决方案(我没有它们并且无法计算它)。最好的方法可能是表面响应方法,但 tensorflow 似乎没有任何内置的解决方案。

看起来对简单的神经网络进行常规训练相当容易:

model = tf.keras.models.Model(inputs=inputs,outputs=outputs)
model.compile(optimizer="Adam",loss="mse",metrics=["mae","acc"])
model.fit(training_input,expected_output)

但似乎您需要拥有 expected_output 才能使其工作,所以我无法使用它。

我用一个例子来解决这个问题。 假设您希望网络生成两个满足特定条件的数字。您有一种方法可以评估给定答案对上述标准的满足程度。但是您不知道哪组数字最适合做工作。您可以生成数以千计的测试数据并对其进行评估,最终会得到数以千计的网络不良示例,也许还有一个是好的(但不是最好的)。

然后我尝试使用梯度下降并使用我发现的 tutorial 来实现它。我的 MWE 只是找到总和尽可能接近给定输入的 2 个数字。它起作用了:

random_normal = tf.initializers.Randomnormal()

weights = {
    'h1': tf.Variable(random_normal([num_input,num_hidden_1])),'h2': tf.Variable(random_normal([num_hidden_1,num_output])),}
biases = {
    'b1': tf.Variable(random_normal([num_hidden_1])),'b2': tf.Variable(random_normal([num_output])),}
optimizer = tf.optimizers.Adam(learning_rate=learning_rate)

def ai_processor(input):
    # Hidden layer with sigmoid activation.
    layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(input,weights['h1']),biases['b1']))
    # Hidden layer with sigmoid activation.
    output = tf.nn.sigmoid(tf.add(tf.matmul(layer_1,weights['h2']),biases['b2']))
    return output

def evaluate(input,output):
  sums = tf.reduce_sum(output,1)
  return tf.transpose(tf.subtract(tf.transpose(input),sums))

def mse(goal,output):
    return tf.reduce_mean(tf.square(goal-output))

def update(input):
    # Wrap computation inside a GradientTape for automatic differentiation.
    with tf.GradientTape() as g:
        output = evaluate(input,ai_processor(input))
        loss = mse(tf.zeros(input.shape),output)

    # Variables to update,i.e. trainable variables.
    trainable_variables = [*weights.values()] + [*biases.values()]
    
    # Compute gradients.
    gradients = g.gradient(loss,trainable_variables)
    
    # Update W and b following gradients.
    # zip tuples iterables elementwise
    optimizer.apply_gradients(zip(gradients,trainable_variables))
    
    return loss

def train(data):
  for step,batch in enumerate(data.take(training_steps + 1)):
      
      # Run the optimization.
      loss = update(batch)
      
      if step % log_step == 0:
          print("step: %i,loss: %f" % (step,loss))

random_uniform = tf.initializers.RandomUniform(minval=0,maxval=1)
train_data = tf.Variable(random_uniform([training_data_size,num_input]))
train_dataset = tf.data.Dataset.from_tensor_slices(train_data)
train_dataset = train_dataset.repeat().batch(batch_size)

train(train_dataset)

令人惊讶的是,互联网缺乏无监督学习的 tensorflow 教程。所以现在我想知道是否有更简单的方法解决这个问题?我可以以某种方式将我的 evaluate 方法传递给 keras 模型并让它进行训练吗? 我是否可以使用 TF Agents 来完成这项工作(只是因为我的环境不是瞬态的 - 它不会随时间变化:我更希望我的模型能够在一个步骤中给我答案)。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)