【发布时间】:2020-06-10 23:47:47
【问题描述】:
我有一个非常简单的图像分类器,它最终将成为更大系统的一部分。它以 39 x 39 像素数据的 6 个通道作为输入,并将其分类为有效或无效(1.0 或 0.0)。
由于某些原因,我似乎无法确定第一个时期的准确度是所有时期的准确度。该模型似乎没有修改它的权重...
模型的代码如下。 imgdata 是一个 n * 39,39,6 的 numpy 数组,而 knownsso 是一个 n 1 或 0 个值的 numpy 数组。
imgtrain,imgtest,nametrain,nametest,knowntrain,knowntest =
train_test_split(imgdata,names,knownsso,test_size=0.3, random_state=42)
imgtrain=tf.cast(np.array(imgtrain),tf.float32)
knowntrain=tf.cast(np.array(knowntrain),tf.float32)
imgtest =tf.cast(np.array(imgtest ),tf.float32)
knowntest =tf.cast(np.array(knowntest ),tf.float32)
inputImg = tf.keras.Input(shape=(39,39,6))
x = tf.keras.layers.Conv2D(32,(3,3), activation='relu')(inputImg)
x = tf.keras.layers.MaxPooling2D((2,2))(x)
x = tf.keras.layers.Flatten()(x)
x = tf.keras.layers.Dense(32, activation=tf.nn.relu)(x)
x = tf.keras.layers.Dense(2, activation=tf.nn.softmax)(x)
model = tf.keras.Model(inputs=inputImg,outputs=x)
model.compile(optimizer = tf.optimizers.Adam(),
loss = 'sparse_categorical_crossentropy',
metrics=['accuracy'])
history = model.fit(imgtrain,knowntrain,epochs=5,validation_data=(imgtest,knowntest))
print(history.history)
我稍微简化了模型,使其对人眼更加友好,但其行为与额外 dropout、dense、maxpool 和 conv2d 层的加减一致。我也尝试过更改学习率,但结果仍然完全相同。
我尝试运行的每个版本都会生成相同的历史记录,但在不同时期的准确性都不会改变:
{'loss': [nan, nan, nan, nan, nan], 'accuracy': [0.75873935, 0.75873935, 0.75873935, 0.75873935, 0.75873935], 'val_loss': [nan, nan, nan, nan, nan], 'val_accuracy': [0.77059567, 0.77059567, 0.77059567, 0.77059567, 0.77059567]}
我可以说任何问题都非常简单,但我不知道应该尝试什么来解决这个问题。
【问题讨论】:
-
我不认为这应该是问题,但是如果您使用
sparse_categorical_crossentropy,您的标签(known*值)不应该是整数吗?同样,相应的指标应该是sparse_categorical_accuracy,尽管我不确定 Keras 是否能够自动检测到它应该使用该指标作为accuracy给定数据的形状。 -
这可能与您的 imgdata 有关。检查范围,您是否应用了标准化?数据中有
nan吗?我无法重现您的代码 + 虚拟数据的任何问题。 -
@ZabirAlNazi 我只是尝试添加归一化层,没有任何变化。有没有什么地方可以读到关于如何最好地规范化我的数据以获得 CNN 的良好行为?
-
@jdehesa 我将它们切换到 int8 并更改了准确度指标。没有变化。感谢您的想法。
标签: python tensorflow keras