В первом посте https://medium.com/@gautam.karmakar/logistic-regression-using-tensorflow-f7220e067477 я создал простую логистическую регрессию для классификации данных персонажей. В этом посте мы будем использовать тот же набор данных, но вместо логистической регрессии мы будем использовать однослойную нейронную сеть. Обратите внимание, что эта нейронная сеть будет основана на предыдущей логистической регрессии, а также создаст классификатор, но будет использовать промежуточный скрытый слой. Давайте начнем.
Одно замечание: мы будем использовать сигмовидную функцию в качестве функции активации. Сигмовидная функция сжимает числа от очень маленьких до очень больших в диапазоне [0,1] и обеспечивает хорошее представление в виде вероятностного результата.
Давайте перейдем к коду:
Здесь я вставляю большую часть того же кода для загрузки пакетов и данных, что и раньше.
#Импорт пакетов
импортировать тензорный поток как tf
импортировать numpy как np
импортировать математику
из tqdm импортировать tqdm
импортировать matplotlib.pyplot как plt
плт.ион()
#начальная случайность
np.random.seed (42)
#Загрузить данные
данные = np.load («data_with_labels.npz»)
поезд = данные['arr_0']/255
метки = данные['arr_1]
#Давайте посмотрим на некоторые данные буквы A
plt.figure(figsize=(8,8))
f, plts = plt.subplots(5, sharex=True)
c = 91
для я в диапазоне (5):
plts[i].pcolor(train[c + i*558], cmap=plt.cm.gray_r)
Теперь давайте преобразуем категориальную метку в одно горячее представление.
def to_onehot(labels, nclasses = 5):
'''
Преобразование меток в формат «one hot»
'''
outputlabels = np.zeros((len(labels ), nclasses))
для i, l в enumerate(labels):
outputlabels[i, l] = 1
return outputlabels
onehot = to_onehot (метки)
Разделите данные на обучающий и тестовый наборы:
индексы = np.random.permutation(train.shape[0])
valid_cnt = int(train.shape[0] * 0.1)
test_idx, training_idx = index[:valid_cnt], index[valid_cnt: ]
test, train = train[test_idx,:], train[training_idx,:]
onehot_test, onehot_train = onehot[test_idx,:], onehot[training_idx,:]
# Это будут входные данные
## Входные пиксели, сглаженные
x = tf.placeholder("float", [None, 1296])
## Известные метки
y_ = tf .placeholder («плавающий», [Нет, 5])
Мы будем использовать один скрытый слой со 128 нейронами.
num_hidden = 128
Скрытый слой:
W1 = tf.Variable(tf.truncated_normal([1296, num_hidden],
stddev=1./math.sqrt(1296)))
b1 = tf.Variable(tf.constant(0.1,shape) =[num_hidden]))
h1 = tf.sigmoid(tf.matmul(x,W1) + b1)
# Выходной слой
W2 = tf.Variable(tf.truncated_normal([num_hidden, 5],
stddev=1./math.sqrt(5)))
b2 = tf.Variable( tf.constant (0,1, форма = [5]))
# Просто инициализируйте
sess.run(tf.initialize_all_variables())
# Определяем модель
y = tf.nn.softmax(tf.matmul(h1,W2) + b2)
# Залезаем на кросс-энтропию
cross_entropy = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits(y+1e-20, y_))
# Как мы тренируем
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
# Определение точности
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
точность = tf.reduce_mean(tf.cast(correct_prediction, "float" ))
# На самом деле train
epochs = 10000
train_acc = np.zeros(epochs//10)
test_acc = np.zeros(epochs//10)
for i in tqdm(range (эпохи), ascii=True):
if i % 10 == 0: # Записать сводные данные и точность
# Проверить точность набора поездов
train_accuracy = precision.eval(feed_dict ={x: train.reshape([-1,1296]), y_: onehot_train})
train_acc[i//10] = train-acc
# А теперь набор для проверки
test_accuracy= precision.eval(feed_dict={x: test.reshape([-1,1296]), y_: onehot_test})
test_acc[i//10] = test_accuracy
train_step.run(feed_dict={x: train.reshape([-1,1296]), y_: onehot_train})
После того, как модель обучена и точность обучения и тестирования рассчитана, давайте построим график точности и посмотрим на матрицу путаницы.