我是 AI 的初学者,我正在尝试使用 python 从头开始编写我自己的 AI 以修复我在理论上看到的问题。当我手动完成所有操作时,它工作正常,但是当我尝试创建更动态的网络时,它不会显示结果。
import numpy as np
class Network:
#inputs: n of inputs
#hidden: an array where length is the number of layers and the value the number of neurons
#outputs: n of outputs
dna = {}
def __init__(self, inputs, hidden, outputs):
if len(hidden) >= 1:
self.dna['w1'] = np.random.randn(inputs, hidden[0])
self.dna['b1'] = np.zeros((1,hidden[0]))
if len(hidden) == 1:
self.dna['w2'] = np.random.randn(hidden[0], outputs)
self.dna['b2'] = np.zeros((1, outputs))
self.dna['size'] = 2
elif len(hidden) == 2:
self.dna['w2'] = np.random.randn(hidden[0], hidden[1])
self.dna['b2'] = np.zeros((1, hidden[1]))
self.dna['w3'] = np.random.randn(hidden[1], outputs)
self.dna['b3'] = np.zeros((1, outputs))
self.dna['size'] = 3
else:
for i in range(len(hidden)):
if i == hidden[len(hidden) - 1 ]:
self.dna[self.__weigther(1 + i)] = np.random.randn(hidden[i], outputs)
self.dna[self.__biaer(1 + i)] = np.zeros((1, outputs))
else:
self.dna[self.__weigther(1 + i)] = np.random.randn(hidden[i], hidden[i + 1])
self.dna[self.__biaer(1 + i)] = np.zeros((1, hidden[i + 1]))
self.dna[self.__weigther(len(hidden) + 1)] = np.random.randn(hidden[len(hidden) - 1], outputs)
self.dna[self.__biaer(len(hidden) + 1)] = np.zeros((1, outputs))
self.dna['size'] = len(hidden) + 1
else:
self.dna['w1'] = np.random.randn(inputs, outputs)
self.dna['b1'] = np.zeros((1, outputs))
self.dna['size'] = 1
def __weigther(self, i):
return "w" + str(i)
def __biaer(self, i):
return "b" + str(i)
def size(self):
return self.dna.get("size")
def printDNA(self):
print(self.dna)
def sigmoid(self, x):
return 1/(1+np.exp(-x))
def sigmoider(self, x):
return self.sigmoid(x)*(1-self.sigmoid(x))
def __feedfoward(self, dataset):
size = self.size()
output = dataset
no_sigs = [dataset]
sigs = [0]
for i in range(1, size + 1):
output = np.dot(output, self.dna[self.__weigther(i)]) + self.dna[self.__biaer(i)]
no_sigs.append(output)
output = self.sigmoid(output)
sigs.append(output)
return [no_sigs, sigs]
def predict(self, inputs):
outputs = self.__feedfoward(inputs)[1]
print(outputs[len(outputs) - 1])
return outputs[len(outputs) - 1]
def train(self, epoch, dataset, answers, lr):
for i in range(epoch):
outputs = self.__feedfoward(dataset)
output = outputs[1][len(outputs[1]) - 1]
error = output - answers
cost = error
deriv = self.sigmoider(outputs[0][len(outputs[0]) - 1])
delta = np.dot(outputs[1][len(outputs[1]) - 1].T, cost * deriv)
deltas = [delta]
for l in range(len(outputs), 2, -1):
if l == 2:
dcost = error * deriv
costh = np.dot(dcost, self.dna[self.__weigther(1)].T)
set = dataset
hd = np.dot(set.T, self.sigmoider(outputs[0][1]) * costh)
deltas.append(hd)
else:
dcost = error * deriv
costh = np.dot(dcost, self.dna[self.__weigther(l - 1)].T)
set = outputs[0][l]
hd = np.dot(set.T, self.sigmoider(outputs[0][l]) * costh)
deltas.append(hd)
for k in range(0, len(deltas)):
self.dna[self.__weigther(k + 1)] -= lr * deltas[k]
for num in deltas[k]:
self.dna[self.__biaer(k + 1)] -= lr * num
这是测试文件:
import Network as Network import numpy as np
dataset = np.array([
[0, 0],
[0, 1],
[1, 0],
[1, 1] ])
output = np.array([
[0],
[0],
[0],
[1] ])
net = Network.Network(2, [2], 1) net.predict([0, 0]) net.predict([0,
1]) net.predict([1, 0]) net.predict([1, 1]) print("#######")
net.train(20, dataset, output, 0.5) net.predict([0, 0])
net.predict([0, 1]) net.predict([1, 0]) net.predict([1, 1])
控制台显示它没有太大变化:
[[0.51265837]]
[[0.48473668]]
[[0.50538876]]
[[0.48698964]]
#######
[[0.50487598]]
[[0.48972348]]
[[0.50067702]]
[[0.49862653]]
改变纪元数和学习率不影响。提前致谢。