无法将符号张量(dense_2_target_2:0)转换为numpy数组

时间:2020-07-10 09:35:59

标签: numpy tensorflow machine-learning keras svm

我正在尝试将SVM作为CNN的最后一层进行分类,我正在尝试实现以下代码:

def custom_loss_value(y_true, y_pred):
  print(y_true)
  print(y_pred)
  X = y_pred
  print(X)
  Y = y_true
  Predict = []
  Prob = []
  scaler = StandardScaler()
  # X = scaler.fit_transform(X)
  param_grid = {'C': [0.1, 1, 8, 10], 'gamma': [0.001, 0.01, 0.1, 1]}
  SVM = GridSearchCV(SVC(kernel='rbf',probability=True), cv=3, param_grid=param_grid, scoring='auc', verbose=1)
  SVM.fit(X, Y)
  Final_Model = SVM.best_estimator_
  Predict = Final_Model.predict(X)
  Prob = Final_Model.predict_proba(X)
  return categorical_hinge(tf.convert_to_tensor(Y, dtype=tf.float32), tf.convert_to_tensor(Predict, dtype=tf.float32))
    

sgd = tf.keras.optimizers.SGD(lr=0.001, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss=custom_loss_value, optimizer=sgd, metrics=['accuracy'])

我收到错误消息:无法将符号张量(dense_2_target_2:0)转换为numpy数组 SVM.fit(X,Y) 我还尝试将y_true和y_pred转换为np数组,但随后也出错了

1 个答案:

答案 0 :(得分:0)

要训练具有梯度下降的神经网络,您需要一个可微分的模型。因此,您需要能够采用w.r.t.每个可训练的参数。

您的代码中出现了一些问题:

  1. 您不能直接在Keras损失函数中训练SVM。它 采用TensorFlow张量并使用TF ops。输出也是 Tensorflow张量。 sklearn可以使用NumPy数组或列表,但是 不是张量。
  2. 通过反向传播训练SVM非常困难,几乎没有用。 Something about it can be read here.

您可以在预训练模型的顶部而不是在完全连接的层上训练SVM。