Каким должен быть мой ввод в слой keras conv1D и каким должен быть input_shape? - PullRequest
0 голосов
/ 05 мая 2019

Примечание: первый раз.Я попытался быть тщательным в своем описании

Я пытался настроить то, что я думал, было бы очень простым CNN, следуя этому руководству: https://machinelearningmastery.com/cnn-models-for-human-activity-recognition-time-series-classification/

Мой набор данных Xtrainэто временной ряд в виде массива с 34396 строками (выборками) и 600 столбцами (временными шагами).Мой набор данных Ytrain - это просто массив, содержащий метки 0,1 или 2 (в виде целых).Я просто пытаюсь использовать CNN для выполнения мультиклассификации.

Я сталкиваюсь с проблемой получения ошибок вроде

Вход 0 несовместим со слоем conv1d_39: ожидаемый ndim= 3, найдено ndim = 4

, когда input_shape=(n_timesteps,n_features,n_outputs)

или

Ошибка при проверке ввода: ожидалось, что conv1d_40_input имеет 3 измерения, но получилмассив с формой (34396, 600)

, когда input_shape=(n_timesteps,n_features)

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

Я пытался установить input_shape в

(None, 600, 1)
(34396,600, 1)
(34396,600)
(None,600)

среди различных другихкомбинации.

train_df = pd.read_csv('training.csv')
test_df = pd.read_csv('test.csv')

x_train=train_df.iloc[:,2:].values
y_train=train_df.iloc[:,1].values
x_test=train_df.iloc[:,2:].values
y_test=train_df.iloc[:,1].values
n_rows=len(x_train)
n_cols=len(x_train[0])

def evaluate_model(trainX, trainy, testX, testy):
    verbose, epochs, batch_size = 0, 10, 32
    n_timesteps, n_features, n_outputs = trainX.shape[0], trainX.shape[1], 3
    print(n_timesteps, n_features, n_outputs)
    model = Sequential()
    model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(n_timesteps,n_features,n_outputs)))
    model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
    model.add(Dropout(0.5))
    model.add(MaxPooling1D(pool_size=2))
    model.add(Flatten())
    model.add(Dense(100, activation='relu'))
    model.add(Dense(n_outputs, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    # fit network
    model.fit(trainX, trainy, epochs=epochs, batch_size=batch_size, verbose=verbose)
    # evaluate model
    _, accuracy = model.evaluate(testX, testy, batch_size=batch_size, verbose=0)
    return accuracy
evaluate_model(x_train,y_train,x_test,y_test)

1 Ответ

0 голосов
/ 05 мая 2019

Как указано в keras doc , для Conv1D, например input_shape=(10, 128) для последовательностей временных рядов из 10 временных шагов с 128 объектами на шаг.

Так что для вашего случая, поскольку у вас есть 600 временных шагов для каждой из 1 функций, это должно быть input_shape=(600,1).

Кроме того, вы должны подавать свои метки y как в горячем кодированном виде.

Рабочий код

из keras.utils import to_categorical

model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(600,1)))    
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy', 
              optimizer='adam', metrics=['accuracy'])

x = np.random.randn(100,600)
y = np.random.randint(0,10, size=(100))
# Reshape to no:of sample, time_steps, 1 and convert y to one hot encoding
model.fit(x.reshape(100,600,1), to_categorical(y))
# Same as model.fit(np.expand_dims(x, 2), to_categorical(y))

Выход:

Epoch 1/1
100/100 [===========================] - 0s 382us/step - loss: 2.3245 - acc: 0.0800
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...