python神经网络,女生颜值打分器(二)

python讨论qq群:996113038


导语:

上一次给大家讲过“python颜值预测(一)”。讲到了特征提取。今天给大家继续讲一讲神经网络评估女生颜值的方法。这一节主要讲的是神经网络的结构以及原理。


代码及相关资源获取:

关注“python趣味爱好者”公众号,回复“颜值2”获取源代码。


开发工具:

python3.6.4

需要的第三方库:

import pandas as pd
from scipy.misc import imread
import matplotlib.pyplot as plt # plt 用于显示图片
import numpy as np
import cv2
import dlib
import os
import math

效果演示:

效果就是放一张女生的图片在当前文件夹下面,改名为test。然后运行python程序。就可以得到这个女生颜值分数,0是最低分,5是最高分。


基本原理:

上一节给大家讲的是提取特征点的原理,我们用了dlib来提取64人脸64个特征点,然后做一些平移,旋转等各种操作。

今天讲一讲核心的神经网络代码构成和原理。

我们用到的是最简单的BP神经网络。层数可以自己设定,完全是自己用矩阵搭建起来的,没有用到那些专门的工具箱。

class NeuralNetwork:
    def __init__(self, layers, activation='tanh'):
        if activation == 'logistic':
            self.activation = logistic
            self.activation_deriv = logistic_derivative
        elif activation == 'tanh':
            self.activation = tanh
            self.activation_deriv = tanh_deriv


        self.weights = []
        for i in range(1, len(layers) - 1):
            self.weights.append(
                (2 * np.random.random((layers[i - 1] + 1, layers[i] + 1)) - 1) * 0.25)
        self.weights.append(
            (2 * np.random.random((layers[-2] + 1, layers[-1])) - 1) * 0.25)

这就是定义这个神经网络。里面的权值和阈值都是随机数直接生成的,用np格式存储起来,激活函数可以自己选择。

本质上神经网络就是一个维度非常高的拟合(个人观点)。调节那些权值和阈值参数实际上可以让拟合的程度越来越高,越来越接近真实预测标准。所以,网络层数越多,训练次数越多,相对来讲,神经网络的效果也会越好。


部分代码:

主要的核心代码就是负反馈调节那一部分。

    def fit(self, X, y, learning_rate=0.2, epochs=100):
        X = np.atleast_2d(X)
        temp = np.ones([X.shape[0], X.shape[1] + 1])
        temp[:, 0:-1] = X  # adding the bias unit to the input layer
        X = temp
        y = np.array(y)


        for k in range(epochs):
            i = np.random.randint(X.shape[0])
            a = [X[i]]
            for l in range(len(self.weights)):  # going forward network, for each layer
                a.append(self.activation(np.dot(a[l], self.weights[l])))
            error = y[i] - a[-1]  # Computer the error at the top layer
            # For output layer, Err calculation (delta is updated error)
            deltas = [error * self.activation_deriv(a[-1])]
            # Staring backprobagation
            for l in range(len(a) - 2, 0, -1):
                deltas.append(deltas[-1].dot(self.weights[l].T)
                              * self.activation_deriv(a[l]))
            deltas.reverse()
            for i in range(len(self.weights)):
                layer = np.atleast_2d(a[i])
                delta = np.atleast_2d(deltas[i])
                self.weights[i] += learning_rate * layer.T.dot(delta)

作用就是不断调整神经网络的参数,不断优化网络。


              感谢大家观看,有钱的老板可以打赏一下小编哦!

扫描下方二维码,关注公众号

参考资料:

图片来源:https://www.pexels.com/photo/woman-standing-and-doing-pose-beside-lake-1468379/

参考来源:https://www.cnblogs.com/xuyiqing/p/8797048.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值