如何在CNN模型中将预期的输入形状与数组形状匹配?

时间:2018-08-24 04:14:03

标签: python tensorflow keras conv-neural-network

我正在尝试使用CNN对生物数据(EEG数据)进行分类。但是,在将数据导入并拆分为训练/测试/开发集并构建CNN之后,我无法获得输入数组形状以匹配预期的数组形状。

注意:数据包含研究中每个参与者的5个试验/样本,因此使用GSS来确保每个参与者的数据都不是训练和测试集的混合。

代码和错误如下:

 #Load Data
def load_all_data(filename):
    import numpy as np

    a = np.load(filename)
    d = (dict(zip(("data1{}".format(k) for k in a), (a[k] for k in a))))

    return d

filename = ("dataname.npz") 
X = load_all_data(filename)['array_0']
y = load_all_data(filename)['array_1']

IDs = load_all_data(filename)['array_2']   

#Split Test Data with Groupshuffle Split
from  sklearn.model_selection import GroupShuffleSplit
import numpy as np
test_size = 0.2
gss = GroupShuffleSplit(n_splits = 1, test_size = 0.2)

for train,test in gss.split(X, y, IDs):
    X_train = X[train]
    y_train = y[train]
    IDs_train = IDs[train]

    X_test = X[test]
    y_test = y[test]
    IDs_test = IDs[test]

fileoutname = 'train_test_data'
np.savez(fileoutname,X_train, y_train, X_test, y_test,IDs_train,IDs_test)

#Split Train, Test Data
gss = GroupShuffleSplit(1, test_size)

for train,test in gss.split(X, y, IDs):
    X_train2 = X[train]
    y_train2 = y[train]
    IDs_train = IDs[train]

    X_dev = X[test]
    y_dev = y[test]
    IDs_test = IDs[test]

#Add dimension to X and Convert y to Categorical
X_train2 = np.expand_dims(X_train2,axis=0)
y_train2 = keras.utils.to_categorical(y_train2,num_classes=2)
X_dev = np.expand_dims(X_test,axis=0)
y_dev = keras.utils.to_categorical(y_test,num_classes=2)
X = np.expand_dims(X,axis=0)

#Build the CNN
def  simpleCNN(self, units = 10):

    import keras
    from keras.layers import Dense
    from keras.layers import Conv2D
    from keras.layers import Flatten
    from keras.models import Model, Input

    inp =  Input(shape = self.shape[1:], name='inp')
   #layer 1
    x = Conv2D(units, kernel_size=(1,1), strides = (1,1), activation='relu', data_format='channels_last')(inp)  
    #layer 2
    x = Conv2D(units, kernel_size=(2,2), strides = (1,1), activation='relu', data_format='channels_last')(x)  
    #layer 3 
    x = Flatten()(x)
   #layer4
    out = Dense(2, activation='softmax',name='out')(x)

    model = Model(inputs = inp, outputs = out)

    return model

#Fit the Data
model = simpleCNN(X)
from keras.optimizers import Adamax
adamax = Adamax(lr=3e-4, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0); #3e-4; 2e-3 is a default.
model.compile(optimizer=adamax, loss='categorical_crossentropy', metrics=['acc'])
model.fit(X_train2, y_train2, epochs=20, batch_size=32, verbose = 1, validation_data = (X_dev, y_dev))


ValueError: Error when checking input: expected inp to have shape (11459, 26, 60) but got array with shape (9065, 26, 60)

0 个答案:

没有答案