65.9K
CodeProject 正在变化。 阅读更多。
Home

TensorFlow 教程 4:创建神经网络

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (1投票)

2018 年 10 月 16 日

CPOL

3分钟阅读

viewsIcon

7384

作者:Dante Sblendorio

什么是神经网络?如何创建它?请继续阅读以了解详情。下面,我将解释使用 TensorFlow 设置神经网络的基本知识。

神经网络由三个关键组成部分组成:输入层、隐藏层(们)和输出层。每一层都有任意数量的节点(或神经元)。在上一节的示例中,输入层是 const1const2。矩阵加法可以被认为是隐藏层,输出层是输出。对于我们的葡萄酒数据,输入数据是 13 个化学特征,输出层是 Class。隐藏层可以被认为是一组复杂的数学函数,它们充当过滤器,提取确定正确 Class 的相关特征。神经网络的结构受到生物学的启发,特别是人脑中的神经连接。为了本文的目的,我不会深入探讨隐藏层(们)的数学结构。将它视为从数据中提取隐藏含义的数学“黑盒”就足够了。(但是,如果您想了解更多信息,这里 是一本关于神经网络和深度学习的全面在线教科书。)

我们将数据集分为训练集和测试集。这使我们能够“训练”隐藏层内的数学运算符,使其收敛到理想值,从而根据每个观测值的 13 个特征正确预测正确的 Class。然后我们将测试集注入神经网络并评估准确性,以确定网络的训练程度。以这种方式分割数据提供了一种避免过度拟合或欠拟合数据的方法,从而给出网络准确性的真实估计。为了准备 TensorFlow 的数据,我们进行一些轻微的操作。

from sklearn.model_selection import train_test_split

#this prepares our Class variable for the NN
def convertClass(val):
   if val == 1:
       return [1, 0, 0]
   elif val == 2:
       return [0, 1, 0]
   else:
       return [0, 0, 1]
   
Y = wine_df.loc[:,'Class'].values
Y = np.array([convertClass(i) for i in Y])
X = wine_df.loc[:,'Alcohol':'Proline'].values

#we split the dataset into a test and training set
train_x, test_x, train_y, test_y = train_test_split(X,Y , test_size=0.3, random_state=0)
train_x = train_x.transpose()
train_y = train_y.transpose()
test_x = test_x.transpose()
test_y = test_y.transpose()

现在数据准备好了,我们定义几个函数,它们构成了神经网络的基础。首先,我们定义一个函数来建立网络的初始参数。在这里,我们还定义了每个隐藏层中的节点数量(我选择使用两个隐藏层)。由于 Class 有三个可能的值,因此输出层有三个节点。接下来,我们定义一个前向传播函数。这所做的全部就是将 13 个特征通过网络发送,并使它们受到隐藏层内的数学运算的影响。

我们还需要定义一个成本函数。这是一个关键函数,它使我们能够“训练”网络。它是一个单一的值,描述了网络预测正确 Class 的效果。如果成本值很高,数学运算符会进行调整,并且数据会再次馈送到网络中。数据会馈送到网络中,直到成本值收敛。

def init_parameters(num_input_features):

   num_hidden_layer =  32
   num_hidden_layer_2 = 16
   num_output_layer_1 = 3
   
   tf.set_random_seed(1)
   W1 = tf.get_variable("W1", [num_hidden_layer, num_input_features], initializer = tf.contrib.layers.xavier_initializer(seed=1))
   b1 = tf.get_variable("b1", [num_hidden_layer, 1], initializer = tf.zeros_initializer())
   W2 = tf.get_variable("W2", [num_hidden_layer_2, num_hidden_layer], initializer = tf.contrib.layers.xavier_initializer(seed=1))
   b2 = tf.get_variable("b2", [num_hidden_layer_2, 1], initializer = tf.zeros_initializer())
   W3 = tf.get_variable("W3", [num_output_layer_1, num_hidden_layer_2], initializer = tf.contrib.layers.xavier_initializer(seed=1))
   b3 = tf.get_variable("b3", [num_output_layer_1, 1], initializer = tf.zeros_initializer())
   
   parameters = {"W1": W1,
                 "b1": b1,
                 "W2": W2,
                 "b2": b2,
                 "W3": W3,
                 "b3": b3}
   
   return parameters
			
def for_prop(X, parameters):
			
   W1 = parameters['W1']
   b1 = parameters['b1']
   W2 = parameters['W2']
   b2 = parameters['b2']
   W3 = parameters['W3']
   b3 = parameters['b3']
   
   # propagates values through NN using Rectified Linear Unit as activation function          
   Z1 = tf.add(tf.matmul(W1, X), b1)                     
   A1 = tf.nn.relu(Z1)                                    
   Z2 = tf.add(tf.matmul(W2, A1), b2)                     
   A2 = tf.nn.relu(Z2)                                   
   Z3 = tf.add(tf.matmul(W3, A2), b3)                    
   return Z3

def c(Z3, Y):
   logits = tf.transpose(Z3)
   labels = tf.transpose(Y)
   cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=labels))
   return cost

我们还需要定义一个函数,该函数生成训练集内观测值的随机子集。我之前提到数据被馈送到神经网络中,直到成本值收敛;每次迭代都会从总训练集中选择一个随机子样本并注入到网络中。在这个函数中,我们创建子样本批次。

def rand_batches(X, Y, batch_size = 128, seed = 0):
   m = X.shape[1]
   batches = []
   np.random.seed(seed)
   
   # shuffle
   permutation = list(np.random.permutation(m))
   shuffled_X = X[:, permutation]
   shuffled_Y = Y[:, permutation].reshape((Y.shape[0],m))

   # partition the shuffled data
   num_batches = math.floor(m/batch_size)
   for k in range(0, num_batches):
       batch_X = shuffled_X[:, k * batch_size : k * batch_size + batch_size]
       batch_Y = shuffled_Y[:, k * batch_size : k * batch_size + batch_size]
       batch = (batch_X, batch_Y)
       batches.append(batch)
   
   # handle end case
   if m % batch_size != 0:
       batch_X = shuffled_X[:, num_batches * batch_size : m]
       batch_Y = shuffled_Y[:, num_batches * batch_size : m]
       batch = (batch_X, batch_Y)
       batches.append(batch)
   
   return batches

要生成挑战 4 的参赛代码,请将以下代码粘贴到您的 Jupyter notebook 中

member_number = 12345678

one = [member_number, int(member_number/5), int(member_number/100)]

two = [0.02, 0.05, 0.08]

a = tf.placeholder(tf.float32, shape=(3))

b = tf.placeholder(tf.float32, shape=(3))

result = tf.tensordot(a, b, 1)

with tf.Session() as sess:

   print(int(result.eval(feed_dict={a: one, b: two})))

在运行代码之前,将 12345678 替换为您的 CodeProject 会员号码。打印出的数字将是您本次挑战的参赛代码。请点击 这里 输入竞赛参赛代码。

© . All rights reserved.