mac中在anaconda下安装tensorflow并用notebook开发深度学习教程

上一篇的教程学习了如何快速进入机器学习,很简单安装anaconda,新建一个notebook就可以开始编写代码了。如果不清楚,请点击查看上一篇文章

接下来就说下如何安装目前比较火的来自谷歌的tensorflow深度学习框架。

第一步:安装tensorflow

进入终端(Terminal),然后输入:conda create -n tensorflow  这一步是创建一个文件夹(简单理解就是这样)然后我们需要激活这个文件夹  source activate tensorflow   接着我们就可以使用安装tensorflow的命令  pip install –ignore-installed –upgrade \
https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.3.0-py2-none-any.whl  在这个文件夹里面安装tensorflow了。如果上面那个命令安装失败,把py2 改成py3再试一下。截图如下:

第二步:开始使用tensorflow

还记得怎么新建一个notebook吗?启动anaconda,进入notebook,新建一个。然后输入如下代码运行看看。

# Python
import tensorflow as tf
hello = tf.constant(‘Hello, TensorFlow!’)
sess = tf.Session()
print(sess.run(hello))

如果运行后显示,hello,tensorflow 。恭喜你,成功安装了tensorflow。

 

在未来除了英语你还需要学习一门语言——Python(如何快速搭建机器学习平台)

高盛最新调查:Python超过汉语成为未来最重要技能,你准备学哪种编程语言?

对于已经有编程基础的人来说,学习python应该很容易,直接拉到文章末尾下载pdf即可。接下来说说没学过编程的如何快速上手python,学习了解机器学习等。

编程是什么?编程就是编写程序,人类想要让计算机帮忙解决一些问题,需要编写程序告诉计算机怎么去解决。可能很多人已经试过了,在excel中,输入=号可以实现一些功能,比如把第一个表格和第二个表格相乘,这在计算总价时候非常好用,这其实也可以理解你写了一个代码告诉计算机做什么。所以,不要恐惧编程,编程也可以很简单,不一定是开发一个游戏才是编程。废话不说,开始:

第一步:安装anaconda

anaconda是python的一个科学计算环境,包含了一些包,入门时候就理解为要编程,总需要有个软件来编程吧,那就是它!点击 https://www.anaconda.com/download/ 去下载,下载时候有几个需要注意的,下载 3.6版本的。如果是windows电脑请查看是否是32位的,只要不是古董,现在电脑都是64位了。

第二步:启动 anaconda 进入notebook

第三步:开始写代码,是的就是这么快开始写。

启动后,会看到一个界面,列表会显示你电脑的一些文件夹,可以进入桌面,或者你在d盘等随便新建的文件夹。

进入一个文件夹后,界面的右上角有个按钮new ,可以新建一个文件,如下图:

新建后,就可以开始写代码了。python很简单,你想要知道计算的结果,比excel还简单,等于号都不用输入,直接输入算式,点击运行,或者用快捷键(mac下是 shift+enter)就能知道结果了。

so easy。学习机器学习相关的,入门这样可以了,以后遇到问题在去上网查,学新的东西最怕一开始什么都想弄得透透的。先学,在用,再学,然后改进。

详细的python网上有大神除了教学教程,可以直接点击这里下载。在这里感觉廖雪峰和整理成pdf的人,我只是搬运工,版权归属于原作者。

简单抓取猪八戒网前50页涉及家装的服务商名称和电话scrapy简单入门

最近学习爬虫,闲来无事研究下如何抓取猪八戒网里面涉及家装的服务商信息。

第一步我们进入猪八戒网找到全国的家装页面:

我们分析下第一页的url http://www.zbj.com/jzsheji/p.html ,第二页:http://www.zbj.com/jzsheji/pp2.html 第三页:http://www.zbj.com/jzsheji/pp3.html 经过测试第一页也可以用http://www.zbj.com/jzsheji/pp1.html去访问,所以说规则就是http://www.zbj.com/jzsheji/pp[这里从1到50].html

我们目标获取服务商的店铺地址,进入店铺后查看联系方式获取电话号码:

通过chrome浏览器的检查功能,获取 xpath 路径。全部代码如下和运行效果如下:

效果如下图:

这里有联系方式一般都是机构/企业,个人没有,所以结果不含个人用户。

 

Entity Framework 学习——了解

        ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,早期被称为 ObjectSpace,现已经包含在 Visual Studio 2008 Service Pack 1 以及 .NET Framework 3.5 Service Pack 1 中发表。
        ADO.NET Entity Framework 以 Entity Data Model (EDM) 为主,将数据逻辑层切分为三块,分别为 Conceptual Schema, Mapping Schema 与 Storage Schema 三层,其上还有 Entity Client,Object Context 以及 LINQ 可以使用。

ADO.NET Entity Framework自.NET 3.5以来就被集成于.NET中,现在最新版本是Entity Framework 5.0。
版本
支持.NET
发布情况
备注
Entity Framework 3.5
2.0+
包含于.NET 3.5中
支持EDMX生成,通过扩展可支持POCO类的生成
Entity Framework 4.0
4.0+
包含于.NET 4.0中
Entity Framework 4.X
4.0+
可通过NuGet获取
支持Database First、Model First、Code First三种生
成模式
Entity Framework 4.5
4.5+
集成于.NET 4.5中
Entity Framework 5.X
4.5+
可通过NuGet获取
支持枚举字段,性能有较大提升,支持.NET 4.0的版本
为Entity Framework 4.4

        以上从百度百科摘来的,简单说就是一种ORM框架。

        以前编程都是原生的ADO.NET,步骤实在繁琐,开发效率也不高,小项目小系统性能上的优势又不明显,维护起来也很累。草根创业的初期,公司开发人员可能就1个,没有专门的美工、DBA等。能最快开发出东西才是王道,同时又要灵活可扩展规范,这需要技术人员基础扎实、学习能力强、需要什么学习什么,马上用什么。这几天学习了下EF发现优点挺多,可以认真关注于开发、更快的开发出一个小型项目。对比下ADO.NET  EF的Database-first Model-first Code-first 开发一个简单应用:

image

简单的一个登录表。

ADO.NET 登录代码如下:

private static void Main(string[] args)
        {
            while (true)
            {
                string username;
                string password;
                string sqlstr = "server=.;uid=sa;pwd=sa;database=Test";
                Console.WriteLine("请输入用户名:");
                username = Console.ReadLine();
                Console.WriteLine("请输入密码:");
                password = Console.ReadLine();
                using (SqlConnection conn = new SqlConnection(sqlstr))
                {
                    using (SqlCommand cmd = new SqlCommand())
                    {
                        cmd.Connection = conn;
                        cmd.CommandText = "select COUNT(*) from LoginUser where " +
                                          "username=@username and password=@password";
                        cmd.Parameters.Add(new SqlParameter("@username ", username));
                        cmd.Parameters.Add(new SqlParameter("@password ", password));
                        conn.Open();
                        int result = (int)cmd.ExecuteScalar();
                        if (result > 0)
                        {
                            Console.WriteLine("登录成功。");
                        }
                        else
                        {
                            Console.WriteLine("登录失败。");
                        }
                    }
                }
            }
        }

image

DataBase-first(数据库先行):

image

第一步:在项目里面添加一个ADO.NET 实体数据模型

image

image

image

添加完成后,主程序代码如下:

static void Main(string[] args)
        {
            while (true)
            {
                Console.WriteLine("请输入用户名:");
                string username = Console.ReadLine();
                Console.WriteLine("请输入密码:");
                string password = Console.ReadLine();
                TestEntities dbcontext = new TestEntities();
                var result = (from r in dbcontext.LoginUser
                    where r.UserName == username && r.PassWord == password
                    select r).SingleOrDefault();
                if (result !=null)
                {
                    Console.WriteLine("登录成功。");
                }
                else
                {
                    Console.WriteLine("登录失败。");
                }
            }
        }

image

核心代码少了好多,直接写上linq查询语句,其他交给EF处理。

Model-first 模型先行,数据库可以先不用建立,直接在VS里面建模然后生成到数据库。

还是添加ADO.NET实体模型,不过选择空模型:

image

在模型界面空白处右击,弹出如下菜单,选择 新增-》实体。

image

image

接着在新增加的实体上面右击,选择添加 标量。

imageimage按下 F4 可以在属性窗口设置 类型,是否可空,以及最大长度等。

添加完全部的 标量后 ,在空白地方单击右键:

image

image

点击完成后,在资源管理器里面会多出一个:Model1.edmx.sql文件。然后空白地方右击

image

一执行数据库里面就会多新增加的LoginUser2表。

代码如下,新建立的表没有数据,顺便添加了一个用户:

static void Main(string[] args)
        {
            Model1Container dbcontext = new Model1Container();
            LoginUser2 newuser = new LoginUser2();
            newuser.UserName = "sa";
            newuser.PassWord = "sa";
            dbcontext.Entry(newuser).State = EntityState.Added;
            dbcontext.SaveChanges();
            while (true)
            {
                Console.WriteLine("请输入用户名:------ModelFirst----------");
                string username = Console.ReadLine();
                Console.WriteLine("请输入密码:");
                string password = Console.ReadLine();
                var result = (from r in dbcontext.LoginUser2
                              where r.UserName == username && r.PassWord == password
                              select r).SingleOrDefault();
                if (result != null)
                {
                    Console.WriteLine("登录成功。");
                }
                else
                {
                    Console.WriteLine("登录失败。");
                }
            }
        }

image

接下来就是最适合新的中小项目开发的Code-first,直接写代码:

第一步:添加模型类(loginuser3.cs),添加DataAnnotations引用

image

接下来:添加一个Context 类,添加EF5.0的引用,同时在APP.CONFIG里面添加数据库的连接字符串testlogin。

image

好了,这样就OK了,接下来就是写代码了。

 static void Main(string[] args)
        {
            LoginContext dbcontext = new LoginContext();
            dbcontext.Database.CreateIfNotExists();//如果没有数据库就创建一个
            LoginUser3 newuser = new LoginUser3();
            newuser.UserName = "sa";
            newuser.PassWord = "sa";
            dbcontext.Entry(newuser).State = EntityState.Added;
            dbcontext.SaveChanges();
            while (true)
            {
                Console.WriteLine("请输入用户名:------CodeFirst----------");
                string username = Console.ReadLine();
                Console.WriteLine("请输入密码:");
                string password = Console.ReadLine();
                var result = (from r in dbcontext.Loginuser
                              where r.UserName == username && r.PassWord == password
                              select r).SingleOrDefault();
                if (result != null)
                {
                    Console.WriteLine("登录成功。");
                }
                else
                {
                    Console.WriteLine("登录失败。");
                }
            }
        }

运行后会发现,多出来了LoginUser3这个表。

image

ASP.NET MVC5 入门九——添加新字段、数据库迁移

在Code First开发中,不可能一开始创建的数据库类就一直不变可能随着需求或者其他原因要做调整。假设我们在原有的Movies里面添加一个评级属性。

image

然后我们运行下看看。

image

异常了!注释掉刚才添加的代码,在运行看看:

image

发现可以访问,这是因为当EF CodeFirst的数据模型发生异动时,默认会引发一个 InvalidOperationException异常。有个解决方法是,在Global.asax 里面的Application_Start方法加上 一个 SetInitializer方法,这个方法会让数据库删除在重新创建。就是因为如此,有了大量的测试数据显然不能用这个方法!

使用Code First数据库迁移

首先,我们删除系统自动创建的Movies.mdf文件。如下图,如果在App_Data 里面没有看见,请单击显示所有文件图标。

image

然后进入(PM)软件包管理控制台 (视图——》其他窗口——》程序包管理控制台)输入以下指令:Enable-Migrations

image

出现错误那是因为项目中有多个数据类别,所以需要选择一个。重新输入命令:Enable-Migrations –ContextTypeName MVC5DEMO.Models.MovieDBContext 来指定需要迁移的数据库上下文。image

好了,我们会发现项目中多了一个文件夹(Migrations)和Configuration.cs文件。

image

然后我们根据注释的提示,修改下Seed方法的内容为如下:

protected override void Seed(MVC5DEMO.Models.MovieDBContext context)
        {
            context.Movie.AddOrUpdate(i => i.Title,
                new Movie {
                Title = "虎胆龙威",
                ReleaseDate=DateTime.Parse("2013-03-16"),
                Genre="动作",
                Price=120},
                new Movie {Title = "致青春",
                ReleaseDate=DateTime.Parse("2013-04-26"),
                Genre="爱情",
                Price=60} ,new Movie {Title = "中国合伙人",
                ReleaseDate=DateTime.Parse("2013-05-18"),
                Genre="剧情",
                Price=90} ,new Movie {Title = "小时代",
                ReleaseDate=DateTime.Parse("2013-06-27"),
                Genre="脑残",
                Price=30} 
                );
        }

添加完成后请按下 CTRL-SHIFT-B 生成解决方案

image

然后我们创建一个数据库迁移的版本,就是初始版本。在管理控制台输入 add-migration Initial 其中Initial可以随便取名。

image

image 文件夹下面多了一个日期+Initial.cs 的文件。

接着我们在PM(程序包管理控制台)输入 Update-Database 指令。

image

这个指令会检测刚才那个cs文件,里面包含数据库的结构的说明,然后运行 Seed里面的方法填充数据。然后我们F5运行看看。

image

一切正常!

把新属性添加到Model

接下来我们给电影模型添加一个分级功能,类似《小时代》少儿不宜!把我们刚刚注释掉的再反注释,然后重新生成下。生成完后还需要修改几个地方,如果你有自己设定Bind属性,还要把新的字段添加进去,同时要去视图修改下。我们去Index.cshtml修改下:

image

红色框框就是新增加的2处。同样的,Create.cshtml也需要添加。

image

好了之后我们运行看看。

image

出现错误了!那是因为现在的模型已经多了一个字段,而数据库还没有变化。可以用上文提到的让系统自动把数据库砍掉在重新生成,或者自己手动修改数据库。不过这些都不是最优的,最好的是使用Code First 的数据库迁移。第一步,更改Seed文件,在默认的那些测试数据中添加分级信息。

image

然后再PM里面输入  add-migration addRating (名字: addRating 可以随意,最好有意义)

image

会发现多了一个up和down方法,记录着数据库的变动。接着我们生产解决方案,然后再PM输入:Update-database 命令。然后运行看看:

image

image

评级出现了,我们点击 Create New 看看:

image

image

一切正常,都能添加。但是这样还不够智能,接下来我们设置自动数据库迁移。

自动数据库迁移

在Global.asax里面的 Application_Start方法加上以下代码:

image

这样以后一旦数据库模型变化,就能自动进行升级。

下一步:添加验证。

ASP.NET MVC5 入门十——添加验证

在本教程:将要在Movie 模型添加验证逻辑确保用户添加或者编辑时数据无误。

DRY(不要重复你自己)

ASP.NET MVC 的核心设计原则之一就是DRY(Don’t Repeat Yourself)。ASP.NET MVC 鼓励你为一个功能或者行为编码一次,在以后需要用到的地方一直复用就可以。这样可以减少编写代码的数量,同时易于维护。

在ASP.NET MVC 和 EF code first 中提供的验证支持就是DRY的好例子。可以只声明一次,然后在任何需要的地方中执行规则。

向Movie模型中添加验证规则

打开 Movies.cs 文件,然后我们来更新Movie类。利用内置的 Required、StringLength、RegularExpression 和 Range Validation 特性添加以下内容:

image

弄完后,我们看看数据库的设计:

image

显然和规格不符,我们来修改它。先生成解决方案,接下来就是利用数据库迁移功能自动生成。命令如下:在软件包管理器控制台输入

  • add-migration DataAnnotations
  • update-database

命令完成时,VS会自动打开一个类文件,我们可以看到其中的Up方法。

public override void Up()
        {
            AlterColumn("dbo.Movies", "Title", c => c.String(maxLength: 60));
            AlterColumn("dbo.Movies", "Genre", c => c.String(nullable: false, maxLength: 30));
            AlterColumn("dbo.Movies", "Rating", c => c.String(maxLength: 5));
        }

Genre 字段不再是可空的,标题和分级都添加了验证条件。我们重新看看数据库的设计:

image

已经改过来了。相关限制条件在源码里面很清楚了,不在细说。

接下来我们看看效果: 进入 localhost:****/Movies/Create

image

 

很明显了,如果没有通过本地客户端的验证,点击Create是不会向服务器提交表单的。

接来下我们看看实现的过程看看在创建视图和创建Action方法时发生了什么

先看看 MoviesController 类中的Create方法:

image

会发现和以前完全一样,没有任何代码上的变化。第一个Create (GET方法)是用来显示初始创建的窗体。第二个(POST版本的)方法先验证是否有错误(ModelStateIsValid)如果存在错误,则重新显示窗体,否则就在数据库中保存新的电影信息。客户端实现校验是通过 javascript 假如我们禁用它看看会发生什么。禁用方法不同浏览器有不同的选项,搜索一下就可以。

禁用 chrome 后,刷新重新输入:

image

没错误提示,我们点击Create

image

很明显,还是有验证,接下来我们输入正确的看看。

image

成功添加进去了,感兴趣的话,在movie.cs 的 POST Create请求添加断点,会发现输入错误的信息,IsValid 是false ,输入正确是True。

如果你添加了断点测试 启用/禁用 JavaScript 2种情况下Create方法的调用会发现,在启用JS的情况下,如果客户端检测到错误是不会调用Action里面POST的Create方法。如果禁用了JS功能,到表单提交到服务器,会通过 ModelState.IsValid 来验证是否数据存在错误。

下一部分:这次改进了 Create 方法的数据验证,下一次就是 Details 和 Delete 方法了。

ASP.NET MVC5 入门六——通过控制器访问数据

首先,我们要添加一个新的控制器,在解决方案资源管理器的Controllers文件夹右键单击,添加,支架。

image

在对话框中,我们选择下图这个: MVC5 控制器带有 读/写 和 视图。

image

名字就叫做:MoviesController 。model class 选择 MVC5DEMO.Models里面的 Movie。

image

image

数据上下文选择 我们的MovieDBContext。然后点击ADD。

image

恩,悲剧了。我们重新修改Models\Movie.cs文件,把Movies 改成Movie。

image

然后ASP.NET MVC5将会自动创建增删查改(CRUD)的方法(action)和视图(views)。是的,一个完整功能的网站就OK了。我们F5运行看看。

image

当然,没有数据,因为我们没有添加任何数据。接下来我们点击 Create New 添加新的电影条目。

添加电影:

image

image

我们来看看代码

继续阅读“ASP.NET MVC5 入门六——通过控制器访问数据”

ASP.NET MVC5 入门七——完善视图

本节中,我们来修改上一篇博文里面系统自动生成的一些代码,下图是运行后的截图:

image

可以看到有很多不足比如:英文太多,日期格式太长等。

我们回到 Models\Movie.cs 添加几句代码:

image

红色框起来的就是增加的部分,using 语句里面的那个 DataAnnotations 我们下载在说。Display 属性指定要显示的字段的名称。原来没有写的话,就是数据库字段的名称,现在我们写上中文了。DataType 指定字段显示的格式,改为日期这样的话时间就不会显示出来,更美观了。

image

在上图左下角,能看到编辑的链接。这个链接是由 index.cshtml 里面的 Html.ActionLink 方法生成的:

image

Html是个Help 类,调用 ActionLink方法来动态生成HTML超链接。ActionLink方法第一个参数指定显示的字符串,第二个参数是 要调用的Action的名称,第三个参数是一个匿名对象。

按照前几篇讲的 /Movies/Edit/3 和 /Movies/Edit?id=3 是等价的。这2个url都是传递给Movies的Edit方法来去执行,同时给出ID。我们去看看这个方法:

image

第一个方法是接受GET请求,第二个是接受HttpPost 。可以看到第二个有个属性【HttpPost】而第一个没有,因为默认就是GET请求。我们注意到第二个Edit方法前面还有一个【ValidateAntiForgeryToken】这个主要是用来防止跨站请求伪造(CSRF)。这个需要和视图里面@Html.AntiForgerToken() 配合使用,会生成一个隐藏的防伪标记。下次写个文章介绍一下。

在上面的GET的Edit 方法,调用实体框架的FIND方法查找时候存在对应id的电影,如果存在就返回给视图,不存在就返回404。下面是视图里面的代码:

image

image

第一行代码,绑定了一个强类型对象。然后接下来利用这个对象,生成 <label> <input>等代码。Html.LabelFor 这个帮助类的方法显示对应的标题,Html.EditorFor 用来生成<input>标签,Html.ValidationMessageFor 就是用来进行验证的。

image

image

生成这么优美的控件,居然一句代码都不用写,真好!

image

这是表单的源文件,可以看到有个隐藏域,存放着上文的那个 RequestVerificationToken 等信息。从这句话可以看出<form action=”/Movies/Edit/2″ method=”post”>当我们点击save后,表单的所有数据都将用post请求发送到 /movies/edit/2 这个url。

回过头来看POST请求的EDIT方法:

image

第一步,判断表单中的模型所有属性时候都可以修改或者更新。如果是有效的,就把实体框架状态改为修改,然后更新到数据库。保存之后,重定向到Index 这个方法,我们就会看到修改后的效果。

在下一个教程:我们来实现搜索功能。

ASP.NET MVC5 入门八——添加搜索

添加一个搜索的方法和搜索的视图

接下来我们添加搜索功能,可以根据电影的标题搜索。

第一步:更新index窗体

在最开始MVC入门说过,MVC一个好处就是关注点分离。当我们需要修改和数据有关的东西,只要去修改Controller 就可以。现在我们去修改MoviesController的Index方法:

image

第一行的LINQ查询用来选择Movies。仅仅是定义了movies代表数据库中的哪些,还没有开始查询。接下来判断查询的字符串是否为空,如果不为空就开始查询标题一样的电影。

s => s.Title 这是一个Lambda 表达式。一般用在基于方法的LINQ查询中,比如上面的Where。

我们现在F5运行一下看看,在地址栏后面加上?searchString=中国

image

image

当然,我们不能让用户一直在地址栏加上那么一串来搜索,普遍做法是,在页面顶部加一个搜索框。看到这个就知道需要改动View部分。我们打开Views\Movies\Index.cshtml 文件,在Create New后面加上如下代码:

image

image

可以发现,我们并没有添加控制器中Index的POST请求,也能正常查询。我们现在添加HttpPost方法

image

image

我们会发现,GET和POST请求的url都是一样的,都是 localhost:xxx/Movies/Index 。假如我们想要把链接发给朋友,让他知道我想看哪些电影,但是这些查询信息却没有在url里面体现,这样不肯能发送给朋友。

解决方法是利用 BeginForm 的重载,有个指定POST请求添加搜索信息到url中。

@using (Html.BeginForm(“Index”,”Movies”,FormMethod.Get))

改成如上的代码,就可以指定用GET方法提交,哪怕你已经有了HttpPost 的方法。

image

接下来:添加更多搜索

继续阅读“ASP.NET MVC5 入门八——添加搜索”

ASP.NET MVC5 入门五——使用LocalDB

在上一篇博文《ASP.NET MVC5 入门四——添加模型》中,我们创建了M模型对应的模型类。最终我们还是要在数据库中创建真实的数据库和表,字段等。对于开发人员,数据库在开发过程中只是需要一些简单的功能,为了开发而安装一个企业版的SQL SERVER太浪费了。还好微软在SQL2012中提供了LocalDB这个新特性,LocalDB也是VS2013默认就安装的。

什么是LocalDB

简单说就是 SQL免费版的SQL Server Express 的轻量级版本。专门为开发人员创立的,易于安装,无需管理,编程语言和T-SQL语言都和正常的数据库一样。同时不耗费系统支援,没有服务,需要时自动启动停止。其他更高级的功能就不说了,够用,免费,好用才是王道。同时LocalDB数据库也能方便的移植到SQL Server。

添加连接字符串

默认情况下,实体框架会查找和对象同名的上下文里面的连接字符串。在项目的根目录下面打开Web.config文件:

image

默认的连接字符串:

image

我们在<connectionStrings>里面添加一个新的连接字符串:

<add name=”MovieDBContext” connectionString=”Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|Movies.mdf;Integrated Security=True”
providerName=”System.Data.SqlClient”
/>

可以看出2个连接字符串都很相似。第一个名字是 DefaultConnection 用来控制可以访问该应用程序的成员资格数据库。我们添加自己的Movie.mdf数据库,不使用成员资格数据库。连接字符串的名字必须和DbContext类的名称相匹配。

添加好了之后,就是

下一步:从控制器访问模型中的数据。