Можно ли взять обученный CNN, сохраненный в виде файла .mat, и использовать этот файл для создания алгоритма классификации в Python? - PullRequest
1 голос
/ 17 февраля 2020

Я создал CNN в MATLAB 2019b, и обученный CNN сохраняется в файле с именем «traine dnet .mat». Мне было интересно, как вы можете загрузить обученный файл .mat в Python и классифицировать изображения в Python вместо загрузки его в MATLAB 2019b. Я попытался преобразовать мой файл .mat в файл .h5, используя h5py, чтобы я мог использовать его в keras, но он не работает. Я также слышал о функции scipy, которая называется sio.loadmat docs.scipy.org/doc/scipy/reference/tutorial/io.html, но я не уверен, что ее можно использовать для реализации в python. Будут ли методы, которые я изложил выше, работать, если они будут реализованы правильно, или есть другой способ решения этой проблемы?

1 Ответ

1 голос
/ 17 февраля 2020

Короткий ответ: это возможно, однако, это не без проблем, так как вам потребуется воссоздать часть сети (по крайней мере, часть для прогнозирования) в коде python. Он будет работать только с numpy и scipy или может также воссоздать с PyTorch / TensorFlow для использования графических процессоров.


Упомянутый вами trainednet.mat, вероятно, хранил веса NN, и вам нужно будет воссоздать архитектуру NN, основанную на исходной модели (в matlab), т. Е. Выполнить матричные вычисления в python.

Как вы уже упоминали, вы сначала загрузите .mat на scipy с

from scipy.io import loadmat

parameters = loadmat("trainednet.mat")

, а теперь parameters - это словарь Python, где его структура очень зависит от вашей сети. Следующие детали будут отличаться для каждого вида CNN, но основной рабочий процесс c выглядит примерно так:

def predict(img, parameters):
    # the kind of saved parameters
    # your trainednet.mat should have weights for something like
    # w1,w2,w3,w4... for weights of convolutional layers
    #                    weights of dense layers
    # b3,b4...       for any bias from layers

    # convolution operation
    z = convolution(..., img, w1) 
    # ReLU non-linearity
    z[z<=0] = 0 

    # convolution operation
    z = convolution(..., z, w2)
    # ReLU non-linearity
    z[z<=0] = 0 

    z = maxpool(z, ...).reshape(...) # maxpooling operation

    # dense layer with bias
    z = w3.dot(z) + b3 
    # ReLU non-linearity
    z[z<=0] = 0

    # second dense layer with bias
    z = w4.dot(z) + b4 

    # predict class probabilities
    probs = softmax(z) 
    return probs


from scipy.ndimage import imread
img = imread(FILENAME, mode="RGB")

predict(img, parameters)

Большую часть легко реализовать, кроме операции свертки, которая чрезвычайно сложна. Если вы хотите использовать go на этом маршруте, возможно, вам лучше использовать для этого библиотеку NN.


Короче говоря, это возможно, но требует много усилий для повторной реализации тот же код (код, что и в архитектуре NN) от matlab до python. Вы можете обратиться к этому руководству как к источнику преобразования предварительно обученной сети Matlab в python.

...