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