Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在CNN模型中匹配预期的输入形状和阵列形状?_Python_Tensorflow_Keras_Conv Neural Network - Fatal编程技术网

Python 如何在CNN模型中匹配预期的输入形状和阵列形状?

Python 如何在CNN模型中匹配预期的输入形状和阵列形状?,python,tensorflow,keras,conv-neural-network,Python,Tensorflow,Keras,Conv Neural Network,我正在尝试用CNN对生物数据(EEG数据)进行分类。但是,在导入数据并将其拆分为train/test/dev集并构建CNN之后,我无法获得与预期阵列形状匹配的输入阵列形状 注:数据包含研究中每个参与者(ID)的5个试验/样本,因此GSS用于确保每个参与者的数据不是混合训练集和测试集 代码和错误如下所示: #Load Data def load_all_data(filename): import numpy as np a = np.load(filename) d

我正在尝试用CNN对生物数据(EEG数据)进行分类。但是,在导入数据并将其拆分为train/test/dev集并构建CNN之后,我无法获得与预期阵列形状匹配的输入阵列形状

注:数据包含研究中每个参与者(ID)的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)

看起来您的模型预期为11459,大小为X(在第1层上方),您将通过X#U列车2,该列车有9065。我还怀疑你构建数据的方式是错误的。在三维空间中,我们通常把输入的形状设为(n,m,3)60,这在我看来是错误的。但是是什么导致X_列2显示9065呢?它实际上是在每次我重新运行代码时更改数组中第一个数字的值,但仅更改第一个值。我怀疑这是集体洗牌的结果?对吗?