передача строковых значений как меток для сверточных нейронных сетей - PullRequest
0 голосов
/ 06 мая 2020

работает над моделью CNN с набором данных изображений, каждое из которых читает число 6 di git, а соответствующие им метки являются строковыми значениями чисел в изображении (например, «658945»). поэтому каждая метка в наборе данных отличается от другой, и для каждого изображения в наборе данных есть метка. Я знаю, что при передаче меток в том виде, в каком они есть (в виде строк), я получаю эту ошибку: 'str' object has no attribute 'ndim'. Итак, как правильно применять метки. и должно ли нейронов выходного слоя быть столько же, сколько меток в наборе данных?

ОБНОВЛЕНИЕ: вот код:

x_train, y_train = create_training_data()

print(x_train)
print(y_train)

model = Sequential()

model.add(Conv2D(64, (3, 3), input_shape = x_train.shape[1:]))
model.add(Activation('relu'))
model.add(MaxPool2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPool2D(pool_size=(2, 2)))

model.add(Flatten())
model.add(Dense(64))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=8, epochs=25, validation_split=0.1, verbose=1)

x_train:

[[[[1.        ]
   [1.        ]
   [1.        ]
   ...
   [0.99215686]
   [0.99215686]
   [1.        ]]]]

y_train:

[['321043'], ['734231'], ['754946'], ['135039'], ['529285'], ['458224'], ['403070']...['533067'], ['185215'], ['495197'], ['100333']]

1 Ответ

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

Передайте [["123456"],["654312"]] вместо ["123456","654312"] в качестве «списка меток».

EDIT: sparse_categorical_crossentropy не имеет смысла как функция потерь. Вы пытаетесь сравнить вывод вашей сети (число с плавающей запятой) с вашей меткой (строкой), но этого не произойдет. Если вам действительно нужно что-то обучить самому, вам нужно представить строки как векторы.

Итак, у вас есть несколько вариантов: 1) попробовать что-нибудь из коробки (рекомендуется): https://github.com/faustomorales/keras-ocr. Вам, наверное, даже не придется этому переучивать. 2) тренируйте свои собственные и представляйте струны как 60-мерный вектор. 6 цифр, и каждый di git может иметь 10 разных символов [0-9], поэтому 60. Итак, ваш последний плотный слой будет иметь 60 выходных нейронов. Это означает, что вам нужно закодировать свои метки как 60 выходных нейронов, например, строка 123444 будет

[0,1,0,0,0,0,0,0,0,0,
 0,0,1,0,0,0,0,0,0,0,
 0,0,0,1,0,0,0,0,0,0,
 0,0,0,0,1,0,0,0,0,0,
 0,0,0,0,1,0,0,0,0,0,
 0,0,0,0,1,0,0,0,0,0]

. Вам нужно будет написать код, который преобразует ваши строковые метки в такие one hot кодировки. -А они называются. Это, вероятно, легче всего сделать в create_training_data, а не в tensorflow, но тогда модель также будет выводить 60-вектор, а не строку.

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