Прогнозирование значений с помощью нейронных сетей TFLearn

Я новичок в TFLearn и пытаюсь использовать простую нейронную сеть для прогнозирования значения выходного массива при задании входного массива.

Фактическими входными данными для этого кода будут либо значения пикселей изображения в градациях серого, либо функции, извлеченные из изображения в градациях серого. Следовательно, вход находится в формате массива 2d. На выходе будет предсказанный цвет для каждого пикселя.

В примере кода я использовал два случайных массива размером 9. Мне нужно обучить сеть предсказывать массив «t_y», когда в качестве входных данных задан массив «t_x». Код работает, но предсказание очень плохое.

Код был адаптирован из примера MNIST TFLearn, найденного здесь

это мой код

from random import randint
import numpy as np
import tflearn
from tflearn.layers.core import input_data, dropout, fully_connected
from tflearn.layers.conv import conv_2d, max_pool_2d
from tflearn.layers.normalization import local_response_normalization
from tflearn.layers.estimator import regression



#input
t_x = [3, 8, 7, 4, 0, 7, 9, 5, 1]
#output
t_y = [9, 5, 1, 4, 7, 9, 7, 3, 6]

x = []
y = []

for i in range(1000):
  x.append(t_x)
  y.append(t_y)

#array of input values
x = np.reshape(x,(-1,3,3,1))

#array of output values
y = np.reshape(y,(-1,9))

network = input_data(shape=[None, 3, 3, 1], name='input')
network = conv_2d(network, 32, 3, activation='relu', regularizer="L2")
network = max_pool_2d(network, 2)
network = local_response_normalization(network)
network = conv_2d(network, 64, 3, activation='relu', regularizer="L2")
network = max_pool_2d(network, 2)
network = local_response_normalization(network)
network = fully_connected(network, 128, activation='tanh')
network = dropout(network, 0.8)
network = fully_connected(network, 256, activation='tanh')
network = dropout(network, 0.8)
network = fully_connected(network, 9, activation='softmax')
network = regression(network, optimizer='adam', learning_rate=0.01,
                     loss='categorical_crossentropy', name='target')


# Training
model = tflearn.DNN(network, tensorboard_verbose=0)
model.fit({'input': x}, {'target': y}, n_epoch=20)

pred = model.predict(np.reshape(t_x,(-1,3,3,1)))
print "Prediction :", pred[0]

Я предполагаю, что это как-то связано со значениями параметров, указанными в функциях «conv_2d» и «full_connected».

Какие значения мне нужно установить, чтобы получить точный прогноз?


person Akheel K M    schedule 09.01.2017    source источник


Ответы (1)


Формат вывода

Последний слой вашего кода (full_connected(network, 9,activation='softmax')) приводит к 9 нейронам с функцией softmax, т. е. нормализованным, так что их общая сумма будет равна 1. Обычно это можно использовать (и использовать в MNIST) для выбора/оптимизации функции, которая выбирает одно из 9 возможных выходных значений — сеть будет выводить что-то вроде [0,01 0,01 0,01 0,9 0,03 0,01 0,01 0,01 0,01], «предсказывая», что четвертое значение является правильным, и это будет сопоставляться с однократным целевым вектором (например, [0 0 0 1 0 0 0 0 0]).

Излишне говорить, что вывод softmax никогда не может быть равен [9, 5, 1, 4, 7, 9, 7, 3, 6] и даже близко к этому, поскольку вывод всех значений softmax будет составлять 1. Даже предыдущий слой не может выводить такие значения, поскольку tanh может выдавать только значения от -1 до 1 и никогда не может привести к 9.

Если вы хотите предсказать 9 чисел в диапазоне от 1 до 9, вы можете использовать полносвязный слой вместо softmax и масштабировать свой вывод так, чтобы ожидаемый результат находился в диапазоне от 0 до 1. Это еще не все. , но это было бы хорошим началом.

person Peteris    schedule 09.01.2017
comment
Есть ли способ ограничить выходные значения сетевого уровня диапазоном значений, скажем, от 0 до 9? - person Akheel K M; 11.01.2017
comment
@AkheelKM имеет стандартную функцию активации 0-1 и умножает ее на 9; это часто используемая практика машинного обучения для масштабирования (или логарифмического масштабирования) всех переменных примерно до 0-1 и повторного масштабирования их обратно на выходе. - person Peteris; 11.01.2017