Слой TensorFlow, который преобразует 2D-матрицу в вектор определенной длины

#python #tensorflow

#python #tensorflow

Вопрос:

Я пытаюсь создать нейронную сеть, которая принимает данные в виде матрицы и выводит вектор, но я не знаю, какие слои использовать для этого. Мой ввод имеет форму (10,4), а желаемый результат имеет форму (3,). Моя текущая модель следующая :

 model = tf.keras.Sequential([
    tf.keras.layers.Dense(256,activation="relu"),
    tf.keras.layers.Dense(256,activation="relu"),
    tf.keras.layers.Dense(1),
])
 

это, по крайней мере, приводит к получению вектора вместо матрицы, но имеет (10,) вместо (3,) . Вероятно, я мог бы найти способ уменьшить это значение до (3,), но я сомневаюсь, что при таком подходе я поступаю правильно.

Комментарии:

1. Пожалуйста, предоставьте достаточно воспроизводимый ввод и ожидаемый результат. Кроме того, (10,) (3,) информация и, которую вы предоставляете в конце, не соответствует коду, которым вы поделились. Пожалуйста, будьте предельно ясны и точны.

2. Что такое (10,4), это последовательность? или изображение? или просто матрица (10,4)

3. это всего лишь матрица (10,4). желаемый результат — это вектор длины 3, который я обозначил с помощью (3,) . надеюсь, это правильно. фактический текущий вывод — это вектор длины 10, который я обозначил с помощью (10,)

4. тогда решение, о котором я упоминаю ниже, должно сработать для вас. не стесняйтесь соответствующим образом изменять архитектуру.

Ответ №1:

Предполагая, что ваша (10,4) матрица не представляет последовательность длиной 10 (где вам понадобится LSTM ) ИЛИ изображение (где вам понадобится 2D CNN ), вы можете просто flatten() ввести матрицу и передать ее в следующие несколько плотных слоев, как показано ниже.

 from tensorflow.keras import layers, Model

inp = layers.Input((10,4)) #none,10,4
x = layers.Flatten()(inp)  #none,40
x = layers.Dense(256)(x)   #none,256
out = layers.Dense(3)(x)   #none,3

model = Model(inp, out)
model.summary()
 
 Layer (type)                 Output Shape              Param #   
=================================================================
input_43 (InputLayer)        [(None, 10, 4)]           0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 40)                0         
_________________________________________________________________
dense_82 (Dense)             (None, 256)               10496     
_________________________________________________________________
dense_83 (Dense)             (None, 3)                 771       
=================================================================
Total params: 11,267
Trainable params: 11,267
Non-trainable params: 0
 

Комментарии:

1.Я пробовал это, но по какой-то причине у меня это не работает. data.shape Тензорная форма ([10, 4]) x = tf.keras.layers.Flatten()(data) x = tf.keras.layers.Dense(256)(x) x = tf.keras.layers.Dense(3)(x) x.shape Тензорная форма ([10, 4])

2. это действительно работает, мой плохой. По-видимому, слой Flatten() ничего не делает с матрицей, потому что он ожидает, что первое измерение будет размером пакета. Если я использую model.fit (data), он внутренне добавит размер пакета в качестве измерения (я думаю) и будет работать так, как вы описали.

Ответ №2:

Вы можете использовать слой Flatten: https://keras.io/api/layers/reshaping_layers/flatten /

Или вы можете попробовать 2d CNNS.