Keras 的神经网络 ValueError
Neural network ValueError with Keras
我必须用 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重新设计时做错了。
感谢您的提示或其他...
看起来你混淆了目标和你的损失函数。我猜您的目标是 class y = [3, 5, 6, ...]
的整数标签,您最多有 12 个 class。在这种情况下,您的损失应该是 sparse_categorical_crossentropy
,因为您想要预测 12 个互斥 classes 中的 1 个。
错误表明您正在输出超过 12 classes 的分布,但给出了一个目标。像 out = [0.2, 0.5, 0.1, ...]
和 y = [2]
这样的东西是 (12,) 和 (1,) 之间的形状不匹配。稀疏分类将目标标签转换为单热向量,因此它变为 y = [0,0,1,0,...]
我必须用 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重新设计时做错了。
感谢您的提示或其他...
看起来你混淆了目标和你的损失函数。我猜您的目标是 class y = [3, 5, 6, ...]
的整数标签,您最多有 12 个 class。在这种情况下,您的损失应该是 sparse_categorical_crossentropy
,因为您想要预测 12 个互斥 classes 中的 1 个。
错误表明您正在输出超过 12 classes 的分布,但给出了一个目标。像 out = [0.2, 0.5, 0.1, ...]
和 y = [2]
这样的东西是 (12,) 和 (1,) 之间的形状不匹配。稀疏分类将目标标签转换为单热向量,因此它变为 y = [0,0,1,0,...]