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()
>>
%matplotlib inline