ValueError: установка элемента массива с последовательностью во время обучения CNN с использованием тензорного потока - PullRequest
0 голосов
/ 01 марта 2019

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

def create_train_data():
training_data = []
for img in tqdm(os.listdir(TRAIN_DIR)):
    path = os.path.join(TRAIN_DIR, img)
    img_data = cv2.imread(path, 0)
    try:

        img_data = cv2.resize(img_data, (IMG_SIZE, IMG_SIZE))
    except:
        exc_type, exc_obj, tb = sys.exc_info()
        f = tb.tb_frame
        lineno = tb.tb_lineno
        filename = img
        linecache.checkcache(filename)
        line = linecache.getline(filename, lineno, f.f_globals)
        print('EXCEPTION IN ({}, LINE {} "{}"): {}'.format(filename, lineno, line.strip(), exc_obj))
    training_data.append([np.array(img_data), create_label(img)])

shuffle(training_data)
np.save('women_train_data.npy', training_data)
return training_data

def create_test_data():
  testing_data = []
  for img in tqdm(os.listdir(TEST_DIR)):
     path = os.path.join(TEST_DIR, img)
     img_num = img.split('.')[1]
     img_data = cv2.imread(path, 0)
    try:

        img_data = cv2.resize(img_data, (IMG_SIZE, IMG_SIZE))
    except:
        exc_type, exc_obj, tb = sys.exc_info()
        f = tb.tb_frame
        lineno = tb.tb_lineno
        filename = img
        linecache.checkcache(filename)
        line = linecache.getline(filename, lineno, f.f_globals)
        print('EXCEPTION IN ({}, LINE {} "{}"): {}'.format(filename, lineno, 
        line.strip(), exc_obj))
    testing_data.append([np.array(img_data), create_label(img)])
np.save('women_test_data.npy', testing_data)
return testing_data


 tf.reset_default_graph()

 if os.path.exists('women_train_data.npy'):
    train_data = np.load('women_train_data.npy')
 else:
    train_data = create_train_data()

if os.path.exists('women_test_data.npy'):
   test_data = np.load('women_test_data.npy')
else:
    test_data = create_test_data()

  train = train_data
  test = test_data

  print (train.shape)


X_train = np.array([i[0] for i in train]).reshape(-1, IMG_SIZE, IMG_SIZE, 1)
y_train = [i[1] for i in train]
X_test = np.array([i[0] for i in test]).reshape(-1, IMG_SIZE, IMG_SIZE, 1)
y_test = [i[1] for i in test]

conv_input = input_data(shape=[None, IMG_SIZE, IMG_SIZE, 1], name='input')

conv1 = conv_2d(conv_input, 32, 5, activation='relu')
pool1 = max_pool_2d(conv1, 5)

conv2 = conv_2d(pool1, 64, 5, activation='relu')
pool2 = max_pool_2d(conv2, 5)

conv3 = conv_2d(pool2, 128, 5, activation='relu')
pool3 = max_pool_2d(conv3, 5)

conv4 = conv_2d(pool3, 64, 5, activation='relu')
pool4 = max_pool_2d(conv4, 5)

conv5 = conv_2d(pool4, 32, 5, activation='relu')
pool5 = max_pool_2d(conv5, 5)

fully_layer = fully_connected(pool5, 1024, activation='relu')
fully_layer = dropout(fully_layer, 0.8)

cnn_layers = fully_connected(fully_layer, 56, activation='softmax')
cnn_layers = regression(cnn_layers, optimizer='adam', learning_rate=LR, 
loss='categorical_crossentropy', name='targets')

model = tflearn.DNN(cnn_layers, tensorboard_dir='log', 
tensorboard_verbose=3)

if os.path.exists('women_model.tfl.meta'):
    model.load('./model.tfl')

else:
   model.fit({'input': X_train}, {'targets': y_train}, n_epoch=10,
          validation_set=({'input': X_test}, {'targets': y_test}),
          snapshot_step=500, show_metric=True, run_id=MODEL_NAME)
        model.save('women_model.tfl')

Я пробовал этот код с набором данных cat и dog от Kaggel, и он работал нормально, у меня также была эта проблема с другим набором данных, но после использования его с другим проектом, но с тем же кодом и повторным использованиемэто с этим кодом неожиданно сработало, но я не закончил обучение, поэтому я не уверен, что у меня возникнет та же проблема, я знаю, что это может быть из массива, который содержит разные длины для списков внутри, но все данныеисходят из изображений, поэтому у меня нет полного контроля над вводом, так как я могу это исправить?

1 Ответ

0 голосов
/ 02 марта 2019

наконец, я нашел решение в одном из комментариев на YouTube, и оказалось, что я должен добавить жестко закодированный вектор с нулями на случай, если я пометил одно из изображений неправильно, например:

if label == man_black_shirt
   np.array([0,0,0,1]
else:
   np.array([0,0,0,0])

извините за моинехватка опыта, и я чувствую, что ошибка вводит в заблуждение или это связано с проблемой длины массива, которую я не знаю, я надеюсь, что это поможет кому-то в будущем

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