由于目标标签的形状,Keras 不接受目标标签?
Keras does not accept the target label due to its shape?
我正在尝试让 Keras 处理分类问题,该问题有五个分类目标标签(1、2、3、4、5)。出于某种原因,我在使用 StratifiedKFold 时无法让它工作。 X 和 y 是形状分别为 (500, 20) 和 (500, ) 的 NumPy 数组。
错误信息是"ValueError: Error when checking target: expected dense_35 to have shape (1,) but got array with shape (5,)",这让我认为错误肯定出在目标变量的格式上。同样值得注意的是,"dense_35" 中的数字似乎随着每次尝试 运行 代码的尝试而变化。
random_state = 123
n_splits = 10
cv = StratifiedKFold(n_splits=n_splits,
random_state=random_state, shuffle=False)
def baseline_model():
nn_model = Sequential()
nn_model.add(Dense(units=50, input_dim=X.shape[1], init='normal',
activation= 'relu' ))
nn_model.add(Dense(30, init='normal', activation='relu'))
nn_model.add(Dense(10, init='normal', activation='relu'))
nn_model.add(Dense(1, init='normal', activation='softmax'))
nn_model.compile(optimizer='adam', loss='categorical_crossentropy',
metrics = ['accuracy'])
return nn_model
for train, test in cv.split(X, y):
X_train, X_test = X[train], X[test]
y_train, y_test = y[train], y[test]
np_utils.to_categorical(y_train)
np_utils.to_categorical(y_test)
estimator = KerasClassifier(build_fn=baseline_model,
epochs=200, batch_size=5,
verbose=0)
estimator.fit(X_train, y_train)
y_pred = estimator.predict(X_test)
The numpy array (y), that I am trying to split:
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5]
random_state = 123
n_splits = 10
cv = StratifiedKFold(n_splits=n_splits, random_state=random_state, shuffle=False)
def baseline_model():
nn_model = Sequential(name='model_name')
nn_model.add(Dense(units=50, input_dim=X.shape[1], init='normal',
activation= 'relu', name='dense1'))
nn_model.add(Dense(30, init='normal', activation='relu', name='dense2'))
nn_model.add(Dense(10, init='normal', activation='relu', name='dense3'))
# code changed here
nn_model.add(Dense(5, init='normal', activation='softmax', name='dense4'))
nn_model.compile(optimizer='adam', loss='categorical_crossentropy',
metrics = ['accuracy'])
return nn_model
for train, test in cv.split(X, y):
X_train, X_test = X[train], X[test]
y_train, y_test = y[train], y[test]
# the error is due to this step
# you have specified only one output in the last dense layer (dense4)
# but you are giving input of length 5
np_utils.to_categorical(y_train)
np_utils.to_categorical(y_test)
estimator = KerasClassifier(build_fn=baseline_model,
epochs=200, batch_size=5,
verbose=0)
estimator.fit(X_train, y_train)
y_pred = estimator.predict(X_test)
- 通过在层中指定 name 参数,您可以命名层。这样你每次都会得到明确的图层名称,以防出错。
- model.summary() 是另一个有用的函数,您可以使用它检查每一层的输出形状。
由于是分类问题,有五个分类目标标签,所以最后一个密集层(输出层)必须有5个单元:
def baseline_model():
nn_model = Sequential()
nn_model.add(Dense(units=50, input_dim=X.shape[1], init='normal',
activation= 'relu' ))
nn_model.add(Dense(30, init='normal', activation='relu'))
nn_model.add(Dense(10, init='normal', activation='relu'))
#Output layer
nn_model.add(Dense(5, init='normal', activation='softmax'))
nn_model.compile(optimizer='adam', loss='categorical_crossentropy',
metrics = ['accuracy'])
return nn_model
我正在尝试让 Keras 处理分类问题,该问题有五个分类目标标签(1、2、3、4、5)。出于某种原因,我在使用 StratifiedKFold 时无法让它工作。 X 和 y 是形状分别为 (500, 20) 和 (500, ) 的 NumPy 数组。
错误信息是"ValueError: Error when checking target: expected dense_35 to have shape (1,) but got array with shape (5,)",这让我认为错误肯定出在目标变量的格式上。同样值得注意的是,"dense_35" 中的数字似乎随着每次尝试 运行 代码的尝试而变化。
random_state = 123
n_splits = 10
cv = StratifiedKFold(n_splits=n_splits,
random_state=random_state, shuffle=False)
def baseline_model():
nn_model = Sequential()
nn_model.add(Dense(units=50, input_dim=X.shape[1], init='normal',
activation= 'relu' ))
nn_model.add(Dense(30, init='normal', activation='relu'))
nn_model.add(Dense(10, init='normal', activation='relu'))
nn_model.add(Dense(1, init='normal', activation='softmax'))
nn_model.compile(optimizer='adam', loss='categorical_crossentropy',
metrics = ['accuracy'])
return nn_model
for train, test in cv.split(X, y):
X_train, X_test = X[train], X[test]
y_train, y_test = y[train], y[test]
np_utils.to_categorical(y_train)
np_utils.to_categorical(y_test)
estimator = KerasClassifier(build_fn=baseline_model,
epochs=200, batch_size=5,
verbose=0)
estimator.fit(X_train, y_train)
y_pred = estimator.predict(X_test)
The numpy array (y), that I am trying to split:
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5]
random_state = 123
n_splits = 10
cv = StratifiedKFold(n_splits=n_splits, random_state=random_state, shuffle=False)
def baseline_model():
nn_model = Sequential(name='model_name')
nn_model.add(Dense(units=50, input_dim=X.shape[1], init='normal',
activation= 'relu', name='dense1'))
nn_model.add(Dense(30, init='normal', activation='relu', name='dense2'))
nn_model.add(Dense(10, init='normal', activation='relu', name='dense3'))
# code changed here
nn_model.add(Dense(5, init='normal', activation='softmax', name='dense4'))
nn_model.compile(optimizer='adam', loss='categorical_crossentropy',
metrics = ['accuracy'])
return nn_model
for train, test in cv.split(X, y):
X_train, X_test = X[train], X[test]
y_train, y_test = y[train], y[test]
# the error is due to this step
# you have specified only one output in the last dense layer (dense4)
# but you are giving input of length 5
np_utils.to_categorical(y_train)
np_utils.to_categorical(y_test)
estimator = KerasClassifier(build_fn=baseline_model,
epochs=200, batch_size=5,
verbose=0)
estimator.fit(X_train, y_train)
y_pred = estimator.predict(X_test)
- 通过在层中指定 name 参数,您可以命名层。这样你每次都会得到明确的图层名称,以防出错。
- model.summary() 是另一个有用的函数,您可以使用它检查每一层的输出形状。
由于是分类问题,有五个分类目标标签,所以最后一个密集层(输出层)必须有5个单元:
def baseline_model():
nn_model = Sequential()
nn_model.add(Dense(units=50, input_dim=X.shape[1], init='normal',
activation= 'relu' ))
nn_model.add(Dense(30, init='normal', activation='relu'))
nn_model.add(Dense(10, init='normal', activation='relu'))
#Output layer
nn_model.add(Dense(5, init='normal', activation='softmax'))
nn_model.compile(optimizer='adam', loss='categorical_crossentropy',
metrics = ['accuracy'])
return nn_model