Я делаю простую классификацию изображений, в которой я хочу поместить изображения в один из 16 классов.Мои метки - это 16-тидюймовые горячие штучки
Когда я вызываю fit (), становится ясно, что модель ожидает 16 образцов , а не одну метку, состоящую из одного массива размером 16. Я затрудняюсь понять, что такое магияМне нужно сказать Керасу, чем я его кормлю.
Код и выплескивание следуют.Попробуйте игнорировать несоответствующие размеры, передаваемые Dense (), это всего лишь игрушечный проект.Я намеренно передаю партии по одному образцу за раз.
def main():
FLAGS, unparsed = ut.parseArgs()
print(FLAGS)
# TEST_DATA_PATH = FLAGS.test_data_path
SAMPLE_FILE = FLAGS.train_data_path + FLAGS.sample
IMG_SHAPE = ut.get_image_shape(filename=SAMPLE_FILE, scale=FLAGS.scale, show=FLAGS.show)
img = ut.read_image(filename=SAMPLE_FILE, show=False)
img = np.array(img)
IMG_SHAPE=img.shape
(x_train, y_train), (x_test, y_test)=load_data(numclasses=FLAGS.numclasses, train_path=FLAGS.train_data_path, sample_file=SAMPLE_FILE, onehot=True)
model = tf.keras.models.Sequential()
print(f'IMG_SHAPE:{IMG_SHAPE}, y_train shape:{y_train[0].shape}')
model.add(tf.keras.layers.Dense(256,activation='relu',input_shape=IMG_SHAPE, name='d1'))
model.add(tf.keras.layers.Dense(64, activation='sigmoid', name='d2'))
model.add(tf.keras.layers.Flatten(data_format='channels_last'))
model.add(tf.keras.layers.Dense(32, activation='softmax', name='d3'))
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.summary()
for nx in range(len(x_train)):
file = x_train[nx]
img = ut.read_image(filename=FLAGS.train_data_path+file, show=False)
img=np.array(img)
img = np.expand_dims(img, axis=0)
model.fit(x=img, y=y_train[nx],verbose=2)
Вот рвота:
"C: \ Users \ WascallyWabbit \ AppData \ Local \ Programs \Python \ Python36 \ python.exe "" C: /Users/WascallyWabbit/PycharmProjects/sentdex_keras/sentdex_keras.py "Пространство имен (batch_size = 4, epochs = 1, learning_rate = 0,01, numclasses = 16, пример = '0cdf5b5djpg101.>scale = 1.0, show = False, target = 'mnist', tb_dir = '/ Users / WascallyWabbit /ensorlog /', test_data_path = '/ Users / WascallyWabbit / Загрузки / carvana / test /', train_data_path = '/ Users / WascallyWabbit /Загрузки / carvana / train / ') IMG_SHAPE: (1280, 1918, 2), форма y_train: (16,) _________________________________________________________________ Layer (тип) Параметр выходной формы #
================================================================= d1 (плотный) (None, 1280, 1918, 256) 768
_________________________________________________________________ d2 (плотный) (None, 1280, 1918, 64) 16448
_________________________________________________________________ flatten (Flatten) (Нет, 157122560) 0
_________________________________________________________________ d3 (Плотный) (Нет, 32) 732954656 ============================================================================== Всего параметров: 732 971 872 Обучаемые параметры: 732 971 872 Необучаемые параметры: 0 _________________________________________________________________ Traceback (последний вызов был последним): файл "C: /Users/WascallyWabbit/PycharmProjects/sentdex_keras/sentdex_keras.py", строка 113, в main () файле "C: / Users / WascallyWabbit / PycharmProjects / sentdex_keras"/sentdex_keras.py ", строка 74, в основном model.fit (x = img, y = y_train [nx], verbose = 2) Файл" C: \ Users \ WascallyWabbit\ AppData \ Roaming \ Python \ Python36 \ site-packages \ tenorflow \ python \ keras \ engine \ training.py ", строка 1536, в нужном виде validation_split = validation_split) Файл" C: \ Users \ WascallyWabbit \ AppData \ Roaming \ Python \ "Python36 \ site-packages \ tenorflow \ python \ keras \ engine \ training.py ", строка 992, в _standardize_user_data class_weight, batch_size) Файл "C: \ Users \ WascallyWabbit \ AppData \ Roaming \ Python \ Python36 \ site-packages \ensorflow \ python \ keras \ engine \ training.py", строка 1169, в _standardize_weights training_utils.check_array_lengths (x,y, sample_weights) Файл "C: \ Users \ WascallyWabbit \ AppData \ Roaming \ Python \ Python36 \ site-packages \ tenorflow \ python \ keras \ engine \ training_utils.py", строка 426, в check_array_lengths 'и' + str (список(set_y) [0]) + 'target samples.') ValueError: Входные массивы должны иметь то же количество выборок, что и целевые массивы. Найдено 1 входных выборок и 16 целевых выборок .
Процесс завершен с кодом выхода 1
Все еще застрял, извините.
Я сократил проблему до гола:
import tensorflow as tf
import numpy as np
in_shape=(128,128,3)
a=np.zeros(shape=in_shape,dtype='float32')
np.fill_diagonal(a[:,:,0],1.)
np.fill_diagonal(a[:,:,1],1.)
np.fill_diagonal(a[:,:,2],1.)
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(64, input_shape=in_shape, activation=tf.nn.relu, batch_size=1,name='d0'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(16, activation=tf.nn.softmax,name='d1')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
Y=np.empty(16)
Y.fill(1.)
#forgot to make one of them 'hot' , does not matter now
#this line barfs
model.fit(x=np.expand_dims(a, axis=0), y=np.expand_dims(Y, axis=0),steps_per_epoch=1)
Вывод:
"C: \ Users \ WascallyWabbit \ AppData \ Local \Programs \ Python \ Python36 \ python.exe "" C: /Users/WascallyWabbit/.PyCharmCE2018.2/config/scratches/scratch_39.py "Traceback (последний вызов был последним): файл" C: /Users/WascallyWabbit/.PyCharmCE2018.2 / config / scratches / scratch_39.py ", строка 28, в model.fit (x = np.expand_dims (a, axis = 0), y = np.expand_dims (Y, axis = 0), steps_per_epoch = 1)файлФайл "C: \ Users \ WascallyWabbit \ AppData \ Roaming \ Python \ Python36 \ site-packages \ tenorflow \ python \ keras \ engine \ training.py", строка 1536, в подходящем файле validation_split = validation_split) C: \ Users \ WascallyWabbit\ AppData \ Roaming \ Python \ Python36 \ site-packages \ tenorflow \ python \ keras \ engine \ training.py ", строка 992, в файле _standardize_user_data class_weight, batch_size) Файл" C: \ Users \ WascallyWabbit \ AppData \ Roaming \ Python \ "Python36 \ site-packages \ tenorflow \ python \ keras \ engine \ training.py ", строка 1154, в _standardize_weights exception_prefix = 'target') Файл" C: \ Users \ WascallyWabbit \ AppData \ Roaming \ Python \ Python36 \ site-packages "\ tenorflow \ python \ keras \ engine \ training_utils.py ", строка 332, в standardize_input_data ', но получил массив с формой' + str (data_shape)) ValueError: Ошибка при проверке target : ожидаемый d1иметь форму (1,), но получить массив с формой (16,)
Я хочу, чтобы массив вероятностей из 16 элементов был «мягким» против массива меток из 16 элементов.Разбираться с np.expand_dims (..., axis =) не принесло радости.
Что я не вижу?