Как передать метку, состоящую из нескольких значений (это кортеж), в модель keras - PullRequest
1 голос
/ 03 мая 2020

Прежде чем я начну, я хотел бы отметить, что я довольно новичок в этом предмете, поэтому мне все еще есть чему поучиться, и если не так много, я хотел бы получить четкий ответ, чтобы я действительно мог asp идея, лежащая в основе.

Итак, моя проблема в том виде, в каком она представлена ​​в вопросе, заключается в том, как передать метку, которая по сути является кортежем с несколькими значениями, в мою функцию fit, чтобы я мог тренируй мою модель. Я пытался преобразовать его в массив numpy, а затем передать его в мою модель с помощью функции asarray.

label = np.asarray(label)

, но это дает мне ошибку, по сути говоря:

ValueError: Input arrays should have the same number of samples as target arrays. Found 1 input samples and 6 target samples.

Это имеет смысл, поскольку кортеж состоит из 6 значений, и после преобразования его в массив numpy я получаю в нем 6 элементов, поэтому, когда я передаю изображение и метку, которая теперь имеет 6 элементов, в fit Функция, из-за которой возникает эта ошибка, потому что я, по сути, передаю 6 меток только для одного изображения, верно? Поэтому мой вопрос заключается в том, как я могу наклеить метку с теми 6 функциями, которые представляют различные части изображения, которые я хочу, чтобы модель могла распознавать, к функции подгонки, чтобы модель можно было обучить на основе этой метки, которая имеет 6 функций?

Справочная информация:

Итак, я работаю с Convolutional Neural Networks (Conv2D) и пытаюсь построить модель, которая может идентифицировать американские автомобильные номера. Изображения, которые у меня есть, имеют только номерные знаки с 6 цифрами / символами, и это то, что входит в ярлыки. У меня есть parseImgFunction, который получает фотографию и возвращает return (image_mat,label). Эта метка содержит 6 элементов (каждый представляет один символ / номер знака) и является кортежем. В основном я хочу использовать эту метку в fit, как показано ниже, чтобы для каждого изображения у меня была метка с 6 элементами, каждая из которых представляет часть пластины. Также изображение, которое я подавал на модель, уже было изменено.

history = model.fit(image, label, epochs=1, steps_per_epoch=100)

Заранее спасибо!

Редактировать:

Извините, что не дал вам необходимый код. Вот следующий код, который я использую:

dataset = tf.data.TFRecordDataset('american_car_plates.tfrecords')

feature_description = {'first': tf.io.FixedLenFeature([], tf.int64),
            'second': tf.io.FixedLenFeature([], tf.int64),
            'third':  tf.io.FixedLenFeature([], tf.int64),
            'forth': tf.io.FixedLenFeature([], tf.int64),
            'fifth':  tf.io.FixedLenFeature([], tf.int64),
            'sixth': tf.io.FixedLenFeature([], tf.int64),
            'raw': tf.io.FixedLenFeature([], tf.string),
        }



def parseImgFunction(proto):
  aux = tf.io.parse_single_example(proto,  feature_description)
  raw = aux['raw']

  first = aux['first']
  second = aux['second']
  third = aux['third']
  forth = aux['forth']
  fifth = aux['fifth']
  sixth = aux['sixth']
  full_label = (first, second, third, forth, fifth, sixth)
  label = full_label

  image = tf.io.decode_jpeg(raw, channels=1)
  image = tf.cast(image, dtype=tf.float32)
  image_mat = 1 / 255 * image


  return (image_mat,label)

mapped_images = dataset.map(parseImgFunction)

it = iter(mapped_images)
image_mat, label = next(it)
im = tf.squeeze(image_mat).numpy()

im = im.reshape([-1, 620, 420, 1])
label = np.asarray(label)


input = Input(shape=(620, 420, 1))
conv1 = Conv2D(16, kernel_size=(3, 3), activation='relu')(input)
max1 = MaxPooling2D((2, 2))(conv1)
drop1 = Dropout(0.2)(max1)
conv2 = Conv2D(24, kernel_size=(3, 3), activation='relu')(drop1)
max2 = MaxPooling2D((2, 2))(conv2)
drop2 = Dropout(0.2)(max2)
flat1 = Flatten()(drop2)
dense1 = Dense(128, activation='relu')(flat1)
drop3 = Dropout(0.2)(dense1)
out = Dense(1, activation='relu')(drop3)
model = Model(input, out)
print(model.summary())

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
history = model.fit(im, label, epochs=1, steps_per_epoch=100)

Версии:

Keras-2.3.1 Tensorflow-2.0.0 Python -3.7

1 Ответ

0 голосов
/ 03 мая 2020

Хотя у меня нет кода (пожалуйста, обновите сообщение с кодом), похоже, что когда вы передаете данные в свою модель, ваши классы не разделяются в примерах, как указано в этом комментарии: Ошибка значения : Входные массивы должны иметь то же количество выборок, что и целевые массивы. Найдено 1600 входных выборок и 6400 целевых выборок .

Убедитесь, что для решения вашей проблемы выполнена правильная предварительная обработка.

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