IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 全链接神经网络 -> 正文阅读

[人工智能]全链接神经网络

import numpy as np

delta = 1.0

class Neuron:
    def __init__(self, lastLayerNodeNumber: int) -> None:
        self.n = lastLayerNodeNumber
        self.w = [np.random.rand() for _ in range(lastLayerNodeNumber)]

    @staticmethod
    def sigmod(x: float) ->float:
        return 1.0 / (1.0 + np.exp(x))

    def net(self, x: list) -> float:
        x = np.array(x)
        return np.inner(x, self.w)

    def activate(self, x: list) ->float:
        if len(x) != self.n:
            print('神经元的输入不合法!')
            exit(0)
        return self.sigmod(self.net(x))
    
    def print(self) -> None:
        print(self.w)


class Layer():
    def __init__(self, neuronNum: int, lastLayerNeuronNum: int) -> None:
        self.neuronNum = neuronNum
        self.neurons = [Neuron(lastLayerNeuronNum) for _ in range(neuronNum)]
        self.lastLayerNeuronNum = lastLayerNeuronNum

    def output(self, lastLayerOutput: list) -> list:
        if len(lastLayerOutput) != self.lastLayerNeuronNum:
            print('网络层的输入不合法!')
            exit(0)
        res = []
        for i in range(self.neuronNum):
            t = self.neurons[i].activate(lastLayerOutput)
            res.append(t)
        return res
    
    def setOmega(self, omega: list) -> None:
        for i in range(self.neuronNum):
            for j in range(self.neurons[i].n):
                self.neurons[i].w[j] = self.neurons[i].w[j] - delta * omega[i][j]
    
    def print(self) -> None:
        for i in range(self.neuronNum):
            self.neurons[i].print()


class NeuralNetwork():
    def __init__(self, inputNum: int, hiddenLayerNeuronNum: int, outputLayerNeuronNum: int) -> None:
        self.inputNum = inputNum
        self.hiddenLayerNeuronNum = hiddenLayerNeuronNum
        self.outputNum = outputLayerNeuronNum
        self.hiddenLayer = Layer(hiddenLayerNeuronNum, inputNum)
        self.outputLayer = Layer(outputLayerNeuronNum, hiddenLayerNeuronNum)

    def checkInputAndOutput(self, input: list=None, output: list=None) -> None:
        if input != None and len(input) != self.inputNum:
            print('训练输入与设置不符!')
            exit(0)
        if output != None and len(output) != self.outputNum:
            print('训练输出与设置不符!')
            exit(0)

    def getHiddenLayerOutput(self, input: list):
        return self.hiddenLayer.output(input)

    def getOutputLayerOutput(self, input: list):
        hiddenLayerOutput = self.getHiddenLayerOutput(input)
        res = self.outputLayer.output(hiddenLayerOutput)
        for i in range(len(res)):
            res[i] = res[i] * 2.0 - 1.0     #####
        return res

    def partialErrorNet3k(self, input: list, output: list, kthNeuron: int) -> float:
        outputLayerOutput = self.getOutputLayerOutput(input)
        y3k = outputLayerOutput[kthNeuron]
        tk = output[kthNeuron]
        return 2.0 * (y3k - tk) * y3k * (1.0 - y3k)

    # ithLayer  1: 隐藏层 2: 输出层
    def getOmega(self, ithLayer: int, jthNeuron: int, kthOmega: int) -> float:
        if ithLayer == 2:
            layer = self.hiddenLayer
        else:
            layer = self.outputLayer
        return layer.neurons[jthNeuron].w[kthOmega]

    def getGradient3ij(self, input: list, output: list, ithNeuron: int, jthOmega: int) -> float:
        outputLayerOutput = self.getOutputLayerOutput(input)
        hiddenLayerOutput = self.getHiddenLayerOutput(input)
        y3i = outputLayerOutput[ithNeuron]
        # y2j = hiddenLayerOutput[jthOmega]
        ti = output[ithNeuron]
        return 2.0 * (y3i - ti) * y3i * (1.0 - y3i)

    def getGradient2ij(self, input: list, output: list, ithNeuron: int, jthOmega: int) -> float:
        partialErrorNet3k = []
        for i in range(self.outputNum):
            partialErrorNet3k.append(self.partialErrorNet3k(input=input, output=output, kthNeuron=i))
        s = 0.0
        for k in range(self.outputNum):
            s = s + partialErrorNet3k[i] * self.getOmega(3, k, ithNeuron)
        hiddenLayerOutput = self.getHiddenLayerOutput(input=input)
        y2i = hiddenLayerOutput[ithNeuron]
        # w2ij = self.getOmega(2, ithNeuron, jthOmega)
        # y1j = input[jthOmega]
        return s * y2i * (1 - y2i)
        # return s * y2i * (1 - y2i) * y1j

    def error(self, input: list, output: list) -> float:
        outputLayerOutput = self.getOutputLayerOutput(input)
        err = 0.0
        for i in range(self.outputNum):
            err = err + (outputLayerOutput[i] - output[i]) ** 2
        return err

    def train(self, input: list, output: list) -> None:
        hiddenLayerGradient = []
        for i in range(self.hiddenLayerNeuronNum):
            layerGradient = []
            for j in range(self.inputNum):
                res = self.getGradient2ij(input=input, output=output, ithNeuron=i, jthOmega=j)
                layerGradient.append(res)
            hiddenLayerGradient.append(layerGradient)
        outputLayerGradient = []
        for i in range(self.outputNum):
            layerGradient = []
            for j in range(self.hiddenLayerNeuronNum):
                res = self.getGradient3ij(input=input, output=output, ithNeuron=i, jthOmega=j)
                layerGradient.append(res)
            outputLayerGradient.append(layerGradient)
        self.hiddenLayer.setOmega(hiddenLayerGradient)
        self.outputLayer.setOmega(outputLayerGradient)

    def print(self):
        print('Hidden layer:')
        self.hiddenLayer.print()
        print('Output layer:')
        self.outputLayer.print()


def main():
    nn = NeuralNetwork(inputNum=2, hiddenLayerNeuronNum=2, outputLayerNeuronNum=1)
    input = [[0.0, 0.0], [0.0, 1.0], [1.0, 0.0], [1.0, 1.0]]
    output = [[0.0], [0.0], [0.0], [1.0]]
    for i in range(4000):
        if i % 100 == 0:
            print(i)
        p = np.random.randint(0, len(input))
        nn.train(input=input[p], output=output[p])
    nn.print()

if __name__ == '__main__':
    main()
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-09-24 10:34:02  更:2021-09-24 10:35:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 12:36:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码