Стоимость Tensorflow CNN перестает улучшаться - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь разработать небольшую сеть для задачи идентификации воздушного кактуса.

Это задача двоичной классификации (0 - нет кактуса, 1 - кактус), но мои сети всегда выдают одинаковую стоимость. , Я построил простую сеть, которая работает при использовании keras, но я пытаюсь использовать обучение тензорным потоком l oop для целей обучения, но не могу заставить его работать

Моя сетевая архитектура:

2 Conv 64x3 + Maxpooling

2 Conv 128x3 + Maxpooling

Flatten

Dense 1024

Dense 512

Dense 1

Вот мой код:

def process_one_batch(x, y):
    inputs = Conv2D(64, 3, activation='relu')(x)
    inputs = Conv2D(64, 3, activation='relu')(inputs)
    inputs = MaxPooling2D(pool_size=2, strides=2)(inputs)

    inputs = Conv2D(128, 3, activation='relu')(inputs)
    inputs = Conv2D(128, 3, activation='relu')(inputs)
    inputs = MaxPooling2D(pool_size=2, strides=2)(inputs)

    flat = Flatten()(block2)

    dense1 = Dense(1024, activation="relu")(flat)
    dense2 = Dense(512, activation="relu")(dense1)

    dense2 = Dense(1, activation='sigmoid')(dense2)

    res = dense2
    return res

NB_EPOCHS = 5
def create_dataset(X, y, batch_size=BATCH_SIZE, nb_epochs=NB_EPOCHS, batch=True):
    dataset = tf.data.Dataset.from_tensor_slices((X, y))
    dataset = dataset.map(my_process_path)
    if batch:
        dataset = dataset.batch(batch_size)
    dataset = dataset.repeat(nb_epochs)
    dataset = dataset.prefetch(buffer_size=2)
    iterator =  tf.data.make_one_shot_iterator(dataset)
    #iterator = dataset.make_one_shot_iterator()
    next_element = iterator.get_next()
    y_ = process_one_batch(next_element[0], next_element[1])
    return dataset, next_element, y_

train_ds, (train_x, train_y), prediction = create_dataset(X_train.values, y_train.values)
test_ds, (test_x, test_y), test_prediction = create_dataset(X_test.values, y_test.values, batch=True)

cross_entropy = tf.reduce_mean(tf.keras.losses.binary_crossentropy(
            train_y, tf.reshape(tf.transpose(prediction), [-1]), from_logits=True
))
optimiser = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cross_entropy)
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    train_steps = int(len(X_train.values) / BATCH_SIZE)
    val_steps = int(len(X_test.values) / BATCH_SIZE)
    # initialise the variables
    sess.run(init_op)
    print('Init')
    for epoch in range(NB_EPOCHS):
        avg_cost = 0
        train_acc = 0
        for i in range(train_steps):
            _, c, ac = sess.run([optimiser, cross_entropy, accuracy_train])
            print(c)
            avg_cost += 1
            train_acc += ac
        print('train_acc: ', train_acc/train_steps)
        print(train_steps, val_steps)
        print("Epoch:", (epoch + 1), "cost =", "{:.3f}".format(avg_cost / train_steps))
    print("\nTraining complete!")

Я попытался отладить ввод модели, он не всегда одинаков, но после того, как стоимость 3-й партии застряла на 0,6931472. Сразу после того, как я запустил простую модель keras в наборе данных, и все работает нормально, я не думаю, что это проблема, связанная с данными

Любая идея будет с благодарностью оценена

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