我在尝试使用卷积神经网络构建一个Softmax分类器,但总是从keras中得到以下错误:
从1中减去4导致的负维度大小,用于’max_pooling1d_1/MaxPool’(操作:’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)等等。
我真诚地认为问题出在计算卷积核和池化大小上。
我应该阅读哪些资源来将我的输入格式化为网络可以接受的格式?
非常感谢!
from numpy import meanfrom numpy import stdfrom numpy import dstackfrom pandas import read_csvfrom keras.models import Sequentialfrom keras.layers import Densefrom keras.layers import Flattenfrom keras.layers import Dropoutfrom keras.layers.convolutional import Conv1Dfrom keras.layers.convolutional import MaxPooling1Dfrom keras.utils import to_categoricalfrom keras import layersimport numpy as npimport matplotlib.pyplot as pltf=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,:]=valuesf=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,:]=valuesf=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,:]=valuesf=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 encodingtrain_y=to_categorical(train_y)test_y=to_categorical(test_y)verbose, epochs, batch_size = 0, 10000, 32n_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 networkhistory=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即可。
请帮助,
回答:
你的每个输入大小仅为(3,9),经过两次Conv1D过滤器后,每个过滤器的大小将变为(1,1),正如错误中所述,因此大小为2的MaxPooling1D在这里将不起作用。
一种解决方案可能是从最大池化中移除pool_size=2
,因为你的特征大小已经是一个单一值(即,你可以将其视为最大池化的结果并继续前进)。