Keras输入中的维数不正确

时间:2018-05-17 02:44:33

标签: python tensorflow keras

我试图按照我所想的是第5或第6个关于keras的简单入门教程,几乎从不完全工作。 剥离所有内容,我似乎遇到了输入格式的问题。我读了一组图像,并提取两种类型,手语图像和手语零图像。然后我设置一个1和0的数组来对应图像的实际内容,然后确定大小和类型。

import numpy as np 
from subprocess import check_output

print(check_output(["ls", "../data/keras/"]).decode("utf8"))
## load dataset of images of sign language numbers
x = np.load('../data/keras/npy_dataset/X.npy')
# Get the zeros and ones, construct a list of known values (Y)
X = np.concatenate((x[204:409], x[822:1027] ), axis=0) # from 0 to 204 is zero sign and from 205 to 410 is one sign 
Y = np.concatenate((np.zeros(205), np.ones(205)), axis=0).reshape(X.shape[0],1)

# test shape and type
print("X shape: " , X.shape)
print("X class: " , type(X))
print("Y shape: " , Y.shape)
print("Y type: " , type(Y))

这给了我:

X shape:  (410, 64, 64)
X class:  <class 'numpy.ndarray'>
Y shape:  (410, 1)
Y type:  <class 'numpy.ndarray'>

这一切都很好。然后我使用Tensorflow作为后端从Keras加载相关位,并尝试构造分类器。

# get the relevant keras bits. 
from keras.models import Sequential
from keras.layers import Convolution2D 
# construct a classifier

classifier = Sequential() # initialize neural network
classifier.add(Convolution2D(32, (3, 3), input_shape=(410, 64, 64), activation="relu", data_format="channels_last"))
classifier.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])

classifier.fit(X, Y, batch_size=32, epochs=10, verbose=1)

这导致:

ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (410, 64, 64)

我认为这个SO question表明我的输入形状需要改变才能添加第四个维度 - 虽然它也说它是需要改变的输出形状,我没有& #39;能够找到指定输出形状的任何地方,所以我假设它是指我应该将输入形状改为input_shape =(1,64,64,1)。 如果我改变了我的输入形状,那么我立即得到这个:

ValueError: Input 0 is incompatible with layer conv2d_1: expected ndim=4, found ndim=5

哪个this github问题表明是因为我不再需要指定样本数量。所以我离开了使用一个输入形状并获得一个错误,或者更改它并获得另一个错误的情况。 阅读thisthis让我觉得我可能需要重塑我的数据以包含有关X中频道的信息,但如果我添加

X = X.reshape(X.shape[0], 64, 64, 1)
print(X.shape)

然后我得到

ValueError: Error when checking target: expected conv2d_1 to have 4 dimensions, but got array with shape (410, 1)

如果我将重塑改为其他任何东西,即

X = X.reshape(X.shape[0], 64, 64, 2)

然后我收到一条消息,说它无法重塑数据,所以我显然做错了,如果那确实是问题。

我已经阅读了建议的Conv2d docs,这对我来说完全不了解问题。还有其他人能够吗?

1 个答案:

答案 0 :(得分:0)

起初我使用了以下数据集(与您的情况类似):

import numpy as np
import keras

X = np.random.randint(256, size=(410, 64, 64))
Y = np.random.randint(10, size=(410, 1))
x_train = X[:, :, :, np.newaxis]
y_train = keras.utils.to_categorical(Y, num_classes=10)

然后修改你的代码如下工作:

from keras.models import Sequential
from keras.layers import Convolution2D, Flatten, Dense 

classifier = Sequential() # initialize neural network
classifier.add(Convolution2D(32, (3, 3), input_shape=(64, 64, 1), activation="relu", data_format="channels_last"))
classifier.add(Flatten())
classifier.add(Dense(10, activation='softmax'))
classifier.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])
classifier.fit(x_train, y_train, batch_size=32, epochs=10, verbose=1)
  1. X的形状从410 x 64 x 64更改为410 x 64 x 64 x 1(通道1)。

  2. input_shape是示例数据的形状,即64 x 64 x 1

  3. 使用Y(带keras.utils.to_categorical()的单热编码)更改num_classes=10的形状。

  4. 在编译之前,Flatten()Dense()已应用,因为您需要categorical_crossentropy