4 months ago

1.constant(常量构造函数)

cons = tf.constant(value=[1,2],dtype=tf.float32,shape=(1,2),name='testconst', verify_shape=False)

必须指定初始值,使用的时候直接调用
一旦指定,后期无法更改(如果使用原名称重新赋值的话,其实是重定向,就是另一个常量了)
作为计算图的起始节点,起到为整个网络传入初始数据的作用
非常底层,只是用来为占位符placeholder或变量Variable生成数据的

import tensorflow as tf
# 实现一个加法运算
a = tf.constant(3.0)
b = tf.constant(4.0)

sum = tf.add(a, b)

# 会话,默认只能运行默认的图,不能运行其它的(可以通过参数解决)
with tf.Session() as sess:
    print(sess.run[a,b,sum])

2.placeholder(占位符,函数)

tf.placeholder(dtype, shape=None, name=None) 

也是一种常量,创建的时候不需要指定初始值,需要在使用的时候指定
此函数可以理解为形参,用于定义过程,在执行的时候再赋具体的值,只能赋值Numpy的ndarray类型
可以多次使用,每次设置不同的初始值
通常,placeholder用于传入训练数据

import tensorflow as tf
import numpy.random as random

#占位符shape不设时会按传入参数自行匹配
node1 = tf.placeholder(tf.float32)  # , shape=[4, 5])
node2 = tf.placeholder(tf.float32)  # , shape=[4, 5])
op = tf.multiply(node1, node2)
session = tf.Session()
const1 = tf.constant(random.rand(4, 5))
const2 = tf.constant(random.rand(4, 5))
#可以传入初始化后的常量
print(session.run(op, {node1: session.run(const1), node2: session.run(const2)}))
#也可以直接传入张量,其实同初始化后的常量一致
print(session.run(op, {node1: random.rand(2, 3), node2: random.rand(2, 3)}))

3.Variable(变量,类)

tf.Variable(initial_value=None,trainable=True,collections=None,name=None)

创建时必须指定初始值
后期可以重新指定值,需要使用特定的方法
使用前需要初始化运行
通常,Variable用来设置我们需要得到的训练参数(例如权重w和截距b,所以有个trainable参数)

var = tf.Variable(tf.random_normal([2, 2], mean=0.0, stddev=1.0), name="var", trainable=True)
# 给变量赋一个新的值
var1 = var.assign([[2, 3], [4, 5]])
# 给变量做加法
var2 = var.assign_add([[1, 3], [4, 5]])
# 添加一个初始化变量的OP
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    # 运行初始化op
    sess.run(init_op)
    # 初始化变量var
    print(sess.run(var))
    # 在var的基础上赋新值给var1
    print(sess.run(var1))
    # var1赋值后发现var也发生了改变
    print(sess.run(var))
    # 在var的基础上做加法,赋值给新的变量var2
    print(sess.run(var2))
    # var2后发现var也发生了改变
    print(sess.run(var))   

参考资料:
TensorFlow学习笔记——节点(constant、placeholder、Variable)
Variable() placeholder() constant() 的区别
What's the difference between tf.placeholder and tf.Variable?

 
5 months ago

1.随机森林API介绍

sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion=’gini’, max_depth=None, bootstrap=True, random_state=None, min_samples_split=2)

随机森林分类器
n_estimators:integer,optional(default = 10)森林里的树木数量120,200,300,500,800,1200
criteria:string,可选(default =“gini”)分割特征的测量方法
max_depth:integer或None,可选(默认=无)树的最大深度 5,8,15,25,30
max_features="auto”,每个决策树的最大特征数量
If "auto", then max_features=sqrt(n_features).
If "sqrt", then max_features=sqrt(n_features) (same as "auto").
If "log2", then max_features=log2(n_features).
If None, then max_features=n_features.
bootstrap:boolean,optional(default = True)是否在构建树时使用放回抽样
min_samples_split:节点划分最少样本数
min_samples_leaf:叶子节点的最小样本数
超参数:n_estimator, max_depth, min_samples_split,min_samples_leaf

2.实现随机森林算法

from sklearn.ensemble import RandomForestClassifier
titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
def random_forest(titan):
    """
    随机森林进行乘客生存预测
    :return:
    """
    # 1、获取数据
    # titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")

    # 2、数据的处理
    x = titan[['pclass', 'age', 'sex']]

    y = titan['survived']

    # print(x , y)
    # 缺失值需要处理,将特征当中有类别的这些特征进行字典特征抽取
    x['age'].fillna(x['age'].mean(), inplace=True)

    # 对于x转换成字典数据x.to_dict(orient="records")
    # [{"pclass": "1st", "age": 29.00, "sex": "female"}, {}]

    dict = DictVectorizer(sparse=False)

    x = dict.fit_transform(x.to_dict(orient="records"))
    
    print(dict.get_feature_names())
    print(x)

    # 分割训练集合测试集
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)

    # 进行决策树的建立和预测
    rf = RandomForestClassifier(n_estimators=10, max_depth=5)

    rf.fit(x_train, y_train)

    # print("预测的准确率为:", rf.score(x_test, y_test))

    return rf.score(x_test, y_test)

3.多次迭代求取平均值

import matplotlib.pyplot as plt
def score_avg(func,num):
    score_sum=0
    a=[]
    b=[]
    for i in range(1,num+1):
        score_sum += func(titan)
        # 每10次查看一下准确率
        #if i%10==0:
        score_ave = score_sum/(i)
        a.append(i)
        b.append(score_ave)
    # 获取最终的准确率
    print(score_ave)
    # 将准确率变化过程展示出来
    plt.plot(a,b)
    plt.grid()
    plt.show()

4.运行结果

num=5000
score_avg(random_forest,num)


从1000次之后,准确率收敛到0.823
随机森林中有各种超参数,可以使用网格搜索进行调优

5.结论

1)在当前所有算法中,具有极好的准确率
2)集成学习方法可以应用于所有的算法,比如之前学的K近邻和朴素贝叶斯(可惜没有现成的API供调用)
3)集成学习方法可以把预测的准确性在原有算法的基础上提高1%-2%,运算复杂度大大提升,所以关键在于原有算法的准确性

 
5 months ago

1.使用经典数据集:泰坦尼克号乘客生存预测

titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")

2.实现决策树算法

from sklearn.tree import DecisionTreeClassifier
def decisioncls(titan):
    """
    决策树进行乘客生存预测
    :return:
    """
    # 1、获取数据
    #titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")

    # 2、数据的处理
    x = titan[['pclass', 'age', 'sex']]

    y = titan['survived']

    # print(x , y)
    # 缺失值需要处理,将特征当中有类别的这些特征进行字典特征抽取
    x['age'].fillna(x['age'].mean(), inplace=True)

    # 对于x转换成字典数据x.to_dict(orient="records")
    # [{"pclass": "1st", "age": 29.00, "sex": "female"}, {}]

    dict = DictVectorizer(sparse=False)

    x = dict.fit_transform(x.to_dict(orient="records"))
    
    print(dict.get_feature_names())
    print(x)

    # 分割训练集合测试集
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)

    # 进行决策树的建立和预测
    dc = DecisionTreeClassifier(max_depth=5)

    dc.fit(x_train, y_train)

    # print("预测的准确率为:", dc.score(x_test, y_test))
    # export_graphviz(dc, out_file="./tree.dot", feature_names=['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', '女性', '男性'])

    return dc.score(x_test, y_test)

3.多次迭代求取平均值

import matplotlib.pyplot as plt
def score_avg(func,num):
    score_sum=0
    a=[]
    b=[]
    for i in range(1,num+1):
        score_sum += func(titan)
        # 每10次查看一下准确率
        #if i%10==0:
        score_ave = score_sum/(i)
        a.append(i)
        b.append(score_ave)
    # 获取最终的准确率
    print(score_ave)
    # 将准确率变化过程展示出来
    plt.plot(a,b)
    plt.grid()
    plt.show()

4.运行结果

from sklearn.tree import DecisionTreeClassifier
from sklearn.feature_extraction import DictVectorizer
num=100
score_avg(decisioncls,num)


从第10次运算,准确率已经收敛到0.820

5.将决策树图形导出

1)sklearn.tree.export_graphviz() 该函数能够导出DOT格式
tree.export_graphviz(estimator, out_file='tree.dot’,feature_names=[ ' ', ' ' ])
在单次运行程序中加入以下代码

export_graphviz(dc, out_file="./tree.dot", feature_names=['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', '女性', '男性'])

2)工具graphviz: 能够将dot文件转换为pdf、png
ubuntu: sudo apt-get install graphviz
Mac: brew install graphviz
3)运行命令

dot -Tpng tree.dot -o tree.png

 
5 months ago

1.导入数据集

from sklearn.datasets import fetch_20newsgroups
news = fetch_20newsgroups(subset='all')

2.实现KNN算法

from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.feature_extraction.text import TfidfVectorizer
def knn(news):
    """
    k近邻对新闻数据集进行预测
    :return:
    """
    # 获取新闻的数据,20个类别
    

    # 进行数据集分割
    x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.3)

    # 对于文本数据,进行特征抽取
    tf = TfidfVectorizer()

    x_train = tf.fit_transform(x_train)

    # 不能调用fit_transform
    x_test = tf.transform(x_test)

    # estimator估计器流程
    knn = KNeighborsClassifier(n_neighbors=5)

    knn.fit(x_train, y_train)

    return knn.score(x_test, y_test)

3.实现朴素贝叶斯算法

from sklearn.naive_bayes import MultinomialNB
def nbcls(news):
    """
    朴素贝叶斯对新闻数据集进行预测
    :return:
    """
    # 获取新闻的数据,20个类别
    

    # 进行数据集分割
    x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.3)

    # 对于文本数据,进行特征抽取
    tf = TfidfVectorizer()

    x_train = tf.fit_transform(x_train)

    # 不能调用fit_transform
    x_test = tf.transform(x_test)

    # estimator估计器流程
    mlb = MultinomialNB(alpha=1.0)

    mlb.fit(x_train, y_train)

    return mlb.score(x_test, y_test)

4.多次迭代运算求取平均值

import matplotlib.pyplot as plt
def score_avg(func,num):
    score_sum=0
    a=[]
    b=[]
    for i in range(1,num+1):
        score_sum += func(news)
        # 每10次查看一下准确率
        #if i%10==0:
        score_ave = score_sum/(i)
        a.append(i)
        b.append(score_ave)
    # 获取最终的准确率
    print(score_ave)
    # 将准确率变化过程展示出来
    plt.plot(a,b)
    plt.grid()
    plt.show()

5.运行结果比较

1)运行KNN算法

num=10
score_avg(knn,num)


从第60次开始准确率收敛到0.786附近
2)运行bayas算法

num=100
score_avg(nbcls,num)


从第55次开始准确率收敛到0.845附近

6.结论

文本分类采用bayas算法更加合适

 
5 months ago

1.使用sklearn的鸢尾花数据集

from sklearn.datasets import load_iris
iris = load_iris()

2.调用K近邻分类器API

from sklearn.neighbors import KNeighborsClassifier

3.代码实现KNN

def knn(data):
    """
    K近邻算法预测鸢尾花种类
    :return:
    """
    # 一、处理数据以及特征工程

    # 1、取出特征值和目标值
    y = data['target']
    x = data.drop(['target'], axis=1)

    # 2、数据分割与特征工程?

    # (1)、数据分割
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)

    # (2)、标准化
    std = StandardScaler()

    # 队训练集进行标准化操作
    x_train = std.fit_transform(x_train)

    # 进行测试集的标准化操作
    x_test = std.fit_transform(x_test)

    # 二、算法的输入训练预测
    # K值:算法传入参数不定的值    理论上:k = 根号(样本数)
    # K值:后面会使用参数调优方法,去轮流试出最好的参数[1,3,5,10,20,100,200]
    knn = KNeighborsClassifier(n_neighbors=1)

    # 调用fit()
    knn.fit(x_train, y_train)

    # 预测测试数据集,得出准确率
    y_predict = knn.predict(x_test)

    print("预测测试集类别:", y_predict)

    print("准确率为:", knn.score(x_test, y_test))

    return None

此时直接调用函数 knn(iris) 即可得出预测结果

4.超参数调优----网格搜索(Grid Search)

# 网格搜索调优
from sklearn.model_selection import GridSearchCV
from pprint import pprint
def knn2(data):
    """
    K近邻算法预测鸢尾花种类
    :return:
    """

    # 1、取出特征值和目标值
    y = data['target']

    x = data.drop(['target'], axis=1)

    # 2、数据分割与特征工程?

    # (1)、数据分割
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)

    # (2)、标准化
    std = StandardScaler()

    # 队训练集进行标准化操作
    x_train = std.fit_transform(x_train)
    print(x_train)

    # 进行测试集的标准化操作
    x_test = std.fit_transform(x_test)
    
    # 网格搜索调优
    knn = KNeighborsClassifier()

    param = {"n_neighbors": [i for i in range(1,10)]}

    gc = GridSearchCV(knn, param_grid=param, cv=10)

    gc.fit(x_train, y_train)

    print("选择了某个模型测试集当中预测的准确率为:", gc.score(x_test, y_test))

    # 训练验证集的结果
    print("在交叉验证当中验证的最好结果:", gc.best_score_)
    print("gc选择了的模型K值是:", gc.best_estimator_)
    #print("每次交叉验证的结果为:", gc.cv_results_)
    pprint(gc.cv_results_)
    
    return None

运行函数 knn2(iris) 即可得到预测结果

5.追求准确率的稳定性----多次计算求平均值

以上代码运行中发现一个问题:每次运行后产生的准确率不同,甚至相差悬殊——最小70%,最大90%
产生原因:算法相同,训练集随机产生,带来不同的结果
由此验证机器学习领域经典语录:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已
为了追求准确率的稳定性,这里尝试采用 多次计算求取平均值的做法
首先需要对KNN代码返回值做下修改

def iris_knn(iris):
    x=iris.data
    y=iris.target
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
    x_train=std.fit_transform(x_train)
    x_test=std.fit_transform(x_test)
    knn=KNeighborsClassifier(n_neighbors=3)
    knn.fit(x_train,y_train)
    # 返回准确率
    return knn.score(x_test,y_test)

多次运算求取平均值

from matplotlib.pyplot as plt
def score_avg():
    num=5000
    score_sum=0
    a=[]
    b=[]
    for i in range(1,num+1):
        score_sum += iris_knn(iris)
        # 每10次查看一下准确率
        if i%10==0:
            score_ave = score_sum/(i)
            a.append(i)
            b.append(score_ave)
    # 获取最终的准确率
    print(score_ave)
    # 将准确率变化过程展示出来
    plt.plot(a,b)
    plt.grid()
    plt.show()

运行函数 score_avg()即可得到结果


可以看到迭代2000次之后准确率稳定在0.919附近

以上 超参数调优稳定准确率 方法可以应用与各种任何数据集和算法

参考资料:
探索sklearn | 鸢尾花数据集

 
5 months ago

最近做一个数据挖掘项目,用到sklearn机器学习库,导入20newsgroup数据集总是下载缓慢没反应
于是开始考虑手动下载这个数据集

1.下载20newsbydate.tar.gz文件到文件夹 ~/scikit_learn_data/20news_home/

2.查看当前python路径,保持备用

which python
/Users/lee/.virtualenvs/ai/bin/python

进入文件夹 /Users/lee/.virtualenvs/ai/
(其中,lee是我的mac用户名,ai是虚拟环境名称)

3.修改sklearn原始代码

接着刚刚的文件路径,打开文件 Lib/python/site-packages/sklearn/datasets\twenty_newsgroups.py
找到download_20newsgroups()函数,注释掉下面的代码

logger.info("Downloading dataset from %s (14 MB)", ARCHIVE.url)
archive_path = _fetch_remote(ARCHIVE, dirname=target_dir)

在后面添加

archive_path = os.path.join(target_dir, r'20newsbydate.tar.gz')

注意要使用4个空格缩进。

4.导入数据集

程序中运行代码

from sklearn.datasets import fetch_20newsgroups
all_data = fetch_20newsgroups(subset='all')

观察到文件夹 ~/scikit_learn_data/ 生成缓存文件 20news-bydate_py3.pkz 即表示数据集导入成功

注:以上内容为mac版操作,windows版操作路径略有不同,具体参照楼下参考资料

参考资料:
scikit-learn - 20newsgroups
Sklearn导入数据集20newsgroups报错-no handlers could be fetch_20newsgroups
How to download datasets for sklearn? - python

 
5 months ago

今天看到两个视频,引发我的思考
1.关于坚持———持续努力
其实当年向南极进发的有两个科考队,他们采取了不同的前进策略
一个团队给自己指定了纪律:每天无论发生什么情况,都坚持每天前进30海里
另一个团队相当佛系,天气好的时候就前进,天气不好的时候就休息
结果当然是可想而知了,努力坚持应该是成功的最大秘诀

你渴望一件东西,你想成为怎样的人
你是真的渴望这件东西,真的想成为这样的人么
还是你仅仅是想想而已
每天盯住目标,持续行动,坚持下去,终究会有结果

2.如何面对父母的期望与自己的期望不一致————父母没有错,我也没有错
冥想是正念静观中最主要的一个方式
核心是全身心的关注此时此刻的呼吸、听觉、嗅觉、触觉、味觉等感官的感受来加强对当袭的关照
我们同时动用自己的大脑、身体和情绪,把它们与此时此刻的自己联系起来

一次体验或者一次消费可能不能帮我们解决什么问题,关键是我们迈向了走向自我的那一步

发现自从长大后,与父母的分歧愈来越多
父母希望我留在家乡,找个稳定的工作,娶个当地的姑娘,家里赞助首付,买房买车,安稳度过一生
我不想拘泥小城市,希望在外面闯荡,见见大世面,希望通过自己的努力买房买车,希望自然而然地遇到喜欢的,同时也喜欢我的人,两个人自由地恋爱,然后自然自然走到一起

分歧应该也是好事,我想这也刚好是自我意识的觉醒

之前我是没有自我意识的,小时候知道家里条件不好,父母拼命工作赚钱养家
只是自己只想单纯做一个乖孩子,好好学习,不做危险的事,不给爸妈惹麻烦,同时也不麻烦其他人
上初中时候,遭遇了一场农村孩子遇到城里孩子的危机
从此开始感到特别的空虚迷茫:发现自己没有兴趣爱好,没有特长,没有朋友,没有目标与理想
为了排遣这股压力,我把自己陷入了没头没脑的助人为乐之中:没原则地帮助同学值日打扫卫生,积极为班级活动打下手
但是问题依然没有得到正视和解决,私下很难受和失望,也不知道怎么处理这种心态,不知道向谁倾诉和寻求帮助
这种感觉压在心里,哪怕遇到心理医生,也不知道应该如何去描述我的这份心情和感受
从小跟着爷爷奶奶长大的我,表达是匮乏的,感情是缺失而空白的
有几次,我幻想着可以向当时喜欢我的班主任表达这份压抑,我想说“救救孩子”,可是连这个孩子怎么了,当时的我都无法把自己说清楚
还有几次,我觉得人生多么无趣,恨不得拿起菜刀把自己的胳膊、手掌砍成一段一段

侥幸考上老家最好的高中之一(还好父母听了老师的建议,提前做了中考移民),学习压力变大
这时候家里买了房,按道理此时应该扬眉吐气才是
1.但是当时的我却认为我们本来就是穷人家,只配过穷人的生活,只配一辈子租人家的房子,寄人篱下,然后忍受房东儿媳妇的冷嘲热讽,不应该学人家爱慕虚荣勉强去做超出自己能力范围的事情
于是我是内心极度不认同家里买房这件事,全程我都刻意避免参与,我是到了最后时刻,在搬新家办酒那一天才第一次走进新家
2.我一直把自己家定义为穷人,从来都是看不起富人的,他们都是为富不仁,我们穷人虽然贫穷,但是却占据道德制高点
这一下子突然买了房,仿佛自己站在了坏人的角色,仿佛一下子站在了千夫所指的一面,这一点也是我无法接受的
刚好我选择的学校的学生大多来自乡下、县城————我心目中的穷伙计(当初选择这个学校十有八九是因为初中时周围的同学都是富人,让自己太自卑了,高中希望站到正确的队列中来),自己好不容易找到了队伍,这次一下子又站到了同学的对立面,让我无法接受
为了平衡这种心态,我坚持说家乡话(这时候从乡下来的同学们,开始努力说普通话),平时穿着很朴素,刻意把自己的形象打扮成穷兮兮的乡下佬
刻意回避,甚至有意推脱家里买房的事情,借此希望自己站在舆论道德的制高点,希望自己在群众中没有被孤立
3.刚好家里买房借了很多钱,家里虽然不说,但也让我感受到了压力,懂事的我自然学着压缩开支、压缩欲望,无形帮助家庭节约,为自己的刻意装穷找到了正当合适的理由的掩饰

但是这种行为和思想的分裂,没有给自己带来好处,情感和物质上的刻意压制反而让自己更加压抑,再加上学习上的不顺,导致几乎每晚的失眠
这一切的一切,都无人诉说,无处表达

高中我选择了三所重点高中中最穷的学校,是对初中富人同学带给自己的自卑的逃避
高考我义无反顾地放弃复读,是对高中压抑生活的逃避
大学我选择了长住学校,甚至寒暑假都极少回家,是对无法给自己带来成长,甚至只能带来消极情绪的家庭的逃避
大学毕业后我远离家乡,毅然决然来到杭州,更是对过去无奈经历的一种逃避
今年年初经过深思,我辞掉世界100强工作,是对大公司病、过去怀才不遇经历的一种逃避

一次次看似都在逃避,实际是对美好生活的追求
但愿以后不再选择直接逃避,直面自己的内心,解决一个个心结后从容离开,负重前行终究不是最好的选择

参考资料:
闲聊回顾篇,拼多多,电竞,视频制作【要不然你来10SP】
【箭厂视频】来自东方的神秘力量,禅修被老外发展成心理治疗,在北京四合院开班授课

 
5 months ago

作为一个年轻人,如果想在AI方面有所作为,应该关注哪些领域?
1.单纯想赚钱,从事金融领域
金融行业有很多模拟工作,根本不需要人插手,比如银行、信贷员、保险员,很容易被一些程序取代
比如现在的量化交易已经取代了过去的很多操盘手
2.想带来变革,从事无人驾驶领域
无人驾驶的挑战很大,但是随着大量人才和资金的涌入,所有的汽车公司,包括电动汽车都会转向无人驾驶
他们最终会取得重大进展,从而改变我们的出行方式
实现了这些技术后,可以反过来帮我们实现很多技术,比如姐姐目前困难的机器人问题

人工智能能取代什么类型的人类工作?
1.对于那些不需要沟通合作的工作,比如金融领域,包括银行、信贷员、保险员
2.对于那些需要沟通协作的岗位,人工智能很难取代
3.同时对于那些需要爱的领域和场合,人工智能难以取代,比如护理岗位
人类都有情感需求,我们生病了需要一个美丽的护士小姐来嘘寒问暖,不需要一个冷冰冰的机器来服务
李开复提到一家朋友的创业公司,开发了一个老年陪护产品,可以实现很多功能,但是老人家最常使用的就是“人工服务”功能
老人们向客服抱怨“为什么我的儿子还不跟我打电话”,甚至热情洋溢地向客服人员介绍自己的孙子
4.并不能单纯地说哪些工作会被人工智能取代
应该说人类工作需要可以被分解成一些流程,其中的若干流程是可以被人工智能取代的

人形居家服务机器人短期内不会出现
1.现在的人工智能仍属于弱人工智能,只能在单一领域做的很好,无法面对家政这样复杂的场景
2.硬件无法匹配
现在人工智能发展在软件方面如火如荼,但是硬件方面无法达到照料级别的精度和温度
3.目前的人工智能形态,最好不是人形的
一旦做成人形的,大众就有了期待,把她跟真实的人类做各种对比,产品的各种弊端暴露无遗,而且被无限放大,这样对于厂家是不利的
所以现在的人工智能更多以app、智能家具、送货小车、无人车的形式依附在其他硬件上

参考资料:
The Future of AI with Kai-Fu Lee: Udacity Talks

 
6 months ago

对于Python开发用户来讲,PIP安装软件包是家常便饭。
但国外的源下载速度实在太慢,浪费时间。而且经常出现下载后安装出错问题。
所以把PIP安装源替换成国内镜像,可以大幅提升下载速度,还可以提高安装成功率。

国内源

新版ubuntu要求使用https源,要注意。

清华:https://pypi.tuna.tsinghua.edu.cn/simple

阿里云:http://mirrors.aliyun.com/pypi/simple/

中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/

华中理工大学:http://pypi.hustunique.com/

山东理工大学:http://pypi.sdutlinux.org/

豆瓣:http://pypi.douban.com/simple/

临时使用

可以在使用pip的时候加参数-i https://pypi.tuna.tsinghua.edu.cn/simple,例如:

pip install pyspider -i https://pypi.tuna.tsinghua.edu.cn/simple

这样就会从清华这边的镜像去安装pyspider库。

永久修改,一劳永逸

Linux/ Mac下,修改 ~/.pip/pip.conf (没有就创建一个文件夹及文件。文件夹要加“.”,表示是隐藏文件夹)

vim ~/.pip/pip.conf

设置内容如下:

[global]
timeout=40
index-url=http://pypi.douban.com/simple
extra-index-url=http://mirrors.aliyun.com/pypi/simple/
extra-index-url=https://pypi.tuna.tsinghua.edu.cn/simple/
extra-index-url=http://pypi.mirrors.ustc.edu.cn/simple/

[install]
trusted-host=pypi.douban.com
trusted-host=mirrors.aliyun.com
trusted-host=pypi.tuna.tsinghua.edu.cn
trusted-host=pypi.mirrors.ustc.edu.cn

windows下,直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini。内容同上。

2018.12.24补充
经过后续实测,以上配置文件中extra-index-urltrusted-host不能重复出现,只能存在一个
而且trusted-host是为了强制将http源设置为安全可信来源,否则系统会报错且自动忽略该py源
推荐使用阿里云的镜像,它更新频率比较高,与源在时间上差距很小
所以,配置文件内容建议更新如下(保留一个企业源,一个高校源,而且刚好一个http,一个https):

[global]
timeout=40
index-url=http://mirrors.aliyun.com/pypi/simple/
extra-index-url=https://pypi.tuna.tsinghua.edu.cn/simple/
# extra-index-url=http://pypi.douban.com/simple
# extra-index-url=http://pypi.mirrors.ustc.edu.cn/simple/

[install]
trusted-host=mirrors.aliyun.com
# trusted-host=pypi.douban.com
# trusted-host=pypi.tuna.tsinghua.edu.cn
# trusted-host=pypi.mirrors.ustc.edu.cn

参考资料:
让pip使用国内镜像
Mac pip 设置国内代理源
指定多个pip源
pip:指定多个源
通过PyPI镜像安装Python包

 
6 months ago

1.遇到问题

先放上人脸识别代码

import cv2  # 计算机视觉包

# 认得人脸长什么样子
# 人脸识别中的默认分类器,主要用于人脸图片中的人脸轮廓的识别
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")


def detect(gray, frame):
    # 处理黑白画面,用人脸1.3倍大小的框标识出人脸,线条宽带5像素
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    # 指定画框框的位置
    for (x, y, w, h) in faces:  # 扫描整张图片
        cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
        roi_gray = gray[y:y + h, x:x + w]
        roi_color = frame[y:y + h, x:x + w]
    return frame  # 把处理完的整张照片,回传


video_capture = cv2.VideoCapture(0)
while True:
    # 读取摄像头采集到的画面
    _, frame = video_capture.read()
    # 把画面转成黑白,在opencv中处理颜色的顺序是“蓝绿红”
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    canvas = detect(gray, frame)  # 把结果展示在画布上面
    cv2.imshow("Video", canvas)  # 把结果展示出来

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

video_capture.release()
cv2.destroyAllWindows()

运行时出现报错

Traceback (most recent call last)
<ipython-input-6-9cceee0010e9> in <module>
      3     _, frame = video_capture.read() # 读取摄像头采集到的画面
      4     gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) # 把画面转成黑白,在opencv中处理颜色的顺序是“蓝绿红”
----> 5     canvas = detect(gray,frame) # 把结果展示在画布上面
      6     cv2.imshow("Video",canvas) # 把结果展示出来
      7 

<ipython-input-5-0d22d3377ae6> in detect(gray, frame)
     12             cv2.rectangle(roi_color,(ex, ey), (ex+ew, ey+eh),(0,255,0),2)
     13 
---> 14         smiles = smile_cascade.detectMultiScale(roi_gray,1.7,22)
     15         for (sx, sy, sw, sh) in smiles: # 扫描整张图片
     16             cv2.rectangle(roi_color,(sx, sy), (sx+sw, sy+sh),(0,0,255),2)

error: OpenCV(3.4.3) /Users/travis/build/skvark/opencv-python/opencv/modules/objdetect/src/cascadedetect.cpp:1698: error: (-215:Assertion failed) !empty() in function 'detectMultiScale'

2.查找原因

经过分析报错信息和一番搜索,发现主要问题出现在第二行代码
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
程序在当前文件夹搜索分类器haarcascade_frontalface_default.xml,但是却没有找到,因此需要指定该分类器的绝对路径
经过全盘搜索,发现电脑上并没有该分类器,需要自行到互联网下载

3.解决问题:单独下载人脸识别分类器

官方解决方案是到github上下载opencv到所有库文件,结果令人乍舌

(ai) lee$:git clone https://github.com/lyy1988323/opencv.git
Cloning into 'opencv'...
remote: Enumerating objects: 28, done.
remote: Counting objects: 100% (28/28), done.
remote: Compressing objects: 100% (25/25), done.
Receiving objects:   0% (427/245503), 124.01 KiB | 114.00 KiB

整个库文件有24.5万个文件,下载极为缓慢而且冗余,遂考虑仅仅下载需要到人脸识别分类器文件

问题就转变成如何下载github的一个文件或者文件夹
经过搜索,发现有各种解决方案:web版,chrome插件,命令行工具等
于是,选择了最简单的web解决方案:
打开后右上角输入需要下载的github的一个文件或者文件夹url:https://github.com/opencv/opencv/tree/master/data/haarcascades
然后点击右侧Download即可

参考资料:
GitHub/opencv
GitHub部分文件下载
Download a single folder or directory from a GitHub repo