AMD Radeon и Keras вместе. Python.

Начав изучать библиотеку Keras и нейронные сети я столкнулся с проблемой что у меня видеокарта не NVIDIA. И конечно я не могу использовать CUDA. Но оказывается видеокарты Radeon можно подружить с Keras. Так же можете ознакомиться сначала с этой и этой статьей. Поехали.

Простая CNN.

Напишем простую CNN сеть, будем использовать TensorFlow как бэкэнд.

База CIFAR-10 это набор цветных изображений 32 x 32 x 3 и имеет десят классов ( самолет, автомобиль, птица, кошка, олень, собака, лягушка, лошадь, корабль и грузовик ) 50 000 тренировочных картонок,10 000 тестовых.

Сеть будет выглядеть так :

  • Сверточный слой ( 32 карты, ядро 3х3, функция активации RuLu).
  • Сверточный слой ( 32 карты, ядро 3х3, функция активации RuLu).
  • МаксПуллинг слой ( ядро 2х2).
  • Сверточный слой ( 64 карты, ядро 3х3, функция активации RuLu).
  • Сверточный слой ( 64 карты, ядро 3х3, функция активации RuLu).
  • МаксПуллинг слой ( ядро 2х2).
  • Создаем вектор для полносвязного слоя( Flatten() ).
  • Полносвязный слой (512 нейронов вход , 10 классов выход)
#import plaidml.keras
#plaidml.keras.install_backend()

import keras
from keras.datasets import cifar10
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D
import matplotlib.pyplot as plt

num_classes = 10
# Загрузка базы данных.
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
# Преобразование векторов классов в двоичные матрицы классов.
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
# Создание модели сети
model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',
                 input_shape=x_train.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))

#opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)

# обучим модель с помощью RMSprop
model.compile(loss='categorical_crossentropy',
              optimizer='RMSprop',
              metrics=['accuracy'])

history = model.fit(x_train, y_train,
              epochs=10,
              validation_data=(x_test, y_test),
              shuffle=True, verbose=2)
# Вывод графика обучения
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()
# Сохранение модели
# model.save('my_model_cnn.h5')

Вот эта не сложная по сути сеть на моем AMD FX-6300 с шестью ядрами обучает одну эпоху в районе 300 секунд. Очень долго.

plaidML.

Порывшись в инете, нашелся выход для использования графики без поддержки CUDA. Встречайте plaidML .

Установка достаточна простая pip install plaidml-keras .

После установки нам нужно настроить его для работы с нашей графикой , будем использовать OpenCL.

# Набрать в терминале.
plaidml-setup

Ну а теперь запустим наш Keras c новым бэкэндом :

import plaidml.keras
plaidml.keras.install_backend()
import keras

На моей бюджетной карточке Radeon R7 240 время уменьшилось в два раза ))

Вот и все , успехов )))