#python #tensorflow #keras #deep-learning #lstm
#python #тензорный поток #keras #глубокое обучение #lstm
Вопрос:
ПРЕДУПРЕЖДЕНИЕ: tensorflow: Модель была построена с формой (20, 37, 42) для входного тензора(«input_5:0», shape=(20, 37, 42), dtype=float32), но она была вызвана на входе с несовместимой формой (None, 37).
Привет! Новичок в глубоком обучении здесь… У меня возникли проблемы с использованием слоев LSTM. Входные данные представляют собой массив с плавающей запятой длиной 37, содержащий 2 элемента с плавающей запятой, и массив с плавающей запятой длиной 35, преобразованный в float. На выходе получается массив длиной 19 с 0 и 1. Как следует из названия, у меня возникли проблемы с изменением формы моих входных данных в соответствии с моделью, и я даже не уверен, какие входные размеры будут считаться «совместимыми»
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import random
inputs, outputs = [], []
for x in range(10000):
tempi, tempo = [], []
tempi.append(random.random() - 0.5)
tempi.append(random.random() - 0.5)
for x2 in range(35):
if random.random() > 0.5:
tempi.append(1.)
else:
tempi.append(0.)
for x2 in range(19):
if random.random() > 0.5:
tempo.append(1.)
else:
tempo.append(0.)
inputs.append(tempi)
outputs.append(tempo)
batch = 20
timesteps = 42
training_units = 0.85
cutting_point_i = int(len(inputs)*training_units)
cutting_point_o = int(len(outputs)*training_units)
x_train, x_test = np.asarray(inputs[:cutting_point_i]), np.asarray(inputs[cutting_point_i:])
y_train, y_test = np.asarray(outputs[:cutting_point_o]), np.asarray(outputs[cutting_point_o:])
input_layer = keras.Input(shape=(37,timesteps),batch_size=batch)
dense = layers.LSTM(150, activation="sigmoid", return_sequences=True)
x = dense(input_layer)
hidden_layer_2 = layers.LSTM(150, activation="sigmoid", return_sequences=True)(x)
output_layer = layers.Dense(10, activation="softmax")(hidden_layer_2)
model = keras.Model(inputs=input_layer, outputs=output_layer, name="my_model"
Комментарии:
1. Что
x = dense(input_layer)
в вашем коде?2. Форматирование взято из официального функционального API на tensorflow.org/guide/keras/functional . Я просто скопировал ее и работал оттуда, хотя, по общему признанию, я не уверен, почему она там. В API указано, что «Вы создаете новый узел в графике слоев, вызывая layer для этого объекта inputs:»
3. Можете ли вы добавить отдельный код, чтобы воспроизвести проблему, с которой вы столкнулись? Вы можете использовать сгенерированные данные в качестве входных данных вашей модели.
4. Добавлено. (ограничение на заполнение символов)
5. что такое
inputs
?
Ответ №1:
Здесь несколько проблем.
- У вашего ввода не было временных шагов, вам нужна форма ввода
(n, time steps, features)
- В
input_shape
измерение временных шагов идет первым, а не последним - Ваш последний слой LSTM вернул последовательности, поэтому вы не можете сравнить его с 0s и 1s
Что я сделал:
- Я добавил временные шаги к вашим данным (7)
- Я изменил размеры в
input_shape
- Я установил окончательный
return_sequences=False
Полностью исправлен пример с сгенерированными данными:
import numpy as np
from tensorflow import keras
from tensorflow.keras import layers
batch = 20
n_samples = 1000
timesteps = 7
features = 10
x_train = np.random.rand(n_samples, timesteps, features)
y_train = keras.utils.to_categorical(np.random.randint(0, 10, n_samples))
input_layer = keras.Input(shape=(timesteps, features),batch_size=batch)
dense = layers.LSTM(16, activation="sigmoid", return_sequences=True)(input_layer)
hidden_layer_2 = layers.LSTM(16, activation="sigmoid", return_sequences=False)(dense)
output_layer = layers.Dense(10, activation="softmax")(hidden_layer_2)
model = keras.Model(inputs=input_layer, outputs=output_layer, name="my_model")
model.compile(loss='categorical_crossentropy', optimizer='adam')
history = model.fit(x_train, y_train)
Train on 1000 samples
20/1000 [..............................] - ETA: 2:50 - loss: 2.5145
200/1000 [=====>........................] - ETA: 14s - loss: 2.3934
380/1000 [==========>...................] - ETA: 5s - loss: 2.3647
560/1000 [===============>..............] - ETA: 2s - loss: 2.3549
740/1000 [=====================>........] - ETA: 1s - loss: 2.3395
900/1000 [==========================>...] - ETA: 0s - loss: 2.3363
1000/1000 [==============================] - 4s 4ms/sample - loss: 2.3353
Ответ №2:
Правильный ввод для вашей модели — (20, 37, 42). Примечание: Здесь 20 — это batch_size, который вы явно указали.
Код:
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
batch = 20
timesteps = 42
training_units = 0.85
x1 = tf.constant(np.random.randint(50, size =(1000,37, 42)), dtype = tf.float32)
y1 = tf.constant(np.random.randint(10, size =(1000,)), dtype = tf.int32)
input_layer = keras.Input(shape=(37,timesteps),batch_size=batch)
dense = layers.LSTM(150, activation="sigmoid", return_sequences=True)
x = dense(input_layer)
hidden_layer_2 = layers.LSTM(150, activation="sigmoid", return_sequences=True)(x)
hidden_layer_3 = layers.Flatten()(hidden_layer_2)
output_layer = layers.Dense(10, activation="softmax")(hidden_layer_3)
model = keras.Model(inputs=input_layer, outputs=output_layer, name="my_model")
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
tf.keras.utils.plot_model(model, 'my_first_model.png', show_shapes=True)
Архитектура модели:
Вы можете четко видеть размер ввода.
Код для запуска:
model.fit(x = x1, y = y1, batch_size = batch, epochs = 10)
Примечание: Какой бы размер пакета вы ни указали, вы должны указать тот же размер пакета в команде model.fit().
Вывод:
Epoch 1/10
50/50 [==============================] - 4s 89ms/step - loss: 2.3288 - accuracy: 0.0920
Epoch 2/10
50/50 [==============================] - 5s 91ms/step - loss: 2.3154 - accuracy: 0.1050
Epoch 3/10
50/50 [==============================] - 5s 101ms/step - loss: 2.3114 - accuracy: 0.0900
Epoch 4/10
50/50 [==============================] - 5s 101ms/step - loss: 2.3036 - accuracy: 0.1060
Epoch 5/10
50/50 [==============================] - 5s 99ms/step - loss: 2.2998 - accuracy: 0.1000
Epoch 6/10
50/50 [==============================] - 4s 89ms/step - loss: 2.2986 - accuracy: 0.1170
Epoch 7/10
50/50 [==============================] - 4s 84ms/step - loss: 2.2981 - accuracy: 0.1300
Epoch 8/10
50/50 [==============================] - 5s 103ms/step - loss: 2.2950 - accuracy: 0.1290
Epoch 9/10
50/50 [==============================] - 5s 106ms/step - loss: 2.2960 - accuracy: 0.1210
Epoch 10/10
50/50 [==============================] - 5s 97ms/step - loss: 2.2874 - accuracy: 0.1210