我有一个y_train
形式的(samples, 9)
数据集。我的X_train
输入形式为(samples, 30, 1)
。
这些通过以下模型运行:
def create_model(input_shape, outputs):
i = Input(shape=input_shape)
x = Dense(256, activation="relu")(i)
x = Dropout(0.5)(x)
x = Dense(128, activation="relu")(x)
x = Dropout(0.5)(x)
x = Dense(64, activation="relu")(x)
x = Dropout(0.5)(x)
x = Flatten()(x)
# Optimize each binary output independently.
o = list(map(lambda _: Dense(1, activation='sigmoid')(x), range(outputs)))
m = Model(i, o)
m.compile('adam', loss='binary_crossentropy', metrics=['accuracy'])
return m
model = create_model((30, 1), 9)
哪个会产生训练错误:
检查模型目标时出错:您所用的Numpy数组列表 传递给您的模型不是模型期望的尺寸。预期 查看9个数组,但得到以下1个数组的列表:
[array([[1., 1., 1., ..., 0., 0., 0.],
[1., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 1., 1., 1.],
[0., 0., 0., ..., 0., 0., 0....
我尝试了y_train
和(9, samples, 1)
的{{1}}形状的变化。 keras如何看待我的(samples, 1, 9)
数组形状转换?
答案 0 :(得分:1)
您的模型有9个输出层,每个输出层都有二进制交叉熵。因此,您需要将输出作为9个输出的列表传递,其中每个输出是(samples, 1)
大小的数组,而不是9列的单个数组。
因此,您需要执行以下操作。
# Assuming your y_train is of size (samples, 9)
y_train_list = np.split(y_train, y_train.shape[1], axis=1)
model.fit(x_train, y_train_list)
这是一个包含玩具数据的可行示例
x_train = np.random.normal(size=(500,30,1))
y_train = np.random.choice([0,1], size=(500, 9))
y_train_list = np.split(y_train, y_train.shape[1], axis=1)
model.fit(X_tr, y_train_list)
from sklearn.model_selection import train_test_split
tr_x, ts_x, tr_y, ts_y =train_test_split(X_tr, Y_tr, test_size=0.33)
tr_list_y = np.split(tr_y, tr_y.shape[1], axis=1)
ts_list_y = np.split(ts_y, ts_y.shape[1], axis=1)
model.fit(tr_x, tr_list_y, validation_data=(ts_x, ts_list_y))