Шаблоны функций и времени в наборе данных LSTM MNIST

77
4

Я некоторое время работаю с LSTM, и я думаю, что понял основные понятия. Я пытался некоторое время играть в среде Keras, чтобы я мог лучше понять, как работает LSTM, поэтому я решил обучить нейронную сеть, чтобы идентифицировать набор данных MNIST.

Я знаю, что когда я тренирую LSTM, я должен дать тензор в качестве входа (количество выборок, временных шагов, функций). Я изменил изображение с 28x28 на один вектор из 784 элементов (1x784), а затем создаю input_shape = (60000, 1, 784). В конце концов я попытался изменить количество шагов времени, и мой новый input_shape станет (60000,16,49).

Я не понимаю, почему, когда я изменяю количество шагов времени, вектор объектов изменяется с 784 до 49. Я думаю, что я не совсем понимаю концепцию временных шагов в LSTM. Не могли бы вы объяснить это лучше? Возможно, ссылаясь на этот конкретный случай? Кроме того, когда я увеличиваю временные шаги, точность ниже, почему так? Разве это не должно быть выше? Спасибо.

редактировать

from __future__ import print_function
import numpy as np
import struct
from keras.models import Sequential
from keras.layers import Dense, LSTM, Activation
from keras.utils import np_utils
train_im = open('train-images-idx3-ubyte','rb')
train_la = open('train-labels-idx1-ubyte','rb')
test_im = open('t10k-images-idx3-ubyte','rb')
test_la = open('t10k-labels-idx1-ubyte','rb')

##training images and labels

magic,num_ima = struct.unpack('>II', train_im.read(8))
rows,columns = struct.unpack('>II', train_im.read(8))
img = np.fromfile(train_im,dtype=np.uint8).reshape(rows*columns, num_ima) #784*60000

magic_l, num_l = struct.unpack('>II', train_la.read(8))
lab = np.fromfile(train_la, dtype=np.int8) #1*60000

## test images and labels

magic, num_test = struct.unpack('>II', test_im.read(8))
rows,columns = struct.unpack('>II', test_im.read(8))
img_test = np.fromfile(test_im,dtype=np.uint8).reshape(rows*columns, num_test) #784x10000

magic_l, num_l = struct.unpack('>II', test_la.read(8))
lab_test = np.fromfile(test_la, dtype=np.int8) #1*10000

batch = 50
epoch=15
hidden_units = 10
classes = 1
a, b = img.T.shape[0:]

img = img.reshape(img.T.shape[0],-1,784)
img_test = img_test.reshape(img_test.T.shape[0],-1,784)
lab = np_utils.to_categorical(lab, 10)
lab_test = np_utils.to_categorical(lab_test, 10)
print(img.shape[0:])
model = Sequential()
model.add(LSTM(40,input_shape =img.shape[1:], batch_size = batch))
model.add(Dense(10))
model.add(Activation('softmax'))
model.compile(optimizer = 'RMSprop', loss='mean_squared_error', metrics = ['accuracy'])
model.fit(img, lab, batch_size = batch,epochs=epoch,verbose=1)

scores = model.evaluate(img_test, lab_test, batch_size=batch)
predictions = model.predict(img_test, batch_size = batch)
print('LSTM test score:', scores[0])
print('LSTM test accuracy:', scores[1])

2 Большое спасибо, когда я это сделаю, я получаю следующую ошибку:

ValueError: Input arrays should have the same number of samples as target arrays. Found 3750 input samples and 60000 target samples.

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

спросил(а) 2021-01-20T00:00:50+03:00 6 месяцев, 2 недели назад
1
Решение
126

Timesteps представляют состояния во времени, такие как кадры, извлеченные из видео. Форма ввода, переданная в LSTM, должна быть в виде (num_samples, timesteps, input_dim). Если вы хотите 16 временных меток, вы должны изменить свои данные как (num_samples//timesteps, timesteps, input_dims)

img=img.reshape(3750,16,784)

Таким образом, с вашим batch_size = 50, он будет передавать 50 * 16 изображений за раз. Прямо сейчас, когда вы сохраняете константу num_samples, она разбивает ваши входные_данные.

edit: Целевой массив будет иметь ту же форму, что и num_samples, т.е. 3750 в вашем случае. Все шаги времени будут иметь один и тот же ярлык. Вы должны решить, что вы собираетесь делать с этими последовательностями MNIST. Ваша текущая модель классифицирует эти последовательности (а не цифры) на 10 классов.

ответил(а) 2021-01-20T00:00:50+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема