自编码器和分类器python

Python011

自编码器和分类器python,第1张

你好,下面是一个keras的softmax分类器+自编码器的python代码。你需要安装最新的theano1.0.4才可以跑。

import os

os.environ['KERAS_BACKEND'] = 'theano'

import keras

from keras.datasets import mnist

from keras.models import Model

from keras.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense, UpSampling2D

batch_size = 128

num_classes = 10

epochs = 12

# input image dimensions

img_rows, img_cols = 28, 28

# Data 

(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1).astype('float32') / 255

x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1).astype('float32') / 255

y_train = keras.utils.to_categorical(y_train, num_classes)

y_test = keras.utils.to_categorical(y_test, num_classes)

# Convolutional Encoder

input_img = Input(shape=(img_rows, img_cols, 1))

conv_1 = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)

pool_1 = MaxPooling2D((2, 2), padding='same')(conv_1)

conv_2 = Conv2D(8, (3, 3), activation='relu', padding='same')(pool_1)

pool_2 = MaxPooling2D((2, 2), padding='same')(conv_2)

conv_3 = Conv2D(8, (3, 3), activation='relu', padding='same')(pool_2)

encoded= MaxPooling2D((2, 2), padding='same')(conv_3)

# Classification

flatten = Flatten()(encoded)

fc = Dense(128, activation='relu')(flatten)

softmax = Dense(num_classes, activation='softmax', name='classification')(fc)

# Decoder

conv_4 = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)

up_1 = UpSampling2D((2, 2))(conv_4)

conv_5 = Conv2D(8, (3, 3), activation='relu', padding='same')(up_1)

up_2 = UpSampling2D((2, 2))(conv_5)

conv_6 = Conv2D(16, (3, 3), activation='relu')(up_2)

up_3 = UpSampling2D((2, 2))(conv_6)

decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same', name='autoencoder')(up_3)

model = Model(inputs=input_img, outputs=[softmax, decoded])

model.compile(loss={'classification': 'categorical_crossentropy', 

                    'autoencoder': 'binary_crossentropy'},

              optimizer='adam',

              metrics={'classification': 'accuracy'})

model.fit(x_train, 

          {'classification': y_train, 'autoencoder': x_train},

          batch_size=batch_size,

          epochs=epochs,

          validation_data= (x_test, {'classification': y_test, 'autoencoder': x_test}),

          verbose=1)

python绘制预测模型校准图可以使用校准曲线,因为预测一个模型校准的最简单的方法是通过一个称为“校准曲线”的图(也称为“可靠性图”,reliability diagram)。

这个方法主要是将观察到的结果通过概率划分为几类(bin)。因此,属于同一类的观测值具有相近的概率。

对于每个类,校准曲线将预测这个类的平均值,然后将预测概率的平均值与理论平均值(即观察到的目标变量的平均值)进行比较。

你只需要确定类的数量和以下两者之间的分类策略即可:

1、“uniform”,一个0-1的间隔被分为n_bins个类,它们都具有相同的宽度。

2、“quantile”,类的边缘被定义,从而使得每个类都具有相同数量的观测值。

假设你的模型具有良好的精度,则校准曲线将单调增加。但这并不意味着模型已被正确校准。实际上,只有在校准曲线非常接近等分线时(即下图中的灰色虚线),您的模型才能得到很好的校准,因为这将意味着预测概率基本上接近理论概率。

python绘制预测模型中如何解决校准错误:

假设你已经训练了一个分类器,该分类器会产生准确但未经校准的概率。概率校准的思想是建立第二个模型(称为校准器),校准器模型能够将你训练的分类器“校准”为实际概率。

因此,校准包括了将一个一维矢量(未校准概率)转换为另一个一维矢量(已校准概率)的功能。

两种常被用作校准器的方法:

1、保序回归:一种非参数算法,这种非参数算法将非递减的自由格式行拟合到数据中。行不会减少这一事实是很重要的,因为它遵从原始排序。

2、逻辑回归:现在有三种选择来预测概率:普通随机森林、随机森林 + 保序回归、随机森林 + 逻辑回归。

1、可能是光线太昏暗。

2、建议用户在光线充足的地方进行人脸识别。

3、如果用户戴着眼镜。

4、建议将眼镜摘下后再进行人脸识别。

5、如果化了妆,需要卸妆后再进行人脸识别。

6、微信人脸识别一般用于解封账号。

7、如果不能识别,建议切换其他验证方式。

8、在人脸识别页面可以点击“遇到问题,尝试其他方式”。

9、如果以上方法都不能解决问题,建议咨询微信客服官方解决。

微信人脸识别可视化的实现

DateFromWebChat (从网页版微信窗口下载好友头像)

AI (识别模块,主要用于识别好友头像是否为人脸,并且计算人脸的数量与头像的总数且return)

DateVisul (数据可视化模块,用与AI模块返回参数的可视化)

union(将整合以上三个模块的顶层模块)

知识准备

python中opencv图像处理模块的使用(主要是CascadeClassifier级联图像分类器与 detectMultiScale人脸识别函数的使用)

python中os模块的使用(主要涉及os.imread灰度图像处理与os.listdir(path)获取路径下文件这两个函数的使用)

sys模块的使用(sys.stdout.flush()缓冲器一次返回一个值)

python中Matplotlib图形框架的使用(涉及饼图plt.pie的使用与使用matplotlib.font_manager.FontProperties设置文字显示方式)