Ошибка значения: Фигуры (29, 1) и (42, 1, 29) несовместимы [Keras]

#python #tensorflow #keras

Вопрос:

Привет, я пытаюсь использовать keras для построения модели, которая использует 42 входа и выхода 1 из 29 классов. Но когда я пытаюсь соответствовать своей модели, я получаю это сообщение об ошибке.

     from tensorflow.keras.utils import to_categorical
    
        Y_train_cat = to_categorical(Y_train, 29)
        Y_test_cat = to_categorical(Y_test, 29)
        Y_val_cat = to_categorical(Y_val, 29)
        
        train_dataset = tf.data.Dataset.from_tensor_slices((X_train,Y_train_cat))
        test_dataset = tf.data.Dataset.from_tensor_slices((X_test,Y_test_cat))
        val_dataset = tf.data.Dataset.from_tensor_slices((X_val,Y_val_cat))
    
    from tensorflow.keras.callbacks import EarlyStopping
    early_stopping_monitor = EarlyStopping(monitor='val_loss', patience = 2)
    
    model = Sequential([
            Dense(units = 102, input_shape = (42,1), activation = 'relu'),
            Dense(units = 56, activation = 'relu'),
            Dense(units = 29, activation = 'softmax') 
            ])
    
    
    model.compile(optimizer = Adam(learning_rate = 0.0001),
                  loss='categorical_crossentropy',
                  metrics=['accuracy'])
    
    tf.keras.utils.plot_model(model)
    
    model.fit(x = train_dataset,
              batch_size = 30,
              epochs = 10,
              shuffle = False,
              verbose = 2, 
              validation_data = val_dataset,
              callbacks = [early_stopping_monitor]
              )
 

Форма train_dataset такова

 <TensorSliceDataset shapes: ((42,), (29,)), types: (tf.float64, tf.float32)>
 

Заранее благодарю вас!

Ответ №1:

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

В вашем случае форма ввода такова (42,1) . Таким образом, форма вывода последнего слоя будет такой (42,29) , и она несовместима с предоставленными вами метками. Итак, подумайте о том, чтобы изменить форму ввода. Либо вы можете сжать свои данные из (42,1) в (42) и изменить входной аргумент формы, либо вы можете добавить сглаженный слой в качестве первого слоя, как это:

 model = tf.keras.models.Sequential([
            tf.keras.layers.Flatten(input_shape=(42,1)),
            Dense(units = 102, activation = 'relu'),
            Dense(units = 56, activation = 'relu'),
            Dense(units = 29, activation = 'softmax') 
            ]) 
 

ОБНОВЛЕНИЕ: Также пакетируйте свои данные, чтобы добавить пакетное измерение, подобное этому:

 BATCH_SIZE = 30
train_dataset = tf.data.Dataset.from_tensor_slices((X_train,Y_train_cat)).batch(BATCH_SIZE)
 

Весь код со случайным набором данных с такими формами, как у вас:

 import tensorflow as tf
import numpy as np
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam

X_train = tf.random.uniform((100,42,))
Y_train = tf.random.uniform((100,), dtype=tf.int32, minval=0, maxval=29)

Y_train_cat = to_categorical(Y_train, 29)  
train_dataset = tf.data.Dataset.from_tensor_slices((X_train,Y_train_cat)).batch(30)
model = tf.keras.models.Sequential([
            tf.keras.layers.Flatten(input_shape=(42,1)),
            Dense(units = 102, activation = 'relu'),
            Dense(units = 56, activation = 'relu'),
            Dense(units = 29, activation = 'softmax') 
            ]) 

model.compile(optimizer = Adam(learning_rate = 0.0001),
                  loss='categorical_crossentropy',
                  metrics=['accuracy'])
    
tf.keras.utils.plot_model(model)
model.summary()
model.fit(x = train_dataset,
              batch_size = 30,
              epochs = 10,
              shuffle = False,
              verbose = 2, 
              )
 

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

1. Привет, большое спасибо за помощь, я не уверен, что это тривиальная проблема, но когда я пытаюсь выровнять слой, я получаю эту ошибку: < Ошибка значения: Ввод 0 плотного слоя несовместим со слоем: ожидаемая ось -1 входной формы имеет значение 42, но получен ввод с формой (42, 1)> Я не уверен, как изменить переменную набора данных, чтобы сжать ввод в форму (42).

2. Прошу прощения. Я забыл вам сказать, также пакуйте ваши данные. Я обновлю свой ответ.

3. Да, теперь это моя модель: модель = Последовательная([ Сглаживание(input_shape = (42,1) ), Плотная(единицы = 102, активация = «relu»), # Всегда для первого слоя Плотная(единицы = 56, активация = «relu»), Плотная(единицы = 29, активация = «softmax») # Вероятность для каждого выходного класса ])

4. Спасибо за информацию о размерах партий! К сожалению, та же ошибка обнаружилась даже при добавлении нового материала: < Ошибка ввода значения: Вход 0 плотного слоя несовместим со слоем: ожидаемая ось -1 входной формы должна иметь значение 42, но полученный ввод с формой (42, 1)>

5. Пожалуйста, скажите мне X_train и Y_train формы. Я рассматривал их как (n_samples,42,1) и (n_samples,1) соответственно.