Тензорный поток: в оценке нет градиентов с mean_squared_error - PullRequest
0 голосов
/ 26 апреля 2018

Я работаю над двоичным классификатором, используя пользовательский API оценки, код ниже.

Я бы хотел поэкспериментировать с использованием различных функций потерь, приведенный ниже код запускается с вызовами sigmoid_cross_entropy или sparse_softmax_cross_entropy. Но когда я пробую mean_squared_error, я получаю трассировку стека

ValueError: No gradients provided for any variable, check your graph for ops that do not support gradients, between variables ["<tf.Variable 'dense/kernel:0' shape=(350, 18) dtype=float32_ref>", "<tf.Variable 'dense/bias:0' shape=(18,) dtype=float32_ref>", "<tf.Variable 'OUTPUT/kernel:0' shape=(18, 2) dtype=float32_ref>", "<tf.Variable 'OUTPUT/bias:0' shape=(2,) dtype=float32_ref>"] and loss Tensor("mean_squared_error/value:0", shape=(), dtype=float32).

Вот код, я подозреваю какую-то ошибку новичка. любые идеи будут оценены. ТНХ

# input layer                                                                                                                                                                                                                                                               
net = tf.feature_column.input_layer( features, params['feature_columns'] )

# hidden layer 1                                                                                                                                                                                                                                                            
net = tf.layers.dense(net, units=18, activation=tf.nn.relu)

# output layer computes logits                                                                                                                                                                                                                                              
logits = tf.layers.dense(net, params['n_classes'], activation=None, name='OUTPUT')

# sigmoid cross entropy                                                                                                                                                                                                                                                     
#multi_class_labels = tf.one_hot( labels, 2 )                                                                                                                                                                                                                               
#loss = tf.losses.sigmoid_cross_entropy(multi_class_labels=multi_class_labels, logits=logits)                                                                                                                                                                               

# sparse softmax cross entropy                                                                                                                                                                                                                                              
# loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)

# mean squared error                                                                                                                                                                                                                                                        
predicted_classes = tf.argmax(logits, 1)                                                                                                                                                                                                                                   
loss = tf.losses.mean_squared_error(labels=labels, predictions=predicted_classes)                                                                                                                                                                                          

# TRAINING MODE                                                                                                                                                                                                                                                             
assert mode == tf.estimator.ModeKeys.TRAIN
optimizer = tf.train.AdagradOptimizer(learning_rate=0.1)
train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step())
return tf.estimator.EstimatorSpec(mode, loss=loss, train_op=train_op)

этот пользовательский оценщик demo_model называется так

    classifier = tf.estimator.Estimator(
    model_fn=demo_model,
    model_dir=cur_model_dir,
    params={
        'feature_columns': feature_columns,
        # The model must choose between 2 classes.                                                                                                                                                                                                                          
        'n_classes': 2
    })

1 Ответ

0 голосов
/ 26 апреля 2018

Проблема в том, что tf.argmax не имеет определенного градиента. Вы по-прежнему можете использовать среднеквадратичную ошибку, сравнивая логиты с меткой с горячим кодированием:

loss = tf.losses.mean_squared_error(labels=tf.one_hot(labels, 2), predictions=logits) 
...