【发布时间】:2021-05-13 18:51:17
【问题描述】:
我正在尝试运行一个人群估计模型,该模型根据图像中有多少人将图像分为三个不同的大类。 1200 张图像用于训练,其中 20% 用于验证。我使用sentdex's tutorial on Youtube 作为参考将图像数据加载到模型中;我将图像加载为 zip 文件,将其解压缩并根据它们所在的文件夹对其进行分类。
我的问题是,每当我尝试训练模型时,我注意到损失和验证损失始终为 0,这导致模型没有完全训练并且验证准确度始终保持不变,如 here 所示.我怎样才能让损失真正改变?在实施方面我做错了什么吗?
到目前为止,我尝试的是:
- 我尝试添加第三个卷积层,但收效甚微。
- 我还尝试将最后一个 Dense 层更改为 model.add(Dense(3)),但出现错误提示“形状 (None, 1) 和 (None, 3) 不兼容”
- 我尝试使用较低的学习率 (0.001?),但模型最终返回 0 来表示验证准确度
- 更改优化器似乎没有对我产生任何更改
下面是到目前为止我的代码的 sn-p,显示了我的模型尝试:
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 here 上找到。
【问题讨论】:
-
您不能将 softmax 与单个神经元一起使用,因为这会产生恒定的 1.0 输出,如果您使用二元分类,则需要使用 sigmoid 激活和二元交叉熵损失。
-
另一个问题是您忘记对标签进行一次热编码,这将解决使用 3 个神经元的问题(这是正确的)。
-
非常感谢您的回复!我已经相应地调整了代码,现在损失值出现了!但是,我注意到验证准确度在整个训练过程中保持不变,并且模型似乎根本没有进行太多训练(如果有的话)。我尝试过的包括在不同的优化器之间切换和添加更多层,但无济于事。我可以采取任何可能的选择来尝试提高准确性吗?
标签: tensorflow keras deep-learning conv-neural-network