python - Keras - 没有 ImageDataGenerator 的单像素分类

标签 python tensorflow neural-network keras computer-vision

这是一个新手问题,但我就是无法获得最简单的Keras实验工作。我参加了一个类(class),它的示例运行良好,所以我的计算机设置正确。

我有几千张 16x12 的图片,名为“GGYRBGBBW.png”、“BBYWBRBBB.png”等。图像具有单一颜色,阴影差异最小,并且在加载时减少为单个像素。文件名的第一个字符用作训练标签(例如,绿色图像的名称以“G”开头)。我需要构建和训练一个简单的模型来指示图像中 6 种可能颜色中的一种。 (这是迈向更复杂项目的第一个学习步骤)。

我不想使用 ImageDataGenerator,因为整个项目将超出简单的目录结构分类所能完成的范围,我将使用我自己的外部图像生成器进行图像随机化。

我创建了一个如下所示的 Keras 模型:

_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
flatten_1 (Flatten)          (None, 3)                 0
_________________________________________________________________
dense_1 (Dense)              (None, 6)                 24
=================================================================
Total params: 24
Trainable params: 24
Non-trainable params: 0

所以,非常简单 - 输入形状只有三个值 (RGB),展平,然后每个颜色类别有 6 个输出神经元。

在运行实验时,从随机初始值开始,准确性非常低,有时为 0。

210/210 [==============================] - 0s 2ms/step - loss: 7.2430 - acc: 0.2095 - val_loss: 6.7980 - val_acc: 0.2000
Epoch 2/50
210/210 [==============================] - 0s 10us/step - loss: 7.2411 - acc: 0.2095 - val_loss: 9.6617 - val_acc: 0.2000
Epoch 3/50
210/210 [==============================] - 0s 5us/step - loss: 9.9256 - acc: 0.2095 - val_loss: 9.6598 - val_acc: 0.2000
Epoch 4/50
210/210 [==============================] - 0s 5us/step - loss: 9.9236 - acc: 0.2095 - val_loss: 9.6579 - val_acc: 0.2000
Epoch 5/50
210/210 [==============================] - 0s 10us/step - loss: 9.9217 - acc: 0.2095 - val_loss: 9.6560 - val_acc: 0.2000
Epoch 6/50
210/210 [==============================] - 0s 10us/step - loss: 9.9197 - acc: 0.2095 - val_loss: 9.6541 - val_acc: 0.2000

我一定是遗漏了一些微不足道的东西,但由于我是这方面的菜鸟,所以我不知道是什么。这是完整的源代码:

from __future__ import print_function

import random
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
os.system('cls')

import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras import backend as K
from  keras.preprocessing.image import img_to_array
import numpy as np

num_classes = 6
batch_size = 300
epochs = 50
Image_width, Image_height = 1, 1
train_dir = './OneColorTrainingData'
colors="WYBGRO"


def load(numOfPics):
    X = []
    y = []
    print("Reading training images")
    allFiles = os.listdir(train_dir)
    randomFiles = random.choices(allFiles, k=numOfPics)

    for f in randomFiles:
        path = os.path.join(train_dir, f)
        img = keras.preprocessing.image.load_img(path, grayscale=False, target_size=(Image_width, Image_width))
        img = img_to_array(img)
        img /= 255
        X.append(img)
        y.append(colors.index(f[0]))

    y = keras.utils.to_categorical(y, num_classes=num_classes)
    return X, y

Data, labels = load(batch_size)
print(str(len(Data)) + " training files loaded")
print(labels)

model = Sequential()
model.add(Flatten(input_shape=(Image_height, Image_width, 3)))
model.add(Dense(num_classes, activation=K.tanh))

model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adadelta(), metrics=['accuracy'])

print(model.input_shape)
print(model.summary())

hist = model.fit(np.array(Data), np.array(labels), batch_size=batch_size, epochs=epochs, verbose=1, validation_split=0.3)

score = model.evaluate(np.array(Data), np.array(labels), verbose=0)
print('Test loss: ', score[0])
print('Test accuracy: ', score[1])

如有任何帮助,我们将不胜感激。

最佳答案

您将 K.tanh 作为最终的密集层激活。在进行多选一分类时,我们经常使用 softmax 来代替,它会在颜色类别上产生概率分布:

model.add(Dense(num_classes, activation='softmax'))

现在您的目标标签将是单热向量 [0,0,1,0,0,0] 指示它是哪个类。您还可以使用 sparse_categorical_crossentropy 损失并将标签作为类整数 2 作为您的目标。在这种情况下,这意味着同样的事情。

关于python - Keras - 没有 ImageDataGenerator 的单像素分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51422301/

相关文章:

python - 无法使用 sasl python 模块构建 docker 镜像

python 3.5 - 脚本终止后 subprocess.run 仍在运行

python - tf.keras.optimizers.Adam 和其他具有最小化功能的优化器

python - 如何确保 tensorflow 正在使用 GPU

python - Tensorflow tf.layers 密集神经网络函数与类接口(interface)

python - 覆盖rest-auth RegisterSerializer,添加年龄验证

python - python函数中的序列项0错误

python - 文件系统方案 '[local]' 未在 Google Colab TPU 中实现

machine-learning - 当只有一个测试实例时,如何处理机器学习模型部署中的特征扩展情况?

parameters - 训练 VGG-16 需要多少个 epoch