JWK использует кодировку base64url, которая немного отличается от base64. Кроме того, не используйте метод toString()
для значений BigInteger
. Получить непосредственно данные в виде массива байтов
Изменить
Base64.encode(rsa.getModulus().toString())
Base64.encode(rsa.getPublicExponent().toString())
To
Base64.getUrlEncoder().encodeToString(rsa.getModulus().toByteArray())
Base64.getUrlEncoder().encodeToString(rsa.getPublicExponent().toByteArray())
Редактировать : Возможно, я неправильно понял ваш вопрос. Если вы намереваетесь иметь 136 выходных узлов, которые можно упорядочить в матрицу 68x2 (, а не иметь изображение 68x68x2 на выходе, как я сначала сказал ), то вы можете использовать Reshape
слой после вашего окончательного плотного слоя с 136 единицами:
import keras
from keras.models import Sequential
from keras.layers import Conv2D, Flatten, Dense, Reshape
model = Sequential()
model.add(Conv2D(32, 3, input_shape=(320, 320, 3)))
model.add(Flatten())
model.add(Dense(136))
model.add(Reshape((68, 2)))
model.summary()
Это даст вам следующую модель с желаемой формой на выходе:
Layer (type) Output Shape Param #
=================================================================
conv2d_2 (Conv2D) (None, 318, 318, 32) 896
_________________________________________________________________
flatten_2 (Flatten) (None, 3235968) 0
_________________________________________________________________
dense_2 (Dense) (None, 136) 440091784
_________________________________________________________________
reshape_1 (Reshape) (None, 68, 2) 0
=================================================================
Total params: 440,092,680
Trainable params: 440,092,680
Non-trainable params: 0
Обязательно проведите обучение этикетки в той же форме при подгонке модели.
(первоначальный ответ, возможно, все еще актуален)
Да, это обычно делается в моделях семантической сегментации, где входные данные являются изображениями, а выходные - тензоры одинаковой высоты и ширины изображения, а также с количеством каналов, равным количеству классов на выходе. Если вы хотите сделать это в TensorFlow или Keras, вы можете посмотреть существующих реализаций , например, архитектуры U-Net.
Основная особенность этих моделей заключается в том, что эти сети являются полностью сверточными: они состоят только из сверточных слоев. Как правило, карты feaure в этих моделях сначала переходят от «широких и неглубоких» (карты больших объектов в пространственных измерениях с небольшим количеством каналов) к «маленьким и глубоким» (небольшие пространственные измерения, измерение больших размеров каналов) и обратно к желаемый выходной размер. Отсюда U-образная форма:
Есть много способов перейти от 320x320x3 до 68x2 с полностью сверточной сетью, но ввод и вывод вашей модели в основном будет выглядеть так:
import keras
from keras import Sequential
from keras.layers import Conv2D
model = Sequential()
model.add(Conv2D(32, 3, activation='relu', input_shape=(320,320,3)))
# Include more convolutional layers, pooling layers, upsampling layers etc
...
# At the end of the model, add your final Conv2dD layer with 2 filters
# and the required activation function
model.add(Conv2D(2, 3, activation='softmax'))