Как решить проблему установки элемента массива с ошибкой последовательности в модели Keras - PullRequest
1 голос
/ 15 марта 2019

Я пытаюсь обучить эту модель обнаружению и чтению марокканских номерных знаков, но когда

я запускаю файл, я получаю следующую ошибку: ValueError: установка элемента массива с последовательностью

Вот полный код модели:

import numpy as np
import gen
import itertools
import cv2
import itertools

import keras
from keras.callbacks import LearningRateScheduler
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, LSTM, BatchNormalization
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K

import tensorflow as tf

DIGITS = "0123456789"
DIGITS_E = "0 1 2 3 4 5 6 7 8 9"
DIGITS_E1 = "0123456789 "
DIGITS_0 = "123456789"
BARRE = "|"
LETTERS = "\u0648\u0647\u062f\u062c\u0628\u0623"
CHARS = LETTERS + DIGITS + BARRE + DIGITS_E + DIGITS_0 + DIGITS_E1


def diff_letters(a,b):
    return sum ( a[i] != b[i] for i in range(len(a)) )

def unzip(b):
    xs, ys = zip(*b)
    xs = np.array(xs)
    ys = np.array(ys)
    return xs, ys

def code_to_vec(p, code):
    def char_to_vec(c):
        y = np.zeros((len(CHARS),))
        y[CHARS.index(c)] = 1.0
        return y

    c = np.vstack([char_to_vec(c) for c in code])

    return np.concatenate([[1. if p else 0], c.flatten()])

def letter_probs_to_code(letter_probs):
    return "".join(CHARS[i] for i in np.argmax(letter_probs, axis=1))

def read_batches(batch_size):
    g = gen.generate_ims()
    def gen_vecs():
        for im, c, p in itertools.islice(g, batch_size):
            yield im.reshape([1,64,128]), code_to_vec(p, c)
    while True:
        yield unzip(gen_vecs())

class print_codes(keras.callbacks.Callback):      
    def on_epoch_end(self, batch, logs={}):
        cont = 0;
        erros = 0;
        score_results = self.model.predict(val_batch[0])
        real_scores = val_batch[1];
        for i,j in zip(score_results,real_scores):
          probs1 = i[1:].reshape([7,36]);
          probs2 = j[1:].reshape([7,36]);
          code1 = letter_probs_to_code(probs1);
          code2 = letter_probs_to_code(probs2);
          erros = erros + diff_letters(code1,code2);
          cont = cont + 7;        
          #print("{:.2f} - {} <-> {} - {}".format(i[0], code1, j[0], code2));
        print("Acc: {}%".format(100*(cont-erros)/cont));


for x in read_batches(100):
  val_batch = x;
  break;

c_test = print_codes()

def lr_schedule(epoch):
  if (epoch<=10):
    return 1.0*(0.1**int(epoch));
  else:
    return 1.0*(0.1**int(epoch/10))


###########################################################


batch_size = 50
input_shape = (1, 64, 128)
learning_rate = 0.001;
steps_per_epoch = 500;
epochs = 1000;

model = Sequential()
model.add(Conv2D(48, kernel_size=(5, 5), strides=(1, 1), activation='relu', input_shape=input_shape, data_format='channels_first', padding='same'))
model.add(BatchNormalization())
#model.add(Conv2D(48, kernel_size=(5, 5), strides=(1, 1), activation='relu', padding='valid'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
#model.add(Dropout(0.25))

model.add(Conv2D(64, kernel_size=(5, 5), strides=(1, 1), activation='relu', padding='same'))
model.add(BatchNormalization())
#model.add(Conv2D(64, kernel_size=(5, 5), strides=(1, 1), activation='relu', padding='valid'))
model.add(MaxPooling2D(pool_size=(2, 1), strides=(2, 1)))
#model.add(Dropout(0.25))

model.add(Conv2D(128, kernel_size=(5, 5), strides=(1, 1), activation='relu', padding='same'))
model.add(BatchNormalization())
#model.add(Conv2D(128, kernel_size=(5, 5), strides=(1, 1), activation='relu', padding='valid'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
#model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(2048, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(1, activation='sigmoid'))

model.compile(loss=keras.losses.binary_crossentropy,
              optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9),
              metrics=['accuracy'])

model.summary()

model.fit_generator(read_batches(batch_size),steps_per_epoch=steps_per_epoch, callbacks = [c_test], epochs=epochs, verbose=1)

, а вот полное отслеживание ошибки:

    Traceback (most recent call last):
  File "train.py", line 124, in <module>
    model.fit_generator(read_batches(batch_size),steps_per_epoch=steps_per_epoch, callbacks = [c_test], epochs=epochs, verbose=1)
  File "/usr/lib64/python3.6/site-packages/keras/legacy/interfaces.py", line 91, in wrapper
    return func(*args, **kwargs)
  File "/usr/lib64/python3.6/site-packages/keras/engine/training.py", line 1418, in fit_generator
    initial_epoch=initial_epoch)
  File "/usr/lib64/python3.6/site-packages/keras/engine/training_generator.py", line 217, in fit_generator
    class_weight=class_weight)
  File "/usr/lib64/python3.6/site-packages/keras/engine/training.py", line 1217, in train_on_batch
    outputs = self.train_function(ins)
  File "/usr/lib64/python3.6/site-packages/keras/backend/tensorflow_backend.py", line 2715, in __call__
    return self._call(inputs)
  File "/usr/lib64/python3.6/site-packages/keras/backend/tensorflow_backend.py", line 2655, in _call
    dtype=tf.as_dtype(tensor.dtype).as_numpy_dtype))
  File "/usr/lib64/python3.6/site-packages/numpy/core/numeric.py", line 538, in asarray
    return array(a, dtype, copy=False, order=order)
ValueError: setting an array element with a sequence.

Может кто-нибудь мне помочь, я пытался исправить это сам, но яне удалось, и я не могу

точно определить, откуда произошла ошибка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...