副问题[/!--empirenews.page--]
神经收集(NNs)可以在不知道用显式算法执行事变的环境下被计划和实习于特定的使命,许多人都对此暗示赞叹。譬喻,闻名的手写体数字辨认教程很轻易执行,但其背后的逻辑照旧潜匿在神经收集下,仅能通过条理化布局、权值和激活函数略知一二。
图片来历:Unsplash
本文通过神经收集透明原则来显现其“黑盒常识”,为此来检讨一个布尔异或函数的神经收集。起首,操作已知异或属性进程结构了一个自底向上的神经收集,即清楚包括已知的代数相关。在第二步中行使TensorFlow Keras从浅显图形化编程器材到异或逻辑运算实习神经收集。
最后较量两种要领。将Keras神经收集解析为布尔组件,发明逻辑配置与第一步中结构的神经收集差异。被实习的神经收集发明白行使差异布尔函数的另一种异或运算暗示要领。
这另一种异或公式在数学规模不是未知的,但至少很新颖。这或者表白神经收集可以缔造新的常识。但要提取它,必需可以或许将神经收集的配置和参数转化为显式法则。
自底向上结构异或运算神经收集(XOR NN)
异或运算是由映射界说的布尔函数,
- XOR (0,0) = XOR (1,1) = 0
- XOR (1,0) = XOR (0,1) = 1
为异或运算结构一个已知的神经收集或谷歌标识列
- XOR (x,y) = AND ( NAND (x,y) , OR (x,y) )
这很有辅佐,由于操纵符AND、NAND(而非AND)和OR是众所周知的,而且都可以用简朴的神经收集来暗示,个中有2个输入和1个输出结点、偏移量和sigmoid激活函数。
布尔函数操纵符的神经收集
在此基本上可通过毗连NAND、AND和OR的NNs来结构异或运算神经收集。以是异或酿成了一个三层神经收集。
异或运算的神经收集
运送也许的输入设置并搜查输出(本文行使Excel事变表)。别离获得有用的(0,0)、(1,1)的0.0072以及(0,1)、(1,0)的0.9924。
可以用以下异或运算的暗示来建构其他的神经收集:
- XOR (x,y) = OR ( AND ( NOT(x) , y ) , AND ( x , NOT(y) ) )
- XOR (x,y) = NAND ( NAND ( x , NAND ( x,y) ) , NAND ( y , NAND ( x,y) ) )
然而这些标识列导致了更伟大的收集。
另外,因为异或运算不能通过线性可分(且激活函数严酷单调),因此,不行能成立两层的神经收集。
但大概尚有其他要领可以构建异或运算的神经收集呢?下一节将通过实习神经收集来探求另一种办理方案。
行使TensorFlow Keras构建异或神经收集
Keras是一个成果强盛且易于行使的神经收集库。上一节中成立了一个三层的2-2-1模子,并与之前建构的神经收集举办了较量。
行使梯度降落优化器与进修率1和均方偏差丧失函数的偏差反向撒播,这是建构神经收集的尺度要领。
以下是Python的代码片断:
- # Generate NN for XOR operation
- # input layer: <NODES> nodes, one for each bit (0 = false and +1 = true)
- # output layer: 1 node for result (0 = false and +1 = true)
- # Use sigmoid activation function, gradient descent optimizer and mean squared error loss function
- # Last update: 28.05.2019
-
- import tensorflow as tf
- import numpy as np
- import matplotlib.pyplot as plt
-
- # Define model
- nodes = 2
- model = tf.keras.Sequential()
- model.add(tf.keras.layers.Dense(nodes, input_dim=2, activation=tf.nn.sigmoid))
- model.add(tf.keras.layers.Dense(1, activation=tf.nn.sigmoid))
- model.compile(optimizer=tf.train.GradientDescentOptimizer(1), loss=tf.keras.losses.mean_squared_error, metrics=['binary_accuracy'])
- model.summary()
-
- # Generate train & test data
- epochs = 10000
- data_in = np.array([[0,0],[0,1],[1,0],[1,1]])
- data_out = np.array([0,1,1,0])
-
- # Train model
- history = model.fit(data_in, data_out, epochsepochs=epochs, verbose=0)
-
- # Analysis of training history
- for key in history.history.keys():
- plt.scatter(range(epochs), history.history[key], s=1)
- plt.ylabel(key)
- plt.xlabel('epochs')
- plt.show()
-
- # Predict with model
- result = model.predict(data_in)
-
- # Print results
- def printarray(arr):
- return np.array2string(arr).replace('n','')
-
- print()
- print('input', printarray(data_in))
- print('output (calculation)', printarray(data_out))
- print('output (prediction) ', printarray(result))
- print('output (pred. norm.)', printarray(np.round(result)))
-
- # Get weights of model
- print()
- print(model.get_weights())
(编辑:河北网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|