Как изменить 3-канальный набор данных для ввода в нейронную сеть - PullRequest
1 голос
/ 23 марта 2019

Я пытаюсь передать набор данных kth действия в cnn. У меня проблемы с изменением формы данных. Я создал этот массив (99,75,120,160) type = uint8, т.е. 99 ​​видео, принадлежащих к классу, каждое видео имеет 75 кадров, размерность 120x160 для каждого кадра.

model = Sequential()
model.add(TimeDistributed(Conv2D(64, (3, 3), activation='relu', padding='same'), 
                          input_shape=())) 
###need to reshape data in input_shape

Должен ли я сначала указать плотный слой?

вот мой код

model = Sequential()
model.add(TimeDistributed(Conv2D(64, (3, 3), activation='relu', padding='same'), 
                          input_shape=(75,120,160)))
###need to reshape data in input_shape

model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Conv2D(32, (3, 3), activation='relu', padding='same')))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Conv2D(16, (3, 3), activation='relu', padding='same')))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))

model.add(TimeDistributed(Flatten()))
model.add(LSTM(units=64, return_sequences=True))

model.add(TimeDistributed(Reshape((8, 8, 1))))
model.add(TimeDistributed(UpSampling2D((2,2))))
model.add(TimeDistributed(Conv2D(16, (3,3), activation='relu', padding='same')))
model.add(TimeDistributed(UpSampling2D((2,2))))
model.add(TimeDistributed(Conv2D(32, (3,3), activation='relu', padding='same')))
model.add(TimeDistributed(UpSampling2D((2,2))))
model.add(TimeDistributed(Conv2D(64, (3,3), activation='relu', padding='same')))
model.add(TimeDistributed(UpSampling2D((2,2))))
model.add(TimeDistributed(Conv2D(1, (3,3), padding='same')))

model.compile(optimizer='adam', loss='mse')

data = np.load(r"C:\Users\shj_k\Desktop\Project\handclapping.npy")
print (data.shape)
(x_train,x_test) = train_test_split(data)


x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.




print (x_train.shape)
print (x_test.shape)


model.fit(x_train, x_train,
                epochs=100,
                batch_size=1,
                shuffle=False,
                validation_data=(x_test, x_test))

переменные x_test (25,75,120,160) type = float32 x_train (74,75,120,160) тип = float32

полная ошибка для комментария

runfile ( 'C: /Users/shj_k/Desktop/Project/cnn_lstm.py', wdir = 'C: / Users / shj_k / Desktop / Project') (99, 75, 120, 160) (74, 75, 120, 160) (25, 75, 120, 160) Traceback (последний вызов был последним):

Файл "", строка 1, в runfile ('C: /Users/shj_k/Desktop/Project/cnn_lstm.py', wdir = 'C: / Users / shj_k / Desktop / Project')

Файл "C: \ Users \ shj_k \ Anaconda3 \ Lib \ сайт-пакеты \ spyder_kernels \ подгоняет \ spydercustomize.py", строка 668, в runfile execfile (имя файла, пространство имен)

Файл "C: \ Users \ shj_k \ Anaconda3 \ Lib \ сайт-пакеты \ spyder_kernels \ подгоняет \ spydercustomize.py", строка 108, в execfile exec (compile (f.read (), filename, 'exec'), пространство имен)

Файл "C: /Users/shj_k/Desktop/Project/cnn_lstm.py", строка 63, в validation_data = (x_test, x_test))

Файл "C: \ Users \ shj_k \ Anaconda3 \ Lib \ сайт-пакеты \ keras \ двигатель \ training.py", линия 952, в форме batch_size = batch_size)

Файл "C: \ Users \ shj_k \ Anaconda3 \ Lib \ сайт-пакеты \ keras \ двигатель \ training.py", строка 751, в _standardize_user_data exception_prefix = 'вход')

Файл "C: \ Users \ shj_k \ Anaconda3 \ Lib \ сайт-пакеты \ keras \ двигатель \ training_utils.py", строка 128, в standardize_input_data 'with shape' + str (data_shape))

ValueError: ошибка при проверке ввода: ожидается time_distributed_403_input иметь 5 измерений, но получил массив с форма (74, 75, 120, 160)

Спасибо за ответ

Ответы [ 2 ]

0 голосов
/ 23 марта 2019

Благодарю господина Кая Аэберли за помощь. Я смог запустить модель после изменения размера изображения до размера 128x128. Размер набора данных может привести к сбою системы при отсутствии графического процессора. Уменьшите размер по мере необходимости. Пожалуйста, обратитесь к целому разделу комментариев, если у вас есть сомнения. Вы можете найти код здесь в github

0 голосов
/ 23 марта 2019

Пара вещей:

Слой TimeDistributed в Keras требует измерения времени, поэтому для обработки видеоизображения здесь может быть 75 (кадры).

Также ожидается, что изображения будут отправлены в форме (120, 60, 3).Таким образом, слой input_shape TimeDistributed должен быть (75, 120, 160, 3).3 обозначает каналы RGB.Если у вас есть изображения в градациях серого, должно работать 1 в качестве последнего измерения.

Input_shape всегда игнорирует измерение "строки" в ваших примерах, в вашем случае 99.

Для проверки созданных выходных формдля каждого слоя модели, ставьте model.summary() после компиляции.

См .: https://www.tensorflow.org/api_docs/python/tf/keras/layers/TimeDistributed

Вы можете конвертировать изображения в массивы с формой (X, Y, 3), используя Keras.preprocessing.image.

from keras.preprocessing import image

# loads RGB image as PIL.Image.Image type
img = image.load_img(img_file_path, target_size=(120, 160))
# convert PIL.Image.Image type to 3D tensor with shape (120, 160, 3)
x = image.img_to_array(img)

Обновление : Кажется, причина, по которой вам пришлось сделать квадрат всех изображений (128,128,1), заключается в том, что в model.fit (), обучающие примеры (x_train) и метки (обычно y_train) совпадают.Если вы посмотрите на сводку модели ниже, после слоя Flatten все станет квадратным.Поэтому ожидается, что метки будут квадратными.Это имеет смысл: использование этой модели для прогнозирования приведет к преобразованию (120,160,1) изображения в нечто вроде формы (128, 128, 1).Поэтому изменение модели обучения на приведенный ниже код должно работать:

x_train = random.random((90, 5, 120, 160, 1)) # training data
y_train = random.random((90, 5, 128, 128, 1)) # labels
model.fit(x_train, y_train)
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
time_distributed_1 (TimeDist (None, 5, 120, 160, 64)   320       
_________________________________________________________________
time_distributed_2 (TimeDist (None, 5, 60, 80, 64)     0         
_________________________________________________________________
time_distributed_3 (TimeDist (None, 5, 60, 80, 32)     18464     
_________________________________________________________________
time_distributed_4 (TimeDist (None, 5, 30, 40, 32)     0         
_________________________________________________________________
time_distributed_5 (TimeDist (None, 5, 30, 40, 16)     4624      
_________________________________________________________________
time_distributed_6 (TimeDist (None, 5, 15, 20, 16)     0         
_________________________________________________________________
time_distributed_7 (TimeDist (None, 5, 4800)           0         
_________________________________________________________________
lstm_1 (LSTM)                (None, 5, 64)             1245440   
_________________________________________________________________
time_distributed_8 (TimeDist (None, 5, 8, 8, 1)        0         
_________________________________________________________________
time_distributed_9 (TimeDist (None, 5, 16, 16, 1)      0         
_________________________________________________________________
time_distributed_10 (TimeDis (None, 5, 16, 16, 16)     160       
_________________________________________________________________
time_distributed_11 (TimeDis (None, 5, 32, 32, 16)     0         
_________________________________________________________________
time_distributed_12 (TimeDis (None, 5, 32, 32, 32)     4640      
_________________________________________________________________
time_distributed_13 (TimeDis (None, 5, 64, 64, 32)     0         
_________________________________________________________________
time_distributed_14 (TimeDis (None, 5, 64, 64, 64)     18496     
_________________________________________________________________
time_distributed_15 (TimeDis (None, 5, 128, 128, 64)   0         
_________________________________________________________________
time_distributed_16 (TimeDis (None, 5, 128, 128, 1)    577       
=================================================================
Total params: 1,292,721
Trainable params: 1,292,721
Non-trainable params: 0

Обновление 2 : чтобы оно работало с неквадратными изображениями без изменения y,установите LSTM (300), Reshape (15, 20, 1), и впоследствии вы удалите один из слоев повышения дискретизации Conv2D +.Тогда вы можете использовать картинки с формой (120, 160) даже в автоэнкодере.Хитрость заключается в том, чтобы взглянуть на сводку модели и убедиться, что после LSTM вы начинаете с правильной формы, чтобы после добавления всех остальных слоев конечный результат имел форму (120 160).

model = Sequential()
model.add(
    TimeDistributed(Conv2D(64, (2, 2), activation="relu", padding="same"), =(5, 120, 160, 1)))

model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Conv2D(32, (3, 3), activation='relu', padding='same')))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Conv2D(16, (3, 3), activation='relu', padding='same')))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))

model.add(TimeDistributed(Flatten()))
model.add(LSTM(units=300, return_sequences=True))

model.add(TimeDistributed(Reshape((15, 20, 1))))
model.add(TimeDistributed(UpSampling2D((2, 2))))
model.add(TimeDistributed(Conv2D(16, (3, 3), activation='relu', padding='same')))
model.add(TimeDistributed(UpSampling2D((2, 2))))
model.add(TimeDistributed(Conv2D(32, (3, 3), activation='relu', padding='same')))
model.add(TimeDistributed(UpSampling2D((2, 2))))
model.add(TimeDistributed(Conv2D(1, (3, 3), padding='same')))


model.compile(optimizer='adam', loss='mse')

model.summary()

x_train = random.random((90, 5, 120, 160, 1))
y_train = random.random((90, 5, 120, 160, 1))

model.fit(x_train, y_train)
...