#python #tensorflow
#python #tensorflow
Вопрос:
Для реализации определенной функции мне нужно количество ядер «input_channels» в моем слое, каждое из которых имеет только глубину одного канала, а не depth = «input_channels». Мне нужно свернуть одно ядро с одним каналом ввода, таким образом, на выходе слоя будет количество ядер «input_channels».
Какая функция свертки python / numpy / tensorflow может разрешить такую свертку, при которой количество каналов в kernel не всегда должно быть равно «input_channels» и может быть равно 1 вместо этого?
Заранее спасибо за любую помощь.
(если кто-нибудь хочет знать, что все, что я еще пробовал,
В функции conv2d tensorflow, если я укажу количество ядер = 1 для этого, то это будет суммироваться по всем input_channels и количество output_channels будет равно 1, поскольку это всегда инициализирует глубину ядра = «input_channels».
Другой вариант — указать количество ядер = input_channels в функции conv2d, но это создало бы «input_channels» количество ядер глубины «input_channels», что значительно усложнило бы и неверно реализовало мой слой.
Еще одна вещь, которую я попробовал, это инициализировать ядро volume (kernel_height, kernel_width, input_channels) и выполнить цикл по третьему измерению, чтобы свернуть только один входной канал с одним ядром. Но функция tensorflow conv2d требует для работы ядра 4-го ранга и выдает следующую ошибку —
ValueError: Shape must be rank 4 but is rank 3 for 'generic_act_func_4/Conv2D' (op: 'Conv2D') with input shapes: [?,28,28], [28,28]. )
Комментарии:
1. Я подозреваю, что вы ищете уровень Conv1D. Он применяет свертку только к 1 измерению
2. Но для этой функции требуется одномерное окно свертки, тогда как все мои фильтры являются двухмерными. Мне нужно выполнить двухмерную свертку между фильтром в оттенках серого / одноканальным фильтром и одним каналом ввода.
3. Мне очень трудно понять ваш вопрос. Описания / примеры данных и кода, которые вы внедрили, очень помогли бы
4. Пожалуйста, обратитесь к добавленному изображению для дальнейшей разработки.
Ответ №1:
Насколько я понимаю, вы пытаетесь изучить отдельную модель для каждого измерения во входных данных. Таким образом, вам понадобятся 2D-фильтры свертки с глубиной фильтрации 1.
Я считаю, что должен быть более простой способ, но наиболее логичным для меня было бы создать модель, состоящую из нескольких подмоделей, равных глубине вашего ввода (32). Таким образом, 32 модели, содержащие один сверточный фильтр, получают только одно измерение вашего ввода. Объединение выходных данных всех моделей затем дало бы результаты, которые вам требуются.
Другим решением, которое было бы интересным (но я не уверен, сработает ли оно, сам не пробовал), было бы выполнение разделяемых сверток на входе.
Ссылка на статью, описывающую эти операции:https://towardsdatascience.com/a-basic-introduction-to-separable-convolutions-b99ec3102728
По сути, вы хотите выполнить только 1-ю часть операции разделяемой свертки, что в точности соответствует тому, что делает слой DepthwiseConv2D в keras / tensorflow. Итак, я бы посмотрел на это, если бы я был там, где вы. Было бы интересно узнать, работает ли это для вас!