Здравствуйте, я получаю сообщение об ошибке при попытке запустить мою модель
- Я использую tf2.1, и я сделал класс для своей модели по нескольким причинам
- В моей модели есть два выходных слоя, называемых преимуществом и ценностью, и это потому, что я делаю дуэльные глубокие сети q.
Вот мой метод __init__
-
class model(Model):
def __init__(self):
super(model, self).__init__()
self.lr = 0.01
self.conv1 = Conv2D(filters=32, input_shape=(210, 160, 1), kernel_size=(3, 3), strides=1, padding='same', activation='elu')#(self.inp)
self.conv2 = Conv2D(filters=32, kernel_size=(3, 3), strides=1, padding='same', activation='elu')#(self.conv1)
self.mp2 = MaxPool2D(pool_size=(3, 3), strides=1, padding='same')#(self.conv2)
self.conv3 = Conv2D(filters=64, kernel_size=(3, 3), strides=1, padding='same', activation='elu')#(self.mp2)
self.mp3 = MaxPool2D(pool_size=(3, 3), strides=1, padding='same')#(self.conv3)
self.conv4 = Conv2D(filters=64, kernel_size=(3, 3), strides=1, padding='same', activation='elu')#(self.mp3)
self.mp4 = MaxPool2D(pool_size=(3, 3), strides=1, padding='same')#(self.conv4)
self.flat = Flatten() #(self.mp6)
self.value = Dense(1, activation=None)#(self.flat) # how good is a particular state
self.advantage = Dense(env.action_space.n, activation=None)#(self.flat) # which is best action
self.compile(optimizer=Adam(lr=self.lr), loss='mse', metrics=['accuracy'])
Тогда у меня есть функция, которая называется predict_advantage
, где я получаю сообщение об ошибке -
def predict_advantage(self, state):
state = tf.cast(cv2.cvtColor(state, cv2.COLOR_RGB2GRAY), tf.float32)
#x = self.inp(state)
x = self.conv1(x)
x=self.conv2(x)
x=self.mp2(x)
x=self.conv3(x)
x=self.mp3(x)
x=self.conv4(x)
x=self.mp4(x)
x = self.flat(x)
# value = self.value(x)
x = self.advantage(x)
return x
- Как вы видите, я использую
tf.cast
для приведения, чтобы сделать dtype float32 как большинство постов. говорили, что это единственный способ исправить ошибку - однако я получил ту же ошибку, что и до того, как использовал ее -
tensorflow.python.framework.errors_impl.NotFoundError: Could not find valid device for node.
Node:{{node MatMul}}
И, кстати, он также распечатал устройство и dtypes для определенного слоя или всех слоев. Я не знаю, что он сделал, но вот оно -
All kernels registered for op MatMul :
device='GPU'; T in [DT_FLOAT]
device='GPU'; T in [DT_DOUBLE]
device='GPU'; T in [DT_COMPLEX64]
device='GPU'; T in [DT_COMPLEX128]
device='GPU'; T in [DT_HALF]
device='CPU'; label='eigen'; T in [DT_FLOAT]
device='CPU'; label='eigen'; T in [DT_DOUBLE]
..........
..........
..........
device='CPU'; T in [DT_COMPLEX64]
device='CPU'; T in [DT_COMPLEX128]
device='GPU'; label='cublas'; T in [DT_FLOAT]
device='GPU'; label='cublas'; T in [DT_DOUBLE]
device='GPU'; label='cublas'; T in [DT_COMPLEX64]
device='GPU'; label='cublas'; T in [DT_COMPLEX128]
device='GPU'; label='cublas'; T in [DT_HALF]
[Op:MatMul] name: dense_1/Tensordot/MatMul/
- Как мы видим здесь, у нас есть некоторые параметры в GPU и некоторые параметры в CPU. Почему он это делает?
- Также типы параметров различны. Я не уверен, могут ли они быть или не должны быть.
Насколько я знаю, я думаю, что это допустило ошибку, поскольку вещи на GPU не могут взаимодействовать с вещами на CPU , Так почему он хранит мои параметры на разных устройствах.
Редактировать:
Вот ссылка на полный код - https://pastebin.com/sd8L2xAM Здесь это также полная ошибка, которую я получил, если вы хотите узнать, по какой линии это происходит - https://pastebin.com/C9Dy5NxL