摘要:
15.14 传递Unicode字符串给C函数库¶
问题¶
你要写一个扩展模块,需要将一个Python字符串传递给C的某个库函数,但是这个函数不知道该怎么处理Unicode。
解决方案¶
这里我们需要考虑很多的问题,但是最主要的问题是现存的C函数库并不理解Python的原生Unicode表示。
因此,你的挑战是将Python字符串转换为一个能被C理解的形式。
为了演示的目的,下面有两个C函数,用来操作字符串数据并输出它来调试和测试。
一个使用形式为 char *, int 形式的字节,
而另一个使用形式为 wchar_t *, int 的宽字符形式:
void print_chars(char *s, int len) {
int n = 0;
while (n < len) {
printf("%2x ", (unsigned char) s[n]);
n++;
}
printf("\n");
}
void print_wchars(wchar_t *s, int len) {
int n = 0;
while (n < 阅读全文
摘要:
15.15 C字符串转换为Python字符串¶
问题¶
怎样将C中的字符串转换为Python字节或一个字符串对象?
解决方案¶
C字符串使用一对 char * 和 int 来表示,
你需要决定字符串到底是用一个原始字节字符串还是一个Unicode字符串来表示。
字节对象可以像下面这样使用 Py_BuildValue() 来构建:
char *s; /* Pointer to C string data */
int len; /* Length of data */
/* Make a bytes object */
PyObject *obj = Py_BuildValue("y#", s, len);
如果你要创建一个Unicode字符串,并且你知道 s 指向了UTF-8编码的数据,可以使用下面的方式:
PyObject *obj = Py_BuildValue("s#", s, len);
如果 s 使用其他编码方式,那么可以像下面使用 PyUnicode_Decode() 来构建一个字符串:
PyObj 阅读全文
摘要:
15.16 不确定编码格式的C字符串¶
问题¶
你要在C和Python直接来回转换字符串,但是C中的编码格式并不确定。
例如,可能C中的数据期望是UTF-8,但是并没有强制它必须是。
你想编写代码来以一种优雅的方式处理这些不合格数据,这样就不会让Python奔溃或者破坏进程中的字符串数据。
解决方案¶
下面是一些C的数据和一个函数来演示这个问题:
/* Some dubious string data (malformed UTF-8) */
const char *sdata = "Spicy Jalape\xc3\xb1o\xae";
int slen = 16;
/* Output character data */
void print_chars(char *s, int len) {
int n = 0;
while (n < len) {
printf("%2x ", (unsigned char) s[n]);
n++;
}
printf("\n");
}
在这个代码中,字符串 sdata 包含了UTF-8和不合格数据。
阅读全文
摘要:
15.17 传递文件名给C扩展¶
问题¶
你需要向C库函数传递文件名,但是需要确保文件名根据系统期望的文件名编码方式编码过。
解决方案¶
写一个接受一个文件名为参数的扩展函数,如下这样:
static PyObject *py_get_filename(PyObject *self, PyObject *args) {
PyObject *bytes;
char *filename;
Py_ssize_t len;
if (!PyArg_ParseTuple(args,"O&", PyUnicode_FSConverter, &bytes)) {
return NULL;
}
PyBytes_AsStringAndSize(bytes, &filename, &len);
/* Use filename */
...
/* Cleanup and return */
Py_DECREF(bytes)
Py_RETURN_NONE;
}
如果你已经有了一个 PyObject * 阅读全文
摘要:
15.18 传递已打开的文件给C扩展¶
问题¶
你在Python中有一个打开的文件对象,但是需要将它传给要使用这个文件的C扩展。
解决方案¶
要将一个文件转换为一个整型的文件描述符,使用 PyFile_FromFd() ,如下:
PyObject *fobj; /* File object (already obtained somehow) */
int fd = PyObject_AsFileDescriptor(fobj);
if (fd < 0) {
return NULL;
}
结果文件描述符是通过调用 fobj 中的 fileno() 方法获得的。
因此,任何以这种方式暴露给一个描述器的对象都适用(比如文件、套接字等)。
一旦你有了这个描述器,它就能被传递给多个低级的可处理文件的C函数。
如果你需要转换一个整型文件描述符为一个Python对象,适用下面的 PyFile_FromFd() :
int fd; /* Existing file descriptor (already open) */
PyObject *fobj = Py 阅读全文
摘要:
15.19 从C语言中读取类文件对象¶
问题¶
你要写C扩展来读取来自任何Python类文件对象中的数据(比如普通文件、StringIO对象等)。
解决方案¶
要读取一个类文件对象的数据,你需要重复调用 read() 方法,然后正确的解码获得的数据。
下面是一个C扩展函数例子,仅仅只是读取一个类文件对象中的所有数据并将其输出到标准输出:
#define CHUNK_SIZE 8192
/* Consume a "file-like" object and write bytes to stdout */
static PyObject *py_consume_file(PyObject *self, PyObject *args) {
PyObject *obj;
PyObject *read_meth;
PyObject *result = NULL;
PyObject *read_args;
if (!PyArg_ParseTuple(args,"O", &obj)) {
return NULL;
阅读全文
摘要:
15.20 处理C语言中的可迭代对象¶
问题¶
你想写C扩展代码处理来自任何可迭代对象如列表、元组、文件或生成器中的元素。
解决方案¶
下面是一个C扩展函数例子,演示了怎样处理可迭代对象中的元素:
static PyObject *py_consume_iterable(PyObject *self, PyObject *args) {
PyObject *obj;
PyObject *iter;
PyObject *item;
if (!PyArg_ParseTuple(args, "O", &obj)) {
return NULL;
}
if ((iter = PyObject_GetIter(obj)) == NULL) {
return NULL;
}
while ((item = PyIter_Next(iter)) != NULL) {
/* Use item */
...
Py_DECREF(item);
}
Py_DECREF(it 阅读全文
摘要:
http://www.aibbt.com/a/20118.html 阅读全文
摘要:
关键词:theano安装,搭建theano环境, python, 深度学习
因为需要安装theano,结果发现这又是一个难以安装的python包…虽然网上教程不少,然而鱼龙混杂,试验了各种方法流程,最后总算是弄好了,现在把我的过程总结如下:
安装环境
64位win7系统,显卡:GT 730M,笔记本电脑;
已安装Visual Studio 2013 (都说VS2015太新不推荐);
借助Anaconda来安装theano,因为Anaconda已经集成了很多有用的python库,如numpy、nose、scipy等,强烈推荐。 阅读全文
摘要:
Keras官方中文文档:keras后端Backend 阅读全文
摘要:
函数式模型接口
为什么叫“函数式模型”,请查看“Keras新手指南”的相关部分
Keras的函数式模型为Model,即广义的拥有输入和输出的模型,我们使用Model来初始化一个函数式模型
from keras.models import Model
from keras.layers import Input, Dense
a = Input(shape=(32,))
b = Dense(32)(a)
model = Model(inputs=a, outputs=b)
在这里,我们的模型以a为输入,以b为输出,同样我们可以构造拥有多输入和多输出的模型
model = Model(inputs=[a1, a2], outputs=[b1, b3, b3])
常用Model属性 阅读全文
摘要:
常用Sequential属性
model.layers是添加到模型上的层的list
Sequential模型方法
add
add(self, layer)
向模型中添加一个层
layer: Layer对象 阅读全文
摘要:
关于Keras模型
Keras有两种类型的模型,序贯模型(Sequential)和函数式模型(Model),函数式模型应用更为广泛,序贯模型是函数式模型的一种特殊情况。
两类模型有一些方法是相同的:
model.summary():打印出模型概况,它实际调用的是keras.utils.print_summary
model.get_config():返回包含模型配置信息的Python字典。模型也可以从它的config信息中重构回去 阅读全文
摘要:
快速开始序贯(Sequential)模型
序贯模型是多个网络层的线性堆叠,也就是“一条路走到黑”。
可以通过向Sequential模型传递一个layer的list来构造该模型:
from keras.models import Sequential
from keras.layers import Dense, Activation
model = Sequential([
Dense(32, units=784),
Activation('relu'),
Dense(10),
Activation('softmax'),
]) 阅读全文
摘要:
这里需要说明一下,笔者不建议在Windows环境下进行深度学习的研究,一方面是因为Windows所对应的框架搭建的依赖过多,社区设定不完全;另一方面,Linux系统下对显卡支持、内存释放以及存储空间调整等硬件功能支持较好。如果您对Linux环境感到陌生,并且大多数开发环境在Windows下更方便操作的话,希望这篇文章对您会有帮助。 阅读全文
摘要:
推荐配置
如果您是高校学生或者高级研究人员,并且实验室或者个人资金充沛,建议您采用如下配置:
主板:X299型号或Z270型号
CPU: i7-6950X或i7-7700K 及其以上高级型号
内存:品牌内存,总容量32G以上,根据主板组成4通道或8通道
SSD: 品牌固态硬盘,容量256G以上
显卡:NVIDIA GTX TITAN(XP) NVIDIA GTX 1080ti、NVIDIA GTX TITAN、NVIDIA GTX 1080、NVIDIA GTX 1070、NVIDIA GTX 1060 (顺序为优先建议,并且建议同一显卡,可以根据主板插槽数量购买多块,例如X299型号主板最多可以采用×4的显卡)
电源:由主机机容量的确定,一般有显卡总容量后再加200W即可 阅读全文
摘要:
如何引用Keras?
如何使Keras调用GPU?
如何在多张GPU卡上使用Keras
"batch", "epoch"和"sample"都是啥意思?
如何保存Keras模型?
为什么训练误差(loss)比测试误差高很多?
如何获取中间层的输出?
如何利用Keras处理超过机器内存的数据集?
当验证集的loss不再下降时,如何中断训练?
验证集是如何从训练集中分割出来的?
训练数据在训练时会被随机洗乱吗?
如何在每个epoch后记录训练/测试的loss和正确率?
如何使用状态RNN(statful RNN)?
如何“冻结”网络的层?
如何从Sequential模型中去除一个层?
如何在Keras中使用预训练的模型
如何在Keras中使用HDF5输入?
Keras的配置文件存储在哪里?
在使用Keras开发过程中,我如何获得可复现的结果? 阅读全文
摘要:
API - 数据预处理¶
我们提供大量的数据增强及处理方法,使用 Numpy, Scipy, Threading 和 Queue。
不过,我们建议你直接使用 TensorFlow 提供的 operator,如 tf.image.central_crop ,更多关于 TensorFlow 的信息请见
这里 和 tutorial_cifar10_tfrecord.py.
这个包的一部分代码来自Keras。 阅读全文
摘要:
API - 可视化¶
TensorFlow 提供了可视化模型和激活输出等的工具 TensorBoard。
在这里,我们进一步提供一些可视化模型参数和数据的函数 阅读全文
摘要:
tensorlayer.rein.discount_episode_rewards(rewards=[], gamma=0.99, mode=0)[源代码]¶
Take 1D float array of rewards and compute discounted rewards for an
episode. When encount a non-zero value, consider as the end a of an episode. 阅读全文