Прежде чем я начну, я хотел бы отметить, что я довольно новичок в этом предмете, поэтому мне все еще есть чему поучиться, и если не так много, я хотел бы получить четкий ответ, чтобы я действительно мог 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