Keras model.fit ValueError: входные массивы должны иметь то же количество выборок, что и целевые массивы - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь загрузить bottleneck_features, полученные при запуске resnet50, в модель верхнего уровня. Я запустил предикат_генератора при повторной сети и сохранил результирующее бутылочное_файлы в файле npy. Я не могу соответствовать созданной мной модели из-за следующей ошибки:

    Traceback (most recent call last):
  File "Labeled_Image_Recognition.py", line 119, in <module>
    callbacks=[checkpointer])
  File "/home/dillon/anaconda3/envs/tensorflow/lib/python3.6/site-packages/keras/models.py", line 963, in fit
    validation_steps=validation_steps)
  File "/home/dillon/anaconda3/envs/tensorflow/lib/python3.6/site-packages/keras/engine/training.py", line 1630, in fit
    batch_size=batch_size)
  File "/home/dillon/anaconda3/envs/tensorflow/lib/python3.6/site-packages/keras/engine/training.py", line 1490, in _standardize_user_data
    _check_array_lengths(x, y, sample_weights)
  File "/home/dillon/anaconda3/envs/tensorflow/lib/python3.6/site-packages/keras/engine/training.py", line 220, in _check_array_lengths
    'and ' + str(list(set_y)[0]) + ' target samples.')
ValueError: Input arrays should have the same number of samples as target arrays. Found 940286 input samples and 14951 target samples.

Я не совсем уверен, что это значит. У меня есть 940286 изображений всего в моей директории поезда, и есть 14951 общее количество подкаталогов, на которые эти изображения разделены. Мои две гипотезы:

  1. Возможно, я неправильно форматирую train_data и train_labels.
  2. Я неправильно настроил модель

Любое руководство в правильном направлении будет высоко ценится!

Вот код:

# Constants
num_train_dirs = 14951 #This is the total amount of classes I have
num_valid_dirs = 13168 

def load_labels(path):
    targets = os.listdir(path)
    labels = np_utils.to_categorical(targets, len(targets))
    return labels

def create_model(train_data):
    model = Sequential()
    model.add(Flatten(input_shape=train_data.shape[1:]))
    model.add(Dense(num_train_dirs, activation='relu'))
    model.add(Dropout(0.2))
    model.add(Dense(num_train_dirs, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
    return model    

train_data = np.load(open('bottleneck_features/bottleneck_features_train.npy', 'rb'))
train_labels = load_labels(raid_train_dir)

valid_data = np.load(open('bottleneck_features/bottleneck_features_valid.npy', 'rb'))
valid_labels = train_labels

model = create_model(train_data)
model.summary()

checkpointer = ModelCheckpoint(filepath='weights/first_try.hdf5', verbose=1, save_best_only=True)

print("Fitting model...")

model.fit(train_data, train_labels,
     epochs=50,
     batch_size=100,
     verbose=1,
     validation_data=(valid_data, valid_labels),
     callbacks=[checkpointer])

1 Ответ

0 голосов
/ 29 апреля 2018

В случае контролируемого обучения количество входных выборок (X) должно соответствовать количеству выходных (меток) выборок (Y).

Например: если мы хотим подогнать (выучить) NN для распознавания рукописных цифр и подать в нашу модель 10.000 изображений (X), то мы также должны передать 10.000 меток (Y).

В вашем случае эти цифры не совпадают.

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