Запустить в Google Colab

API-интерфейсы TensorFlow низкого уровня (ядро TensorFlow)

Из этого руководства вы начнете программировать на низкоуровневых API-интерфейсах TensorFlow (TensorFlow Core) и покажете, как:

Управляйте своей собственной программой TensorFlow (tf.Graph) и средой выполнения TensorFlow (tf.Session) вместо того, чтобы полагаться на оценщики для управления ими.
Запускайте операции TensorFlow с помощью tf.Session.
Используйте высокий компоненты уровня (наборы данных, слои и столбцы объектов) в этой низкоуровневой среде.
Создайте свой собственный цикл обучения вместо того, чтобы использовать цикл, предоставленный оценщиками.

Я рекомендую по возможности использовать API более высокого уровня для построения моделей. Знание TensorFlow Core ценно по следующим причинам:

Экспериментирование и отладка становятся более простыми, когда вы можете напрямую использовать операции TensorFlow низкого уровня.
Это дает вам ментальную модель того, как все работает внутри при использовании API более высокого уровня.

Настраивать

Начнем с загрузки библиотек следующим образом:

import numpy as np # linear algebra
import seaborn as sns
sns.set(style='whitegrid')
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import matplotlib.pyplot as plt
import sys
import tensorflow as tf
from tensorflow.python.framework import ops
# reset computational graph
ops.reset_default_graph()
print('tensorflow virsion:',tf.VERSION)
print('python virsion    :',sys.version)
print('pandas virsion    :',pd.__version__)
print('numpy virsion     :',pd.__version__)
%matplotlib inline
>>
tensorflow virsion: 1.14.0
python virsion    : 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]]
pandas virsion    : 0.24.2
numpy virsion     : 0.24.2

Данные

Примечание: данные уже предварительно обработаны

train_data=pd.read_csv(‘drive/My Drive/collab data/Loan pridiction/PPTrain.csv’)
X,y = train_data.drop([‘Loan_Status’],axis=1), train_data.Loan_Status
from sklearn.preprocessing import StandardScaler
slc= StandardScaler()
X= slc.fit_transform(X)
y=y.values
from sklearn.model_selection import train_test_split
x_vals_train,x_vals_test,y_vals_train,y_vals_test= train_test_split(X,y,test_size=.25,random_state=0)

Примечание. Я загрузил данные на диск Google. Узнайте, как использовать данные с диска Google, здесь

Определить вычислительный граф Tensorflow

# Create graph
sess = tf.Session()
#input shape
x_vals_train.shape

Затем нам нужно объявить наши заполнители для данных следующим образом:

# Initialize placeholders
x_data = tf.placeholder(shape=[None, 11], dtype=tf.float32)
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)

Теперь нам нужно объявить функции, которые инициализируют переменную и слой в нашей модели. Чтобы создать лучшую функцию relu, нам нужно создать функцию, которая возвращает активированный повторно слой на входном слое. Другими словами, мы просто используем полностью подключенный слой и вернем элемент relu для каждого слоя. Важно помнить, что в нашу функцию потерь будет включен последний сигмоид, поэтому мы хотим указать на нашем последнем слое, что мы не будем возвращать сигмоид или rel вывода, как показано ниже:

# Create variable definition
def init_variable(shape):
    return(tf.Variable(tf.random_normal(shape=shape)))
# Create variable definition
def logistic(input_layer, multiplication_weight, bias_weight, activation = True):
    linear_layer = tf.add(tf.matmul(input_layer, multiplication_weight), bias_weight)
    # We separate the activation at the end because the loss function will
    # implement the last sigmoid necessary
    if activation:
        return(tf.nn.relu(linear_layer))
    else:
        return(linear_layer)

Теперь объявим три слоя (два скрытых слоя и выходной слой). Мы начнем с инициализации матрицы весов и смещения для каждого слоя и определения операций над слоями следующим образом:

# First logistic layer (11 inputs to 8 hidden nodes)
A1 = init_variable(shape=[11,8])
b1 = init_variable(shape=[8])
logistic_layer1 = logistic(x_data, A1, b1)
# Second logistic layer (14 hidden inputs to 5 hidden nodes)
A2 = init_variable(shape=[8,4])
b2 = init_variable(shape=[4])
logistic_layer2 = logistic(logistic_layer1, A2, b2)
# Final output layer (4 hidden nodes to 1 output)
A3 = init_variable(shape=[4,1])
b3 = init_variable(shape=[1])
final_output = logistic(logistic_layer2, A3, b3, activation=False)
tput = logistic(logistic_layer2, A3, b3, activation=False)

Затем мы объявляем нашу потерю (кросс-энтропию) и алгоритм оптимизации и инициализируем следующие переменные:

# Declare loss function (Cross Entropy loss)
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=final_output, labels=y_target))
# Declare optimizer
my_opt = tf.train.AdamOptimizer(learning_rate = 0.0005)
train_step = my_opt.minimize(loss)
init = tf.global_variables_initializer()
sess.run(init)

Модель поезда

Чтобы оценить и сравнить нашу модель с предыдущими моделями, нам нужно создать операцию прогнозирования и точности на графике. Это позволит нам использовать весь набор тестов и определить точность следующим образом:

# Actual Prediction
prediction = tf.round(tf.nn.sigmoid(final_output))
predictions_correct = tf.cast(tf.equal(prediction, y_target), tf.float32)
accuracy = tf.reduce_mean(predictions_correct)

Теперь мы готовы начать цикл обучения. Мы обучим 6000 поколений и сохраним потерянные модели, а также точность обучения и испытаний для построения графиков позже. Наш цикл обучения начинается со следующего кода:

# Training loop
batch_size = 50
loss_vec = []
train_acc = []
test_acc = []
for i in range(6000):
    rand_index = np.random.choice(len(x_vals_train), size=batch_size)
    rand_x = x_vals_train[rand_index]
    rand_y = np.transpose([y_vals_train[rand_index]])
    sess.run(train_step, feed_dict={x_data: rand_x, y_target: rand_y})
temp_loss = sess.run(loss, feed_dict={x_data: rand_x, y_target: rand_y})
    loss_vec.append(temp_loss)
    temp_acc_train = sess.run(accuracy, feed_dict={x_data: x_vals_train, y_target: np.transpose([y_vals_train])})
    train_acc.append(temp_acc_train)
    temp_acc_test = sess.run(accuracy, feed_dict={x_data: x_vals_test, y_target: np.transpose([y_vals_test])})
    test_acc.append(temp_acc_test)
    if (i+1)%150==0:
        
        print('step ',i+1,'>>','Loss = ' + str(temp_loss),'acc train = '+ str(temp_acc_train),'acc test = '+ str(temp_acc_test))
>>
step  150 >> Loss = 4.561244 acc train = 0.3630435 acc test = 0.37012988
step  300 >> Loss = 3.210237 acc train = 0.40869564 acc test = 0.4025974
step  450 >> Loss = 3.7815006 acc train = 0.47608694 acc test = 0.46103895
step  600 >> Loss = 1.6495883 acc train = 0.5673913 acc test = 0.5649351
step  750 >> Loss = 1.2914287 acc train = 0.6152174 acc test = 0.5649351
step  900 >> Loss = 1.0265688 acc train = 0.6717391 acc test = 0.64935064
step  1050 >> Loss = 0.67162085 acc train = 0.7 acc test = 0.6883117
step  1200 >> Loss = 0.8674298 acc train = 0.71304345 acc test = 0.71428573
step  1350 >> Loss = 0.8931578 acc train = 0.7195652 acc test = 0.72077924
step  1500 >> Loss = 0.66052383 acc train = 0.7326087 acc test = 0.71428573
step  1650 >> Loss = 0.547229 acc train = 0.73695654 acc test = 0.74025977
step  1800 >> Loss = 0.51166385 acc train = 0.73695654 acc test = 0.74025977
step  1950 >> Loss = 0.6195813 acc train = 0.7456522 acc test = 0.75974023
step  2100 >> Loss = 0.53968793 acc train = 0.7521739 acc test = 0.7532467
step  2250 >> Loss = 0.72515863 acc train = 0.76521736 acc test = 0.76623374
step  2400 >> Loss = 0.56586355 acc train = 0.7782609 acc test = 0.77272725
step  2550 >> Loss = 0.47090885 acc train = 0.7826087 acc test = 0.78571427
step  2700 >> Loss = 0.40626645 acc train = 0.7847826 acc test = 0.77922076
step  2850 >> Loss = 0.42814052 acc train = 0.79565215 acc test = 0.78571427
step  3000 >> Loss = 0.4891444 acc train = 0.79565215 acc test = 0.78571427
step  3150 >> Loss = 0.32489073 acc train = 0.7978261 acc test = 0.78571427
step  3300 >> Loss = 0.50690985 acc train = 0.7978261 acc test = 0.7987013
step  3450 >> Loss = 0.41960496 acc train = 0.8021739 acc test = 0.7922078
step  3600 >> Loss = 0.5916505 acc train = 0.7978261 acc test = 0.7987013
step  3750 >> Loss = 0.40503561 acc train = 0.7978261 acc test = 0.7987013
step  3900 >> Loss = 0.36729535 acc train = 0.8 acc test = 0.78571427
step  4050 >> Loss = 0.5672592 acc train = 0.7978261 acc test = 0.7987013
step  4200 >> Loss = 0.35195124 acc train = 0.8021739 acc test = 0.7987013
step  4350 >> Loss = 0.4687969 acc train = 0.8086957 acc test = 0.8051948
step  4500 >> Loss = 0.41790414 acc train = 0.8108696 acc test = 0.8181818
step  4650 >> Loss = 0.5073402 acc train = 0.8130435 acc test = 0.8181818
step  4800 >> Loss = 0.35091034 acc train = 0.8130435 acc test = 0.7987013
step  4950 >> Loss = 0.33303505 acc train = 0.8130435 acc test = 0.8116883
step  5100 >> Loss = 0.35343492 acc train = 0.8130435 acc test = 0.8051948
step  5250 >> Loss = 0.42337453 acc train = 0.8130435 acc test = 0.8116883
step  5400 >> Loss = 0.40385827 acc train = 0.8152174 acc test = 0.8116883
step  5550 >> Loss = 0.44304913 acc train = 0.8130435 acc test = 0.8051948
step  5700 >> Loss = 0.39460662 acc train = 0.81956524 acc test = 0.8116883
step  5850 >> Loss = 0.40148938 acc train = 0.82173914 acc test = 0.8116883
step  6000 >> Loss = 0.44275898 acc train = 0.81956524 acc test = 0.8116883

Производительность модели дисплея

Следующие блоки кода иллюстрируют, как построить график потерь кросс-энтропии и точности обучающего и тестового набора с помощью matplotlib:

%matplotlib inline
# Plot loss over time
plt.plot(loss_vec, 'k-')
plt.title('Cross Entropy Loss per Generation')
plt.xlabel('Generation')
plt.ylabel('Cross Entropy Loss')
plt.show()
# Plot train and test accuracy
plt.plot(train_acc, 'k-', label='Train Set Accuracy')
plt.plot(test_acc, 'r--', label='Test Set Accuracy')
plt.title('Train and Test Accuracy')
plt.xlabel('Generation')
plt.ylabel('Accuracy')
plt.legend(loc='lower right')
plt.show()

>>

Запустить в Google Colab

%matplotlib inline