我试图按照我所想的是第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问题表明是因为我不再需要指定样本数量。所以我离开了使用一个输入形状并获得一个错误,或者更改它并获得另一个错误的情况。 阅读this和this让我觉得我可能需要重塑我的数据以包含有关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,这对我来说完全不了解问题。还有其他人能够吗?
答案 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)
将X
的形状从410 x 64 x 64
更改为410 x 64 x 64 x 1
(通道1)。
input_shape
是示例数据的形状,即64 x 64 x 1
。
使用Y
(带keras.utils.to_categorical()
的单热编码)更改num_classes=10
的形状。
在编译之前,Flatten()
和Dense()
已应用,因为您需要categorical_crossentropy
。