Я пытаюсь создать слой объединения для модели 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.