【问题标题】:Neural network ValueError with KerasKeras 的神经网络 ValueError
【发布时间】:2018-05-28 07:58:47
【问题描述】:

我必须用 keras 训练一个神经网络。为此,我使用了一些具有以下形状的测试数据:

 print("     Training data: {}".format(x_Train.shape))
 print("     Training data: {}".format(y_Train.shape))
 print("     Test data: {}".format(x_Test.shape))
 print("     Test data: {}".format(y_Test.shape))

 ....

 Training data: (128, 90, 561)
 Training data: (128,)
 Test data: (43, 90, 561)
 Test data: (43,)

还有这个网络架构:

class NeuralNetwork:
@staticmethod
def Build(Width, Depth, Classes, Drop = 0.5):
    Model = Sequential()
    Model.add(Conv1D(filters = 32, 
                    kernel_size = 5,
                    input_shape = (Width, Depth)
    ))

    Model.add(Activation("relu"))
    Model.add(MaxPooling1D(pool_size = 2,
                            strides = 2
    ))

    Model.add(Conv1D(filters = 64, 
                    kernel_size = 3
    ))
    Model.add(Activation("relu"))
    Model.add(MaxPooling1D(pool_size = 2,
                            strides = 2
    ))

    Model.add(Flatten())
    Model.add(Dense(1024))
    Model.add(Dropout(Drop))
    Model.add(Dense(Classes))
    Model.add(Activation("softmax"))

    return Model

但是当我尝试训练我的模型时,我遇到了这个错误:

ValueError: Error when checking target: expected activation_3 to have shape (12,) but got array with shape (1,)

我使用这段代码进行训练:

print("[INFO] Train model...")
self.__Model = NeuralNetwork.Build(90, 561, 12)
plot_model(self.__Model, show_layer_names = True, show_shapes = True)
self.__Model.compile(loss = "binary_crossentropy", optimizer  = Adam(lr = self.__Learnrate), metrics = ["accuracy"])
self.__Model.fit(x_Train, 
                    y_Train, 
                    validation_data = (x_Test, y_Test), 
                    batch_size = self.__BatchSize,
                    epochs = self.__Epochs, 
                    verbose = 1
)

而且我没有得到这个错误的来源。我用 tensorflow 测试了整个代码,它工作正常。但是我在用 keras 重新设计时做错了。

感谢您的提示或其他...

【问题讨论】:

    标签: python-3.x keras convolutional-neural-network


    【解决方案1】:

    您似乎混淆了目标和损失函数。我猜你的目标是你的班级y = [3, 5, 6, ...] 的整数标签,你最多有 12 个班级。在这种情况下,您的损失应该是sparse_categorical_crossentropy,因为您想预测 12 个互斥类中的 1 个。

    错误表明您正在输出超过 12 个类的分布,但给出了一个目标。 out = [0.2, 0.5, 0.1, ...]y = [2] 之类的东西是 (12,) 和 (1,) 之间的形状不匹配。 Sparse categorical 将您的目标标签转换为 one-hot 向量,因此它变为 y = [0,0,1,0,...]

    【讨论】:

    • 好的,谢谢。损失函数会产生误差。将其更改为交叉熵后,训练成功。最后我发现了我的错误。我使用了 sklearn 的 LabelEncoder 而不是 LabelBinarizer。所以我没有得到 one-hot 向量....
    猜你喜欢
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2017-03-17
    • 2020-02-25
    • 2018-10-10
    • 2021-09-22
    相关资源
    最近更新 更多