duanshao 2018-06-06
在这篇文章中,我打算回答关于Keras和TensorFlow的以下问题:
Keras是一个用Python编写的开放源码的神经网络API。它可以运行在几个深度学习和机器学习框架之上,包括TensorFlow (TF)、Microsoft Cognitive Tool (CNTK)和Theano。
TensorFlow是一个用于高性能symbolic-numeric计算的开源软件库。它也被用于深度学习应用,如神经网络。TensorFlow由谷歌Brain team开发,用Python、c++和CUDA (Nvidia用于编程gpu的语言)编写。它可以部署在各种平台上(cpu、gpu、tpu)。
Keras是一个接口,而不是一个独立的框架,比如TensorFlow。它提供了高级的、直观的抽象,支持快速实验。
TensorFlow的名字来源于它的功能。它允许用户定义数据、张量等。
下面的类比有助于说明Keras的功能和目的。如果您使用过seaborn,matplotlip,plotly.js或d3.js,则此部分适合您。
Seaborn是基于matplotlib的高级界面。如果我想用一个使用seaborn的x和y标签进行线性回归拟合的散点图,我只需要3行代码:
import seaborn as sns
df = sns.load_dataset('dataset')
sns.regplot(x=df["independent"], y=df["dependent"])
sns.plt.show()
但是,如果我想在matplotlib中创建相同的绘图,我会做类似如下的操作:
import matplotlib.pyplot as plt
import numpy as np
plt.figure(figsize=(10,10))
plt.xlabel("independent")
plt.ylabel("dependent")
plt.grid()
m, b = np.polyfit(x, y, 1)
plt.plot(x, y, '.')
plt.plot(x, m*x + b, '-')
Seaborn是生成具有所有预期特性的标准散点图的最简单和有效的方法。但是,如果我想在没有合适标签的情况下做一个散点图,那么matplotlib会更有效。同样地,如果您想要使用经过尝试的和真正的方法来生成函数模型,那么Keras是一种方法。
如果你想用d3.js建立一个简单的条形图来比较每个“类别”中的“数量”。js文件可能是这样的:
var svgWidth = 960;
var svgHeight = 500;
var chartMargin = {
top: 30,
right: 30,
bottom: 30,
left: 30
};
var chartWidth = svgWidth - chartMargin.left - chartMargin.right;
var chartHeight = svgHeight - chartMargin.top - chartMargin.bottom;
var svg = d3.select("body")
.append("svg")
.attr("height", svgHeight)
.attr("width", svgWidth)
var chartGroup = svg.append("g")
.attr("transform", "translate(" + chartMargin.right + ", " + chartMargin.top + ")");
var xBandScale = d3.scaleBand().range([0, chartWidth]).padding(0.1);
var yLinearScale = d3.scaleLinear().range([chartHeight, 0]);
d3.csv("data.csv", function (error, Data) {
if (error) throw error;
console.log(tvData);
Data.forEach(function (data) {
data.amount = +data.amount;
});
xBandScale.domain(Data.map(function (data) {
return data.category;
}));
yLinearScale.domain([0, d3.max(Data, function (data) {
return data.y;
})]);
var bottomAxis = d3.axisBottom(xBandScale);
var leftAxis = d3.axisLeft(yLinearScale).ticks(10);
chartGroup.selectAll(".bar")
.data(Data)
.enter()
.append("rect")
.attr("class", "bar")
.attr("x", function (data) {
return xBandScale(data.category);
})
.attr("y", function (data) {
return yLinearScale(data.amount);
})
.attr("width", xBandScale.bandwidth())
.attr("height", function (data) {
return chartHeight - yLinearScale(data.amount);
});
chartGroup.append("g")
.call(leftAxis);
chartGroup.append("g")
.attr("transform", "translate(0, " + chartHeight + ")")
.call(bottomAxis);
});
使用plotly.js要简单得多。它看起来像:
var data = [{
x: ['category one', 'category two', 'category three'],
y: [5, 14, 23],
type: 'bar'
}];
Plotly.newPlot('myDiv', data);
很明显很简单,但很有限。如果你想创造惊人的视觉效果,你必须使用d3。如果您想要创建功能完美、简单、用户友好的图形,请使用plotly。类似地,如果您想要完全的创造性控制,请使用TensorFlow。如果你正在寻找一种快速便捷的功能产品,那就选Keras。
Keras的优势包括:
重视用户体验。最大限度地减少认知负荷。常数。简单。减少用户操作的数量。受欢迎。由一个庞大而活跃的社区支持。
神经层、函数、方案和优化器都是独立的模块,您可以将它们结合起来创建新的模型。
Python代码= compact,易于调试,并易于扩展。
Keras的缺点:
Keras是一个写得很好的API,它不会阻止对底层框架的访问。话虽如此,Keras并不是为您设计来改变模型的底层架构的。你可以在Keras来定制你的层,但你可以使用TensorFlow。
TensorFlow的优点:
TensorFlow可以应用于各种各样的用例。通过对数据进行一系列的数学运算,它几乎可以构建任何涉及数据处理的内容。然而,TensorFlow最常用来构建神经网络,它在深度学习中处于领先地位。如果您正在尝试进行简单的机器学习,那么您可能只想坚持使用scikitt -learn。如果您使用的是小型数据集,那么TensorFlow可能有点过了头。
TensorFlow不仅为您提供了对模型的完全控制,还为您提供了对预处理逻辑的完全控制。去年,谷歌宣布了TensorFlow转换,允许用户定义预处理管道,该管道支持对数据进行大规模、高效、分布式的数据处理。
TensorFlow的缺点:
功能越多,学习难度越大
如果你是一名研究人员或深度学习专家,那么你可能会使用Keras进行第一次测试,因为它可以快速执行原型和POC实验。然后,您可以转到TensorFlow以获得对网络中的步骤和层的完全控制。您还可以使用调试器实时了解结构。
如果您想要进入Kaggle比赛或参加hackathon,Keras或许是您的最佳选择。如果你是一个新手,想要通过深入的学习来获得乐趣,而你对神经网络的了解只是肤浅的,那么Keras对你来说是最合适的。