Failed to get convolution algorithm. This is probably because cuDNN failed to initialize
阿新 • • 發佈:2020-12-29
技術標籤:深度學習tensorflow
最近在學tf2,訓練模型的時候遇到以下錯誤:
解決方案如下(新增以下程式碼):
physical_devices = tf.config.experimental.list_physical_devices('GPU')
assert len(physical_devices) > 0, "Not enough GPU hardware devices available"
tf.config.experimental.set_memory_growth(physical_devices[0], True)
全部程式碼:
import tensorflow as tf import numpy as np # 解決方法 physical_devices = tf.config.experimental.list_physical_devices('GPU') assert len(physical_devices) > 0, "Not enough GPU hardware devices available" tf.config.experimental.set_memory_growth(physical_devices[0], True) class MNISTdataloader(): def __init__(self): mnist = tf.keras.datasets.mnist (self.train_data, self.train_label), (self.test_data, self.test_label) = mnist.load_data() self.train_data = np.expand_dims(self.train_data.astype(np.float32)/255.0, axis=-1) self.test_data = np.expand_dims(self.test_data.astype(np.float32)/255.0, axis=-1) self.train_label = self.train_label.astype(np.int32) self.test_label = self.test_label.astype(np.int32) self.num_train_data, self.num_test_data = self.train_data.shape[0], self.test_data.shape[0] def get_batch(self, batch_size): index = np.random.randint(0, self.train_data.shape[0], batch_size) return self.train_data[index, :], self.train_label[index] class CNN(tf.keras.Model): def __init__(self): super(CNN, self).__init__() self.conv1 = tf.keras.layers.Conv2D(filters=32, kernel_size=[5, 5], padding='same', activation=tf.nn.relu) self.pool1 = tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2) self.conv2 = tf.keras.layers.Conv2D(filters=64, kernel_size=[5, 5], padding='same', activation=tf.nn.relu) self.pool2 = tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2) self.flatten = tf.keras.layers.Reshape(target_shape=(7 * 7 * 64,)) self.dense1 = tf.keras.layers.Dense(units=1024, activation=tf.nn.relu) self.dense2 = tf.keras.layers.Dense(units=10) def call(self, input): x = self.conv1(input) x = self.pool1(x) x = self.conv2(x) x = self.pool2(x) x = self.flatten(x) x = self.dense1(x) x = self.dense2(x) output = tf.nn.softmax(x) return output if __name__ == '__main__': with tf.device('/gpu:0'): num_epochs = 1 batch_size = 10 learning_rate = 0.001 model = CNN() data_loader = MNISTdataloader() optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate) num_batches = int(data_loader.num_train_data // batch_size * num_epochs) for batch_index in range(num_batches): x, y = data_loader.get_batch(batch_size) with tf.GradientTape() as tape: y_pred = model(x) loss = tf.keras.losses.sparse_categorical_crossentropy(y, y_pred) loss = tf.reduce_mean(loss) print('batch %d: loss %f' % (batch_index, loss.numpy())) grads = tape.gradient(loss, model.variables) optimizer.apply_gradients(grads_and_vars=zip(grads, model.variables)) sparse_categorical_accuracy = tf.keras.metrics.SparseCategoricalAccuracy() num_batches = int(data_loader.num_test_data // batch_size) for batch_index in range(num_batches): start_index, end_index = batch_index * batch_size, (batch_index + 1) * batch_size y_pred = model.predict(data_loader.test_data[start_index:end_index]) sparse_categorical_accuracy.update_state( y_true=data_loader.test_label[start_index:end_index], y_pred=y_pred ) print('test accuracy: %f' % sparse_categorical_accuracy.result())