📜  使用Perceptron网络的OR门(1)

📅  最后修改于: 2023-12-03 15:06:52.875000             🧑  作者: Mango

用Perceptron网络实现OR门

Perceptron是一种基本的神经网络模型,它可以对一组输入进行二分类。在本文中,我们将学习如何使用Perceptron来实现逻辑门中的OR门。

什么是OR门?

OR门是一种逻辑门,其输出结果为两个输入信号的逻辑“或”运算结果。它具有以下真值表:

|输入1|输入2|输出| |----|----|----| |0|0|0| |0|1|1| |1|0|1| |1|1|1|

Perceptron网络

Perceptron网络是由一个带有权重的线性组合和一个激活函数组成的算法。它可以在输入值和权重之间进行简单的数学运算,并输出结果。

下面是Perceptron的基本公式:

output = activation(dot(input, weights) + bias)

其中,dot表示点积运算,bias为偏置项,activation是激活函数。

如果输入值和权重的点积加上偏置值大于特定的阈值,那么激活函数就会输出1,否则输出0。这个函数可以看作是生物神经元的模拟。

实现OR门

我们来使用Keras库来实现OR门。首先,我们需要导入库:

from keras.models import Sequential
from keras.layers.core import Dense
import numpy as np

接下来,我们需要构造输入集和输出集:

# 输入集
training_data = np.array([[0,0],[0,1],[1,0],[1,1]], "float32")

# 输出集
target_data = np.array([[0],[1],[1],[1]], "float32")

在这个例子中,我们定义了包含四组训练数据的输入集和对应的输出集。

现在,我们可以构造一个Sequential模型并添加一个Dense层来设置Perceptron:

model = Sequential()

model.add(Dense(1, input_dim=2, activation='sigmoid'))

这个模型很简单,只有一个输入和一个输出。因此,input_dim为2,output_dim为1,激活函数为Sigmoid函数。

接下来,让我们对模型进行编译:

model.compile(loss='mean_squared_error',
              optimizer='adam',
              metrics=['binary_accuracy'])

在这个例子中,我们使用均方误差来定义损失函数,使用Adam优化器来优化网络,并用二分类准确率作为评估指标。

现在,让我们用训练数据训练这个模型:

model.fit(training_data, target_data, epochs=500, verbose=2)

在这个模型中,我们使用了500 epochs进行训练,并使用verbose=2来显示训练过程。

最后,让我们测试这个模型,看看它是否能够正确的对OR门进行建模:

print(model.predict(training_data).round())

这个代码行为我们展示了模型在测试集上的预测结果,使用round()四舍五入为整数。

下面是完整代码:

from keras.models import Sequential
from keras.layers.core import Dense
import numpy as np 

# 输入集
training_data = np.array([[0,0],[0,1],[1,0],[1,1]], "float32")

# 输出集
target_data = np.array([[0],[1],[1],[1]], "float32")

# 构造模型
model = Sequential()

model.add(Dense(1, input_dim=2, activation='sigmoid'))

# 编译模型
model.compile(loss='mean_squared_error',
              optimizer='adam',
              metrics=['binary_accuracy'])

# 训练模型
model.fit(training_data, target_data, epochs=500, verbose=2)

# 测试模型
print(model.predict(training_data).round())

执行这段代码,它的输出结果应该为:

[[0.]
 [1.]
 [1.]
 [1.]]

这证明了我们的Perceptron网络可以正确地对OR门进行建模。