Какие ресурсы я должен изучить, чтобы рассчитать размер моего ядра?

#numpy #machine-learning #keras #deep-learning #lstm

#numpy #машинное обучение #keras #глубокое обучение #lstm

Вопрос:

Я пытаюсь создать классификатор Softmax с использованием сверточных нейронных сетей, но я продолжаю получать следующую ошибку от keras:

Отрицательный размер измерения, вызванный вычитанием 4 из 1 для ‘max_pooling1d_1 / MaxPool’ (op: ‘MaxPool’) с входными формами: [?,1,1,64].

Я использую измененный набор данных следующих размеров:

train_x(624,3,9) train_y(624,2) после одного горячего кодирования test_x(150,3,9) test_y (150,2) после одного горячего кодирования

массив 3D numpy был преобразован из матрицы (624,27) в матрицу (624,3,9) и так далее.

Я честно думаю, что проблема возникает из-за вычисления размеров ядер и pool_size.

Какие ресурсы я должен читать, чтобы получить входные данные в формате, который допустит сеть y?

Большое спасибо!

 from numpy import mean
from numpy import std
from numpy import dstack
from pandas import read_csv
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers import Dropout
from keras.layers.convolutional import Conv1D
from keras.layers.convolutional import MaxPooling1D
from keras.utils import to_categorical
from keras import layers
import numpy as np
import matplotlib.pyplot as plt

f=open('data/data_shuffled.csv')
data=f.read()
f.close()
lines=data.split('n')
header=lines[0].split(',')
lines=lines[1:625]
train_x=np.zeros(((len(lines)),len(header)))
for i, line in enumerate(lines):
    values=[float(x) for x in line.split(',')[0:]]
    train_x[i,:]=values

f=open('data/labels_shuffled.csv')
data=f.read()
f.close()
lines=data.split('n')
header=lines[0].split(',')
lines=lines[1:625]
train_y=np.zeros(((len(lines)),len(header)))
for i, line in enumerate(lines):
    values=[float(x) for x in line.split(',')[0:]]
    train_y[i,:]=values


f=open('data/data_shuffled.csv')
data=f.read()
f.close()
lines=data.split('n')
header=lines[0].split(',')
lines=lines[626:776]
test_x=np.zeros(((len(lines)),len(header)))
for i, line in enumerate(lines):
    values=[float(x) for x in line.split(',')[0:]]
    test_x[i,:]=values


f=open('data/labels_shuffled.csv')
data=f.read()
f.close()
lines=data.split('n')
header=lines[0].split(',')
lines=lines[626:776]
test_y=np.zeros(((len(lines)),len(header)))
for i, line in enumerate(lines):
    values=[float(x) for x in line.split(',')[0:]]
    test_y[i,:]=values

#reshaping data to have samples.
train_x=train_x.reshape(624,3,9)
test_x=test_x.reshape(150,3,9)


#one hot encoding
train_y=to_categorical(train_y)
test_y=to_categorical(test_y)



verbose, epochs, batch_size = 0, 10000, 32
n_timesteps, n_features, n_outputs = train_x.shape[1], train_x.shape[2], train_y.shape[1]
model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu',input_shape=(n_timesteps,n_features)))
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.summary()
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# fit network
history=model.fit(train_x, train_y, epochs=epochs, batch_size=batch_size, verbose=verbose)
model.evaluate(test_x, test_y, batch_size=batch_size, verbose=1)
  

Просто нужно получить прогноз модели, либо 1, либо 0.

Пожалуйста, помогите,

Ответ №1:

Каждый из ваших входных размеров равен всего (3,9), и после двух фильтров Conv1D размер каждого фильтра будет (1,1), точно так же, как указано в ошибке, поэтому MaxPooling1D размера 2 здесь не будет работать.

Одним из решений, вероятно, является удаление pool_size=2 из максимального пула, поскольку размер вашего объекта уже является одним значением (т. Е. Вы можете рассматривать его как результат максимального пула и двигаться вперед).

Комментарии:

1. Да, после настройки он работает лучше. Большое спасибо!