DNF TFLearn классифицируют каждый вход одинаково - PullRequest
0 голосов
/ 19 октября 2018

Я создаю четыре сети с TFLearn: основной ANN для классификации изображений, базовый ANN для классификации звуковых файлов, CNN для классификации изображений и CNN для классификации звуковых файлов.Независимо от того, сколько я тренирую сети, какую скорость обучения или функцию активации я использую, или какой набор данных я тренирую, я всегда получаю одинаковые результаты.Сети всегда помещают все входные данные в одну категорию (например, сеть, обученная отличать изображения пчел от изображений без пчел, всегда идентифицирует каждое изображение как содержащее пчелу).

Я знаю, что не перегружаюсь, так как даженабор обучающих данных дает такой результат.

Что может быть причиной этой проблемы?

Вот код, который создает и тестирует сети.Они обучаются с использованием метода .fit ().

import tflearn
import tensorflow as tf
import numpy as np
import pickle as cPickle
import random
import os
from math import inf

def create_image_ann():
    image_ann_input = tflearn.layers.core.input_data(shape=[None, 32, 32], 
    name='input_layer')
    image_ann_layer_1 = 
    tflearn.layers.core.fully_connected(incoming=image_ann_input, 
    activation='linear', n_units=100, name='fc_layer_1')
    image_ann_layer_2 = 
    tflearn.layers.core.fully_connected(incoming=image_ann_layer_1, 
    activation='linear', n_units=100, name='fc_layer_2')
    image_ann_layer_3 = 
    tflearn.layers.core.fully_connected(incoming=image_ann_layer_2, 
    activation='linear', n_units=100, name='fc_layer_3')
    image_ann_layer_4 = 
    tflearn.layers.core.fully_connected(incoming=image_ann_layer_3, 
    activation='linear', n_units=100, name='fc_layer_4')

    image_ann_output = 
    tflearn.layers.core.fully_connected(incoming=image_ann_layer_4, 
    activation='linear', n_units=2, name='output_layer')

    image_ann_regression = 
    tflearn.layers.estimator.regression(image_ann_output, optimizer='sgd', 
    learning_rate=0.1)

    model = tflearn.DNN(image_ann_regression)

    return model

def create_image_cnn():
    input_layer = tflearn.layers.core.input_data(shape=[None, 32, 32])
    input_layer = tf.expand_dims(input_layer, 2)

    conv_layer_1 = tflearn.layers.conv.conv_2d(input_layer, nb_filter=20, 
    filter_size=5, activation='linear', name='conv_layer_1')
    conv_layer_2 = tflearn.layers.conv.conv_2d(input_layer, nb_filter=20, 
    filter_size=5, activation='linear', name='conv_layer_2')

    conv_layer_3 = tflearn.layers.conv.conv_2d(input_layer, nb_filter=20, 
    filter_size=10, activation='linear', name='conv_layer_3')
    conv_layer_4 = tflearn.layers.conv.conv_2d(input_layer, nb_filter=20, 
    filter_size=10, activation='linear', name='conv_layer_4')

    conv_layer_5 = tflearn.layers.conv.conv_2d(input_layer, nb_filter=20, 
    filter_size=15, activation='linear', name='conv_layer_5')
    conv_layer_6 = tflearn.layers.conv.conv_2d(input_layer, nb_filter=20, 
    filter_size=15, activation='linear', name='conv_layer_6')

    pool_layer_1 = tflearn.layers.conv.max_pool_2d(conv_layer_1, 2, 
    name='pool_layer_1')
    pool_layer_2 = tflearn.layers.conv.max_pool_2d(conv_layer_2, 2, 
    name='pool_layer_2')
    pool_layer_3 = tflearn.layers.conv.max_pool_2d(conv_layer_3, 2, 
    name='pool_layer_3')
    pool_layer_4 = tflearn.layers.conv.max_pool_2d(conv_layer_4, 2, 
    name='pool_layer_4')
    pool_layer_5 = tflearn.layers.conv.max_pool_2d(conv_layer_5, 2, 
    name='pool_layer_5')
    pool_layer_6 = tflearn.layers.conv.max_pool_2d(conv_layer_6, 2, 
    name='pool_layer_6')

    merged_pool_layer = tflearn.layers.merge_ops.merge([pool_layer_1, 
    pool_layer_2, pool_layer_3, pool_layer_4, pool_layer_5, pool_layer_6], 
    'concat', name='merge_layer')

    fc_layer_1 = tflearn.layers.core.fully_connected(merged_pool_layer, 
    n_units=100, activation='linear', name='fc_layer_1')

    output_layer = tflearn.layers.core.fully_connected(fc_layer_1, 
    n_units=2, activation='linear', name='output_layer')

    regression = tflearn.layers.estimator.regression(output_layer, 
    optimizer='sgd', learning_rate=0.1)

    model = tflearn.DNN(regression)

    return model

def create_audio_ann():
    input_layer = tflearn.layers.core.input_data(shape=[None, 500])
    input_layer = tf.expand_dims(input_layer, 2)

    fc_layer_1 = tflearn.layers.core.fully_connected(input_layer, 
    n_units=100, activation='linear', name='fc_layer_1')
    fc_layer_2 = tflearn.layers.core.fully_connected(fc_layer_1, 
    n_units=100, activation='linear', name='fc_layer_1')
    fc_layer_3 = tflearn.layers.core.fully_connected(fc_layer_2, 
    n_units=100, activation='linear', name='fc_layer_1')
    fc_layer_4 = tflearn.layers.core.fully_connected(fc_layer_3, 
    n_units=100, activation='linear', name='fc_layer_1')
    fc_layer_5 = tflearn.layers.core.fully_connected(fc_layer_4, 
    n_units=100, activation='linear', name='fc_layer_1')

    output_layer = tflearn.layers.core.fully_connected(fc_layer_5, 
    n_units=3, activation='linear', name='output_layer')

    regression = tflearn.layers.estimator.regression(output_layer, 
    optimizer='sgd', learning_rate=0.7)

    model = tflearn.DNN(regression)

    return model

def create_audio_cnn():
    input_layer = tflearn.layers.core.input_data(shape=[None, 500])
    input_layer = tf.expand_dims(input_layer, 2)

    conv_layer_1 = tflearn.layers.conv.conv_1d(input_layer, nb_filter=20, 
    filter_size=50, activation='linear', name='conv_layer_1')
    conv_layer_2 = tflearn.layers.conv.conv_1d(input_layer, nb_filter=20, 
    filter_size=75, activation='linear', name='conv_layer_1')
    conv_layer_3 = tflearn.layers.conv.conv_1d(input_layer, nb_filter=20, 
    filter_size=100, activation='linear', name='conv_layer_1')

    pool_layer_1 = tflearn.layers.conv.max_pool_1d(conv_layer_1, 
    kernel_size=5, name="pool_layer_1")
    pool_layer_2 = tflearn.layers.conv.max_pool_1d(conv_layer_2, 
    kernel_size=5, name="pool_layer_2")
    pool_layer_3 = tflearn.layers.conv.max_pool_1d(conv_layer_3, 
    kernel_size=5, name="pool_layer_3")

    merged_pool_layer = tflearn.layers.merge_ops.merge(
    [pool_layer_1, pool_layer_2, pool_layer_3], 'concat',
    name='merge_layer')

    fc_layer_1 = tflearn.layers.core.fully_connected(merged_pool_layer, 
    n_units=100, activation='linear', name='fc_layer_1')

    output_layer = tflearn.layers.core.fully_connected(fc_layer_1, 
    n_units=3, activation='linear', name='output_layer')

    regression = tflearn.layers.estimator.regression(output_layer, 
    optimizer='sgd', learning_rate=0.1)

    model = tflearn.DNN(regression)

    return model

def test_network(net, test_data):
    test_inputs = test_data[0]
    targets = test_data[1]

    correct_answers = 0

    outputs = net.predict(test_inputs)
    for i in range(len(outputs)):
        output = outputs[i]

        max_output = -inf
        max_output_index = -1
        for j in range(len(output)):
            if output[j] > max_output:
                max_output = output[j]
                max_output_index = j

        input(str(output) + ', ' + str(targets[i]) + ': ' + str(targets[i] 
        [max_output_index] == 1))
        if targets[i][max_output_index] == 1:
            correct_answers += 1

    print("Amount Correct: " + str(correct_answers) + " / " + 
    str(len(test_inputs)))
    print(str(100.0 * correct_answers / len(test_inputs)) + "%")

def save(obj, file_path):
    with open(file_path, 'wb') as fp:
        cPickle.dump(obj, fp)

def load(file_path):
    with open(file_path, 'rb') as fp:
        return cPickle.load(fp)
...