我试图运行一个人群估计模型,根据图像中有多少人,将图像分为三个不同的大类。1200幅图像用于训练,其中20%用于验证。我使用Youtube上的sentdex教程作为参考,将图像数据加载到模型中;将图像作为压缩文件加载,提取图像,并根据它们所在的文件夹对它们进行分类。
我的问题是,每当我试图训练模型时,我注意到损失和验证损失总是为0,这导致模型没有经过精确的训练,验证的准确性在整个过程中保持不变,如这里所示。我怎样才能让损失真正改变呢?在执行方面,我是否做错了什么?
到目前为止,我尝试的是:
下面是到目前为止我的代码片段,展示了我的模型尝试:
import keras.backend as K
logdir = "logs/scalars/" + datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)
X = X/255.0
model = Sequential()
model.add(Conv2D(64, (3,3), input_shape = X.shape[1:])) #[1:] to skip the -1
model.add(Activation("relu"))
model.add(Conv2D(64, (3,3), input_shape = X.shape[1:])) #[1:] to skip the -1
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(128, (3,3)))
model.add(Activation('relu'))
model.add(Conv2D(128, (3,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(128))
model.add(Activation('relu'))
#fully connected layer
model.add(Dense(1))
model.add(Activation('softmax'))
opt = keras.optimizers.Adam(lr=0.01)
model.compile(loss='categorical_crossentropy',
optimizer = opt,
metrics=['accuracy'])
model.fit(x_train, y_train, batch_size = 100, epochs = 30, validation_data = (x_val, y_val), callbacks=[tensorboard_callback], shuffle=True)完整的代码可以在Colab 这里上找到。
发布于 2021-05-13 19:16:52
最后一层包含一个节点,所以您只输出一个数字。但是,您需要输出3个数字,因为您有3个类。这些输出中的每一个都对应于该特定类的未规范化概率。在softmax之后,得到归一化概率分布。
发布于 2021-05-13 22:29:54
你有三节课。因此,更改代码
model.add(Dense(1))至
model.addDense(3))现在,如果您使用模型对图像进行预测,model.predict将生成一个包含3个概率值的列表。这些概率之和总计为1.0。模型的实际预测是具有最高概率值的列表中的指标。例如,如果model.predict的输出是.1,则为.7。.2 --概率值为.7的指数1是预测类。您的类被索引为0、1、2,因此模型可以预测1类,您可以得到模型输出的预测类。预测用
class_index=np.argmax(model,predict(....))在某些地方,您可能有一个类列表,比如
classes=['less_than 5', 'between 5 and 10', 'more than 10']所以实际预测的类名是
predicted_class=classes[class_index]https://stackoverflow.com/questions/67524639
复制相似问题