Я даже не уверен, что означает это сообщение об ошибке. Я видел, как у других была эта ошибка, и у всех она была по разным причинам. Кроме того, я действительно не вижу, как мой код будет неисправен
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).