Как добавить пользовательский слой пула на основе энтропии, используя PyTorch? - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь создать слой объединения для модели CNN, где объединение выполняется на основе энтропии.Таким образом, вместо случайного отбрасывания 75% данных (фильтр 2x2, шаг = 2) я планирую вычислить энтропию каждого окна nxn и переслать k ^ 2 окна с наибольшей энтропией на следующий уровень, который в этомВ этом случае предпочтительно будет полностью соединенный слой.

На данный момент я попытался загрузить простое изображение, и для каждого окна bxn я вычисляю энтропию.Тем не менее, это довольно много времени.Процесс сортировки займет даже больше времени.Вот что я сделал до сих пор.

#%%
import torch
import numpy as np
from math import log, e
from PIL import Image

#%%
def entropy(labels, base=None):
    n_labels = len(labels)
    if n_labels <= 1:
        return 0     
    value,counts = np.unique(labels, return_counts=True)
    probs = counts / n_labels
    n_classes = np.count_nonzero(probs)

    if n_classes <= 1:
        return 0
    ent = 0.
    # Compute entropy
    base = e if base is None else base
    for i in probs:
        ent -= i * log(i, base)
    return ent

#%%
img = Image.open("test.jpg").convert("L")
imgarr = np.array(img)
x = torch.from_numpy(imgarr)
print(x)

#%%
window = 10
for idx_x in range(x.shape[0]-window):
    for idx_y in range(x.shape[1]-window):
        y = (x[idx_x:idx_x+window,idx_y:idx_y+window])        
        print(entropy(torch.flatten(y).numpy()))

Я ищу быстрый и эффективный способ решения этой проблемы, желательно с использованием встроенных функций PyTorch.

...