Tensorflow中多类别标签机器学习时,遇到标签数量超出范围的问题

      目前题主需要用Python进行机器学习,先通过对大量的图片进行学习,进而达到从新的图片中区分出图片中物品属于哪一类别。
      题主通过网络资料查找,发现了一个案例。案例中需要通过机器学习区分两类物品。 ( 案 例 链 接 ) 于是题主参考了案例中使用的代码。在实际操作中,题主需要区分多种物品的种类(12种),而案例中仅两类,发现直接参考原案例代码会出现报错如下:tensorflow.python.framework.errors_impl.InvalidArgumentError       提示题主所采用的标签数量超过了原有限制。因为初次学习此领域内容,多有不熟悉的地方,希望请教各位高人目前的问题所在和解决的方案。
      题主的代码,解释,以及报错情况如下:
import os
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
import tensorflow as tf
from tensorflow import keras
from sklearn.model_selection import train_test_split
os.system('cls')

filelist_all=[]
for t in range(0,12):
    filedir = 'train/learn/'+str(t)+'/'
    os.listdir(filedir)
    file_list=[]
    for root,dirs,files in os.walk(filedir):
        for f in files:
            if os.path.splitext(f)[1] =='.jpg':
                file_list.append(os.path.join(root,f))
    for filename in file_list:
        try:
            im = Image.open(filename)
            new_im = im.resize((128,128))
            new_im.save('train/learning/'+filename[12:-4]+'.jpg')
        except OSError as e:
            print(e.args)
    filedir = 'train/learning/'+str(t)+'/'
    os.listdir(filedir)
    file_list=[]
    for root,dirs,files in os.walk(filedir):
        for f in files:
            if os.path.splitext(f)[1] =='.jpg':
                file_list.append(os.path.join(root,f))
    filelist_all.append(file_list)
filelist_0 = filelist_all[0]
filelist_1 = filelist_all[1]
filelist_2 = filelist_all[2]
filelist_3 = filelist_all[3]
filelist_4 = filelist_all[4]
filelist_5 = filelist_all[5]
filelist_6 = filelist_all[6]
filelist_7 = filelist_all[7]
filelist_8 = filelist_all[8]
filelist_9 = filelist_all[9]
filelist_10 = filelist_all[10]
filelist_11 = filelist_all[11]
filelist_all = filelist_0 + filelist_1 + filelist_2 + filelist_3 + filelist_4 + filelist_5 + filelist_6 + filelist_7 + filelist_8 + filelist_9 + filelist_10 + filelist_11

M = []
for filename in filelist_all:
    im = Image.open(filename)
    width,height = im.size
    im_L = im.convert("L")
    Core = im_L.getdata()
    arr1 = np.array(Core,dtype='float32')/255.0
    arr1.shape
    list_img = arr1.tolist()
    M.extend(list_img)
X = np.array(M).reshape(len(filelist_all),width,height)
X.shape
class_names = ['ignored_regions','pedestrian','people','bicycle','car','van','truck','tricycle','awning_tricycle','bus','motor','others']

dict_label = {0:'ignored regions',1:'pedestrian',2:'people',3:'bicycle',4:'car',5:'van',6:'truck',7:'tricycle',8:'awning-tricycle',9:'bus',10:'motor',11:'others'}

label = [0]*len(filelist_0) + [1]*len(filelist_1) + [2]*len(filelist_2) + [3]*len(filelist_3) + [4]*len(filelist_4) + [5]*len(filelist_5) + [6]*len(filelist_6) + [7]*len(filelist_7) + [8]*len(filelist_8) + [9]*len(filelist_9) + [10]*len(filelist_10) + [11]*len(filelist_11)
y = np.array(label)

train_images,test_images,train_labels,test_labels = train_test_split(X,y,test_size=0.2,random_state=0)

model = keras.Sequential([keras.layers.Flatten(input_shape=(128,128)),keras.layers.Dense(128,activation=tf.nn.relu),keras.layers.Dense(2,activation=tf.nn.softmax)])
model.compile(optimizer=tf.train.AdamOptimizer(),loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.fit(train_images,train_labels,epochs=5)
test_loss,test_acc = model.evaluate(test_images,test_labels)
print('Test accuracy',test_acc)

input('finish')


      报错内容如下(重点区域已标出):

Tensorflow中多类别标签机器学习时,遇到标签数量超出范围的问题

      题主说明:
            1.题主使用的VSCode。
            2.12类需要被学习的图片已被存在了相对路径上一个叫做learn的文件夹中,以0-11命名子文件夹,各类型的图片储存在其中。程序通过依次检索读取这些图片,并转化成统一像素大小,储存在learning中同样对应存在的0-11这12个文件夹中。裁剪完毕后依次读取,附上对应文件夹所属的标签。再进行后续的机器学习操作。
            3.问题为标签数超过限制,出错内容应该在倒数的几行代码中。
            4.希望得到熟系Tensorflow的高人的指点,感激不尽。

Jason990420
最佳答案

可能,也许是...

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(128,128)), 
    keras.layers.Dense(128, activation=tf.nn.relu), 
    keras.layers.Dense(12, activation=tf.nn.softmax),    # 2 -> 12
])
3年前 评论
Yohel (楼主) 3年前
讨论数量: 1
Jason990420

可能,也许是...

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(128,128)), 
    keras.layers.Dense(128, activation=tf.nn.relu), 
    keras.layers.Dense(12, activation=tf.nn.softmax),    # 2 -> 12
])
3年前 评论
Yohel (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!