Python keras CNN具有低精度和恒定精度

Python keras CNN具有低精度和恒定精度,python,machine-learning,tensorflow,deep-learning,keras,Python,Machine Learning,Tensorflow,Deep Learning,Keras,我正在处理街景房号识别问题。我正试图和凯拉斯一起训练CNN 下面是我如何准备输入的 from PIL import Image from PIL import ImageFilter train_folders = 'sv_train/train' test_folders = 'test' extra_folders = 'extra' SV_IMG_SIZE = 28 SV_CHANNELS = 1 train_imsize = np.ndarray([len(train_data),2])

我正在处理街景房号识别问题。我正试图和凯拉斯一起训练CNN

下面是我如何准备输入的

from PIL import Image
from PIL import ImageFilter
train_folders = 'sv_train/train'
test_folders = 'test'
extra_folders = 'extra'
SV_IMG_SIZE = 28
SV_CHANNELS = 1
train_imsize = np.ndarray([len(train_data),2])
k = 500
sv_images = []
max_images = 20000#len(train_data)
max_digits = 5
sv_labels = np.ones([max_images, max_digits], dtype=int) * 10 # init to 10 cause it would be no digit
nboxes = [[] for i in range(max_images)]
print ("%d to load" % len(train_data))
def getBBox(i,perc):
    '''
    Given i, the desired i.png, returns
    x_min, y_min, x_max, y_max,
    the four numbers which define the small rectangular bounding
    box that contains all individual character bounding boxes
    '''
    boxes = train_data[i]['boxes'] 
    x_min=9990
    y_min=9990
    x_max=0
    y_max=0
    for bid,b in enumerate(boxes):
        x_min = b['left'] if b['left'] <= x_min else x_min
        y_min = b['top'] if b['top'] <= y_min else y_min
        x_max = b['left']+b['width'] if  b['left']+b['width'] >= x_max else x_max
        y_max = b['top']+b['height'] if b['top']+b['height'] >= y_max else y_max

    dy = y_max-y_min
    dx = x_max-x_min
    dpy = dy*perc
    dpx = dx*perc
    nboxes[i]=[dpx,dpy,dx,dy]
    return x_min-dpx, y_min-dpy, x_max+dpx, y_max+dpy

for i in range(max_images):
    print (" \r%d" % i ,end="")
    filename = train_data[i]['filename']
    fullname = os.path.join(train_folders, filename)
    boxes = train_data[i]['boxes']
    label = [10,10,10,10,10]
    lb = len(boxes)
    if lb <= max_digits:
        im = Image.open(fullname)
        x_min, y_min, x_max, y_max = getBBox(i,0.3)
        im = im.crop([x_min,y_min,x_max,y_max])
        owidth, oheight = im.size
        wr = SV_IMG_SIZE/float(owidth)
        hr = SV_IMG_SIZE/float(oheight)
        for bid,box in  enumerate(boxes):
            sv_labels[i][max_digits-lb+bid] = int(box['label'])

        box = nboxes[i]
        box[0]*=wr
        box[1]*=wr
        box[2]*=hr
        box[3]*=hr
        im = im.resize((SV_IMG_SIZE,SV_IMG_SIZE),Image.ANTIALIAS)
        img = img - np.mean(img)
        im = im.filter(ImageFilter.EDGE_ENHANCE)
        img = img - np.mean(img)

        array = np.asarray(im)
        array =  array.reshape((SV_IMG_SIZE,SV_IMG_SIZE,3)).astype(np.float32)
        na = np.zeros([SV_IMG_SIZE,SV_IMG_SIZE],dtype=int)
        for x in range (array.shape[0]):
            for y in range (array.shape[1]):
                na[x][y]=np.average(array[x][y][:])
        na = na.reshape(SV_IMG_SIZE,SV_IMG_SIZE,1)
        #print(array.shape)
        sv_images.append(na.astype(np.float32))

sv_train, sv_validation, svt_labels, svv_labels = train_test_split(sv_images, sv_labels, test_size=0.33, random_state=42)
问题是我得到的精度非常低,在每个历元都保持相同的值

培训13400个样本,验证6600个样本 纪元1/10 13400/13400 [==============================]7.787-7-787-787-787-787-787-787-787-787-787-787-787-787-787-787-787-787-787-787-787-787-787-787-787-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-10-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7 0.7131-瓦卢密集度瓦卢742瓦卢损耗:4.8721-瓦卢密集度瓦卢743瓦卢损耗:14.8091-瓦卢密集度瓦卢744瓦卢损耗:14.3769-瓦卢密集度瓦卢740瓦卢acc:0.9997-瓦卢密集度瓦卢741瓦卢acc:0.9558-瓦卢密集度瓦卢742瓦卢acc:0.6977-瓦卢密集度瓦卢743瓦卢acc:0.0812-瓦卢密集度瓦卢744瓦卢acc:0.1080 纪元2/10
13400/13400 [==============================]70年代-70年代-70年代-70年代-70年代-70年代-70年代-70年代-70年代-70年代-70年代-70年代-70年代-70年代-70年代-70年代-70年代-70年代-70年代-损失:损失:34.7032-高密度的,7.7032-高密度的,7.7032-高密度的,74年-高密度的,741年:损失:损失:损失:0.6760-0.6760-高密度的,密度的,742年-高密度的,损失:损失:损失:损失:4.786年:4.7861-4.7861-高密度的,高密度的,损失:4.7861-高密度的,743年-高密度的,损失:损失:4.7861-高密度的,损失:损失:4.7861-高密度的,损失:损失:4.7861-高密度的,损失:损失:损失:损失:损失:4年-高密度的,损失:损失:0.7131-val_dense_742_损耗:4.8721-val_dense_743_损耗:14.8091-val_dense_744_损耗:14.3769-val_dense_740_acc:0.9997-val_dense_741_acc:0.9558-val_dense_742_acc:0.6977-val dense_743_acc:0.0812-val_dense_744_acc:0.1080

根据您的模型设置adam的学习速率。您可以使用以下命令自己实例化优化器(),而不是使用默认adam:

from keras.optimizers import Adam
adam = Adam(lr=0.1)

这看起来很有希望,因为你的损失实际上在减少,只是幅度很小。

我不知道问题是什么,你的损失在减少。在这个过程中,准确度只能在很晚的时候开始改变,你的优化发生在损失上。 也可能是您的数据集有偏差,您是否在每个类中都有相同数量的样本

from keras.optimizers import Adam
adam = Adam(lr=0.1)