Ошибка формы при использовании Conv1D в Keras - PullRequest
0 голосов
/ 04 июля 2018

У меня проблемы с использованием Conv1D в качестве входного слоя в Sequential NN с Keras. Вот мой код:

import numpy as np    
from keras.layers.convolutional import Conv1D    
from keras.models import Sequential    
from keras.optimizers import Adam    

conv1d = Conv1D(input_shape=(None, 16), kernel_size=2, filters=2)    

model = Sequential()    
model.add(conv1d)    
model.compile(loss="logcosh", optimizer=Adam(lr=0.001))    

x_train = np.zeros((32, 16, 1))    
y_train = np.zeros((32, 16, 1))    

print(x_train.shape)    

model.fit(x_train, y_train, batch_size=4, epochs=20)     

Вот ошибка. Я пробовал несколько вещей, но ни одна из них не помогла мне решить проблему.

ValueError: Ошибка при проверке ввода: ожидалось, что conv1d_47_input будет иметь форму (None, 16), но получил массив с формой (16, 1)

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Мне удалось найти решение, используя функцию выравнивания и плотный слой, и это сработало

import numpy as np
from keras.layers.convolutional import Conv1D
from keras.models import Sequential
from keras.optimizers import Adam
from keras.layers import Conv1D, Dense, MaxPool1D, Flatten, Input

conv1d = Conv1D(input_shape=(16,1), kernel_size=2, filters=2)

model = Sequential()
model.add(conv1d)
model.add(Flatten())
model.add(Dense(16))

model.compile(optimizer=optimizer,loss="cosine_proximity",metrics=["accuracy"])

x_train = np.zeros((32,16,1))
y_train = np.zeros((32,16))

print(x_train.shape)
print()

model.fit(x_train, y_train, batch_size=4, epochs=20) 
0 голосов
/ 04 июля 2018

Conv1D ожидает, что входные данные будут иметь форму (batch_size, steps, input_dim).

Исходя из формы ваших тренировочных данных, у вас максимальная длина 16 и размерность ввода всего 1. Это то, что вам нужно?

Если это так, то входная форма может быть указана либо как (16, 1) (длина всегда равна 16), либо (None, 1) (динамическая длина).

Если вы намеревались определить последовательности длины 1 и размерности 16, то вам нужна другая форма обучающих данных:

x_train = np.zeros((32, 1, 16))
y_train = np.zeros((32, 1, 16))
...