Ошибка тензорного потока «нет градиентов для любой переменной» при создании модели NN - PullRequest
0 голосов
/ 07 января 2020

Я даже не уверен, что означает это сообщение об ошибке. Я видел, как у других была эта ошибка, и у всех она была по разным причинам. Кроме того, я действительно не вижу, как мой код будет неисправен

import numpy as np
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior


class DQNagent:

    def __init__(self, session, structure, input_dim, output_dim):
        self.session = session
        self.structure = structure
        self.input_dim = input_dim
        self.output_dim = output_dim

        self.input_vec = tf.placeholder(tf.float32, shape=[None, self.input_dim])
        self.network = self.create_model()

    def create_model(self):

        for i in range(0, len(self.structure)-1):
            if i == 0:
                network = tf.layers.Dense(self.structure[i], tf.keras.activations.relu)(self.input_vec)
                network = tf.layers.BatchNormalization()(network)
            else:
                network = tf.layers.Dense(self.structure[i], tf.keras.activations.relu)(network)
                network = tf.layers.BatchNormalization()(network)

        network = tf.layers.Dense(self.output_dim, tf.keras.activations.linear)(network)

        return network

    def NNoutput(self, input_data):
        temp_input_data = np.expand_dims(input_data, 0)
        output_vec = self.session.run(self.network, feed_dict={self.input_vec: temp_input_data})
        return output_vec

Так что приведенный выше код работает как есть. Для данных с одним входным массивом np NNoutput дает выход NN. Приведенный ниже код является моей попыткой взять набор обучающих примеров для вычисления общей стоимости

def accumcost(self, data, label):
    for i in range(0,len(label)):
        label[i] = np.expand_dims(label[i])

    totalcost = 0.0
    denom = 0.0

    for i in range(0,len(data)):

        tempnetwork = self.NNoutput(data[i])
        totalcost += (tf.reduce_mean((label[i] - tempnetwork)**2))
        denom += 1.0

    totalcost *= 1.0/denom

    return totalcost

А ниже приведен код для генерации случайного набора данных

dataset = []
for i in range(10):
    data = []
    for _ in range(10):
        data.append(np.random.normal(0.0,1.0))
    dataset.append(data)

labelset = []
for i in range(10):
    label = []
    for _ in range(10):
        label.append(np.random.normal(0.0,1.0))
    labelset.append(label)


NNstructure = []
for _ in range(2):
    NNstructure.append(10)

И с набор обучающих примеров и набор меток, я мог бы затем создать сеанс, чтобы вычислить стоимость и оптимизировать ее

with tf.Session() as sess:
    dqn = DQNagent(sess,NNstructure, len(dataset[0]), len(labelset[0]))
    sess.run(tf.global_variables_initializer())

    for epoch in range(1000):

        cost = dqn.accumcost(dataset,labelset)

        optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)

        _, val = sess.run([optimizer,cost])
        print(epoch)
        print(val)

Но если бы я должен был запустить этот код, я получил бы следующее сообщение

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=(10, 10) dtype=float32_ref>", "<tf.Variable 'dense/bias:0' shape=(10,) dtype=float32_ref>", "<tf.Variable 'batch_normalization/gamma:0' shape=(10,) dtype=float32_ref>", "<tf.Variable 'batch_normalization/beta:0' shape=(10,) dtype=float32_ref>", "<tf.Variable 'dense_1/kernel:0' shape=(10, 10) dtype=float32_ref>", "<tf.Variable 'dense_1/bias:0' shape=(10,) dtype=float32_ref>"] and loss Tensor("mul:0", shape=(), dtype=float64).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...