Keras не работает с 3 и более измерениями. InvalidArgumentError - PullRequest
1 голос
/ 24 апреля 2020

Я хочу создать модель, которая использует матрицу формы (64, 4) для прогнозирования массива формы (4). Но это не работает по какой-то причине. Например, вот код:

import numpy as np
from tensorflow.keras import models, layers, optimizers

x = np.random.uniform(size=600*64*4).reshape(600, 64, 4)
y = np.random.uniform(size=600*4).reshape(600, 4)

model = models.Sequential([
    layers.Dense(16, activation='relu', input_shape=[64, 4]),
    layers.Dense(16, activation='relu'),
    layers.Dense(4)
])
model.compile(loss='mean_absolute_error',
              optimizer=optimizers.SGD(lr=1e-3, momentum=0.9),
              metrics=["mae"])

model.fit(x, y, epochs=5)

И этот скрипт заканчивается на InvalidArgumentError: Incompatible shapes: [32,64,4] vs. [32,4]
Но код ниже:

import numpy as np
from tensorflow.keras import models, layers, optimizers

x = np.random.uniform(size=600*4).reshape(600, 4)
y = np.random.uniform(size=600*4).reshape(600, 4)

model = models.Sequential([
    layers.Dense(16, activation='relu', input_shape=[4]),
    layers.Dense(16, activation='relu'),
    layers.Dense(4)
])
model.compile(loss='mean_absolute_error',
              optimizer=optimizers.SGD(lr=1e-3, momentum=0.9),
              metrics=["mae"])
model.fit(x, y, epochs=5)

... работает просто отлично. Мне кажется, в таком поведении есть логическая ошибка. А может я чего-то не понимаю.

Пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Следующие работы,

from tensorflow.keras.layers import *
from tensorflow.keras.models import Model, Sequential
import tensorflow as tf
import numpy as np

x = np.random.uniform(size=600*64*4).reshape(600, 64, 4)
y = np.random.uniform(size=600*4).reshape(600, 4)

ip = Input(shape=(64,4))
d1 = Dense(16, activation='relu')(ip)
f = Flatten()(d1)
d2 = Dense(16, activation='relu')(f)
d3 = Dense(4)(d2)

model = Model(ip, d3)

model.compile(loss='mse', metrics='mae', optimizer='adam')
model.summary()

model.fit(x,y,epochs=1, batch_size = 64)

Вы используете Dense неправильно, слои F C, за исключением одномерных данных, в основном вам также нужно сгладить в каком-то слое, чтобы ваш последний вывод согласуется с y.

Model: "model_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_3 (InputLayer)         [(None, 64, 4)]           0         
_________________________________________________________________
dense_6 (Dense)              (None, 64, 16)            80        
_________________________________________________________________
flatten (Flatten)            (None, 1024)              0         
_________________________________________________________________
dense_7 (Dense)              (None, 16)                16400     
_________________________________________________________________
dense_8 (Dense)              (None, 4)                 68        
=================================================================
Total params: 16,548
Trainable params: 16,548
Non-trainable params: 0
_________________________________________________________________
10/10 [==============================] - 0s 3ms/step - loss: 0.1689 - mae: 0.3340

<tensorflow.python.keras.callbacks.History at 0x7f838cd4deb8>

Проверьте, что слой Flatten гарантирует, что ваш вывод модели является 2-d (batch_size, num_class или output_nodes). Но без сглаживания вы получите 3-й вывод из модели, поэтому вы должны также сделать 3-й у.

1 голос
/ 24 апреля 2020

В первом примере у вас есть 2D объекты (64x4) и 4 1D выхода. Поскольку ваша модель представляет собой серию простых матричных умножений, вы не преобразуете 2D-данные в 1D. Вам нужно либо применить слои, такие как RNN или CNN, которые моделируют отношения в обоих направлениях в ваших данных, а затем изменить их или просто изменить их.

Я рекомендую записать каждый тензор на листе бумаги с их формой в нижнем индексе. Вы быстро обнаружите, что если вы получите точечное произведение каждого из них в том порядке, в котором они есть, то формы будут несовместимы.

РЕДАКТИРОВАТЬ: чтобы сделать его более понятным - запустите model.summary() перед model.fit() , Вы увидите, что первый слой Dense выводит [32, 64, 16] и то же самое для второго Dense. Последние выводят [32, 64, 4] и, чтобы найти потери, Tensorflow должен сравнить этот тензор с метками, которые вы предоставляете. Но они имеют форму [32, 4]. Вы не можете вычесть матрицу 3 на 8 из матрицы 2 на 5, а также для тензоров разного ранга и размеров (что вам нужно сделать здесь - ваша потеря буквально представляет собой сумму (абсолютное значение) вычитаний).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...