Q:ValueError Keras预期conv2d_14_输入具有形状(3,12,1),但获得具有形状(3,12,6500)的数组?

Q:ValueError Keras预期conv2d_14_输入具有形状(3,12,1),但获得具有形状(3,12,6500)的数组?,keras,multidimensional-array,numpy-ndarray,cnn,numpy-slicing,Keras,Multidimensional Array,Numpy Ndarray,Cnn,Numpy Slicing,我正在为窗口10上的Keras 2.1.0中的非图像数据建立CNN 我的输入特征是一个非负数的3x12矩阵,输出是一个长度为6x1的二进制多标签向量 我遇到了这个错误期望conv2d_14_输入具有形状(3,12,1),但得到了具有形状(3,12,6500)的数组 下面是我的代码 import tensorflow as tf from scipy.io import loadmat import numpy as np from tensorflow.keras.layers import B

我正在为窗口10上的Keras 2.1.0中的非图像数据建立CNN

我的输入特征是一个非负数的3x12矩阵,输出是一个长度为6x1的二进制多标签向量

我遇到了这个错误期望conv2d_14_输入具有形状(3,12,1),但得到了具有形状(3,12,6500)的数组

下面是我的代码

import tensorflow as tf
from scipy.io import loadmat
import numpy as np
from tensorflow.keras.layers import BatchNormalization
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation, Dropout
from tensorflow.keras.layers import Conv2D, MaxPool2D, Flatten


reshape_channel_train = loadmat('reshape_channel_train')
reshape_channel_test = loadmat('reshape_channel_test.mat')
reshape_label_train = loadmat('reshape_label_train')
reshape_label_test = loadmat('reshape_label_test')

X_train = reshape_channel_train['store_train']
X_test = reshape_channel_test['store_test']

X_train = np.expand_dims(X_train,axis = 0)
X_test  = np.expand_dims(X_test, axis = 0)

Y_train = reshape_label_train['label_train']
Y_test = reshape_label_test['label_test']

classifier = Sequential()
classifier.add(Conv2D(8, kernel_size=(3,3) , input_shape=(3, 12, 1), padding="same"))
classifier.add(BatchNormalization())
classifier.add(Activation('relu'))

classifier.add(Conv2D(8, kernel_size=(3,3), input_shape=(3, 12, 1), padding="same"))
classifier.add(BatchNormalization())
classifier.add(Activation('relu'))

classifier.add(Flatten())
classifier.add(Dense(8, activation='relu'))
classifier.add(Dense(6, activation='sigmoid'))
classifier.compile(optimizer='nadam', loss='binary_crossentropy', metrics=['accuracy'])

history = classifier.fit(X_train, Y_train, batch_size = 32, epochs=100,
                         validation_data=(X_test, Y_test), verbose=2)
经过一些搜索,我使用了维度扩展技巧,但它似乎不起作用

X_train = np.expand_dims(X_train,axis = 0)
X_test  = np.expand_dims(X_test, axis = 0)
包含6500个训练实例的X_train变量从尺寸为3x12x6500的Matlab.mat文件加载

其中,每个培训实例是一个3x12矩阵

在使用扩展dim技巧之前,第k个训练样本可以由X_-train[:,:,k]和X_-train[:,:,k]调用。形状将返回(3,12)。此外,X_train.shape将返回(3、12、6500)

使用扩展\u dim欺骗命令X\u train[:,:,k]。形状将返回(1,3,6500)

请帮我做这个!
谢谢

您错误地管理了数据。
Conv2D
层接受此格式的数据
(n_样本、高度、宽度、通道)
,在您的情况下(对于您的X_列车)变成
(6500,3,12,1)
。你只需要重新引导到这个案子

# create data as in your matlab data
n_class = 6
n_sample = 6500
X_train = np.random.uniform(0,1, (3,12,n_sample)) # (3,12,n_sample)
Y_train = tf.keras.utils.to_categorical(np.random.randint(0,n_class, n_sample)) # (n_sample, n_classes)

# reshape your data for conv2d
X_train = X_train.transpose(2,0,1) # (n_sample,3,12)
X_train = np.expand_dims(X_train, -1) # (n_sample,3,12,1)

classifier = Sequential()
classifier.add(Conv2D(8, kernel_size=(3,3) , input_shape=(3, 12, 1), padding="same"))
classifier.add(BatchNormalization())
classifier.add(Activation('relu'))

classifier.add(Conv2D(8, kernel_size=(3,3), padding="same"))
classifier.add(BatchNormalization())
classifier.add(Activation('relu'))

classifier.add(Flatten())
classifier.add(Dense(8, activation='relu'))
classifier.add(Dense(n_class, activation='softmax'))
classifier.compile(optimizer='nadam', loss='categorical_crossentropy', metrics=['accuracy'])

history = classifier.fit(X_train, Y_train, batch_size = 32, epochs=2, verbose=2)

# get predictions
pred = np.argmax(classifier.predict(X_train), 1)

我还使用了
softmax
激活和
categorical\u crossentropy
,它更适合于多类问题,但您也可以修改它。记住在测试数据上也应用相同的数据操作

您需要传递data\u format=“channels\u last”参数,bcoz您的通道终于完成了

你可以试试这个:

x_train=x_train.reshape((6500,3,12,1))
x_test=x_test.reshape((-1,3,12,1))


and in each of conv2d layer conv2D(<other args>, data_format="channels_last")
x_列=x_列重塑((6500,3,12,1))
x_测试=x_测试。重塑(-1,3,12,1))
在每个conv2d层conv2d(,data_format=“channels_last”)

噢,非常感谢,实际上我的问题是多标签,而不是多类别。但这是否意味着我应该准备我的数据集,以便表单应该是6500x3x12(正确)而不是3x12x6500(错误)?好的,多类或多标签不重要(您可以相应地修改网络)。是,您的数据必须是(6500x3x12x1)。。。记得像我在代码中做的那样,用展开dims添加最后一个维度。。。别忘了投票并接受它;-)