Tensorflow keras Последовательный .add отличается от встроенного определения? - PullRequest
0 голосов
/ 05 ноября 2019

Keras дает разные результаты, когда я определяю свою модель с помощью декларативного метода вместо функционального метода. Две модели кажутся одинаковыми, но использование синтаксиса ".add ()" работает, в то время как декларативный синтаксис дает ошибки - каждый раз это разные ошибки, но обычно что-то вроде: A target array with shape (10, 1) was passed for an output of shape (None, 16) while using as loss `mean_squared_error`. This loss expects targets to have the same shape as the output. Кажется, что-то происходитс автоматическим преобразованием входных фигур, но я не могу сказать, что. Кто-нибудь знает, что я делаю не так? Почему эти две модели не являются абсолютно одинаковыми?

import tensorflow as tf
import tensorflow.keras
import numpy as np

x = np.arange(10).reshape((-1,1,1))
y = np.arange(10)

#This model works fine
model = tf.keras.Sequential()
model.add(tf.keras.layers.LSTM(32, input_shape=(1, 1), return_sequences = True))
model.add(tf.keras.layers.LSTM(16))
model.add(tf.keras.layers.Dense(1))
model.add(tf.keras.layers.Activation('linear'))

#This model fails. But shouldn't this be equivalent to the above?
model2 = tf.keras.Sequential(
{
    tf.keras.layers.LSTM(32, input_shape=(1, 1), return_sequences = True),
    tf.keras.layers.LSTM(16),
    tf.keras.layers.Dense(1),
    tf.keras.layers.Activation('linear')
})

#This works
model.compile(loss='mean_squared_error', optimizer='adagrad')
model.fit(x, y, epochs=1, batch_size=1, verbose=2)

#But this doesn't! Why not? The error is different each time, but usually
#something about the input size being wrong
model2.compile(loss='mean_squared_error', optimizer='adagrad') 
model2.fit(x, y, epochs=1, batch_size=1, verbose=2)

Почему эти две модели не эквивалентны? Почему один обрабатывает входной размер правильно, а другой нет? Вторая модель терпит неудачу с другой ошибкой каждый раз (время от времени это даже работает), поэтому я подумал, может быть, есть какое-то взаимодействие с первой моделью? Но я попытался закомментировать первую модель, и это не помогает. Так почему же второй не работает?

ОБНОВЛЕНИЕ: Вот "model.summary () для первой и второй модели. Они кажутся разными, но я не понимаю, почему.

Для модели.summary ():

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm (LSTM)                  (None, 1, 32)             4352      
_________________________________________________________________
lstm_1 (LSTM)                (None, 16)                3136      
_________________________________________________________________
dense (Dense)                (None, 1)                 17        
_________________________________________________________________
activation (Activation)      (None, 1)                 0         
=================================================================
Total params: 7,505
Trainable params: 7,505
Non-trainable params: 0

Для модели2.summary ():

model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_2 (LSTM)                (None, 1, 32)             4352      
_________________________________________________________________
activation_1 (Activation)    (None, 1, 32)             0         
_________________________________________________________________
lstm_3 (LSTM)                (None, 16)                3136      
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 17        
=================================================================
Total params: 7,505
Trainable params: 7,505
Non-trainable params: 0```

1 Ответ

2 голосов
/ 05 ноября 2019

Когда вы создаете модель со встроенными объявлениями, вы помещаете слои в фигурные скобки {}, что делает ее набором, который по своей природе неупорядочен. Измените фигурные скобки на квадратные скобки [], чтобы поместить их в упорядоченный список. Это обеспечит правильное расположение слоев в вашей модели.

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