#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)
соответственно.