这是一个简单的神经网络,包含3个输入值和3个输出值。
错误:
ValueError: Error when checking model target: expected dense_78 to have shape (None, 3) but got array with shape (3, 1)
执行此网络时抛出。我设置的最后一层有3个可能的输出,与标签数量匹配:
model.add(Dense(3, activation='softmax'))
我没有正确构建此网络,我的错误在哪里?
data = ([[ 0.29365378],
[ 0.27958957],
[ 0.27946938]])
labels = [[1], [2], [3]]
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD
model.add(Dense(64, activation='relu', input_dim=1))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(3, activation='softmax'))
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy'])
model.fit(data, labels,
epochs=20,
batch_size=32)
答案 0 :(得分:2)
Dense(3...)
会为您提供三个输出每个样本。
Dense(3...)
的输出具有形状(BatchSize,3)或(None,3)
,正如Keras所说。
如果您想要每个样本的3个可能类别中的一个,那么您必须具有labels
形状(BatchSize,3)。在您的情况下,批量大小似乎也是3.
您必须在one-hot
向量中格式化标签:
keras.utils中的to_categorical可以帮助您将数值类转换为单热矢量类。
如果您有三个样本,则必须将标签设置为:
labels = [[1,0,0],[0,1,0],[0,0,1]]
三个样本,每个样本有三个可能的类,第一个样本类1,第二个样本类2和第三个样本类3。
这个形状(3,3)与Dense(3...)
所要求的(无,3)相匹配。