请帮助下面的代码片段,错误似乎与输出的形状有关,但我不确定应该更改什么,我的输入是X并且训练数据的标签是y(参见代码)
def model(load, shape, checkpoint=None):
"""Return a model from file or to train on."""
if load and checkpoint: return load_model(checkpoint)
conv_layers, dense_layers = [32, 32, 64, 128], [1024, 512]
model = Sequential()
model.add(Convolution2D(32, 3, 3, activation='elu', input_shape=shape))
model.add(MaxPooling2D())
for cl in conv_layers:
model.add(Convolution2D(cl, 3, 3, activation='elu'))
model.add(MaxPooling2D())
model.add(Flatten())
for dl in dense_layers:
model.add(Dense(dl, activation='elu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='linear'))
model.compile(loss='mse', optimizer="adam")
return model
net = model(load=False, shape=(100, 100, 3))
X = ['/path/to/img/file',...]
y = [[1.2, 4.5],[<num1>,[num2>]]]
net.fit_generator(_generator(256, X, y), samples_per_epoch=1000, nb_epoch=2)
导致以下错误:
net.fit_generator(_generator(256, X, y), samples_per_epoch=1000, nb_epoch=2)
ValueError: Error when checking target: expected dense_3 to have shape (None, 1) but got array with shape (256, 2)
答案 0 :(得分:0)
好像你想做二进制分类。标记的数据具有形状(batch_size,2)。我认为总是0,1或1,0取决于哪个类是正确的。但是你的模型只有一个输出。如果你使用均方阵列,你的模型需要与标签中最后一个维度一样多的输出神经元=&gt; 2。 您现在可以将标签数据转换为某种形状(batch_size,1)(或仅限(batch_size)我不确定)或者增加输出层中的神经元数量。
另外,如果我是对的,你想进行二元分类,使用二进制交叉熵作为损失函数。
答案 1 :(得分:0)
如果y
的格式为[[1.2, 4.5], ...]
,则可以使用(而不是您当前定义的最后一个图层):
model.add(Dense(2, activation='linear'))
如果y
的格式为[1.2, 3.4, ...]
或[[1.2], [3.4], ...]
,则可以使用您拥有的图层:
model.add(Dense(1, activation='linear'))