ValueError:没有为任何可变张量流keras提供梯度

时间:2021-07-22 14:51:19

标签: python tensorflow keras neural-network

我想使用神经网络来选择最适合用于回归的数据点。例如,我有一个在 (-pi/2,pi/2) 中有 100 个数据点的正弦波,我想在这 100 个数据点中选择 3 个最具影响力的数据点,以便回归结果类似于 100 个数据点的正弦波。假设一开始我只知道一个数据点 (X0,Y0),我将它发送到第一个 NN 模型,它输出第二个数据点 (Xi1,Yi1) 的索引。我将这两个点 (X0,Y0), (Xi1,Yi1) 发送到第二个 NN 模型中,并获得第三个数据点 (Xi2,Yi2) 的另一个索引。然后我将使用这 3 个数据点从 (-pi/2,pi/2) 预测整个正弦波,并反向传播估计和真实正弦波之间的均方误差。这是我的神经网络的样子:

class PredModel(keras.Model):
def __init__(self):
    super().__init__()
    self.hidden0_1 = keras.layers.Dense(40, input_shape=(1,2))
    self.hidden0_2 = keras.layers.Dense(40)
    self.out0 = keras.layers.Dense(1)
    self.hidden1_1 = keras.layers.Dense(40, input_shape=(1,4))
    self.hidden1_2 = keras.layers.Dense(40)
    self.out1 = keras.layers.Dense(1)
    self.hidden2_1 = keras.layers.Dense(40, input_shape=(1,6))
    self.hidden2_2 = keras.layers.Dense(40)
    self.out2 = keras.layers.Dense(1)
  #  self.hidden1 = keras.layers.Dense(40, input_shape=(1,100,1))
  #  self.hidden2 = keras.layers.Dense(40)
  #  self.out = keras.layers.Dense(1)

    
def first_model(self, x):

    idx = keras.activations.relu(self.hidden0_1(x))
    idx = keras.activations.relu(self.hidden0_2(idx))
    idx = self.out0(idx)
    return idx

def second_model(self, x):



    idx = keras.activations.relu(self.hidden1_1(x))
    idx = keras.activations.relu(self.hidden1_2(idx))
    idx = self.out1(idx)
    return idx


def third_model(self, x):


    idx = keras.activations.relu(self.hidden2_1(x))
    idx = keras.activations.relu(self.hidden2_2(idx))
    idx = self.out2(idx)
    return idx

我认为主要问题发生在这里,没有提供渐变。我需要在每次模型预测后根据索引找到数据点。找到所有数据点后,我只是使用预训练模型 MAML 来估计正弦波,效果很好,我可以在其预测和真实值之间获得 MSE,但梯度无法反向传播。

idx=model.second_model(x_selected_whole)
idx=tf.cast(idx, tf.int64)


x_selected_whole=x_selected_whole.numpy().tolist()
x_selected_whole, x_selected_ITD, y_selected=choose_element(x,y,x_selected_whole,x_selected_ITD,y_selected,abs(idx[0][0]))
idx=model.third_model(x_selected_whole)
idx=tf.cast(idx, tf.int64)

x_selected_whole=x_selected_whole.numpy().tolist()
x_selected_whole, x_selected_ITD, y_selected=choose_element(x,y,x_selected_whole,x_selected_ITD,y_selected,abs(idx[0][0]))



logits= eval_sinewave_for_test(maml, x_selected_ITD, y_selected, x, y)
logits_tensor,y_tensor = np_to_tensor((np.array(logits), np.array(y)))
mse = loss_fn(y_tensor, logits)


return mse, logits,logits_tensor

感谢任何帮助

0 个答案:

没有答案