Add protoc example and tf.io.decode_proto() example

main
Aurélien Geron 2019-10-21 09:01:15 +08:00
parent 143ef4b1db
commit 5edb3f3e51
2 changed files with 161 additions and 67 deletions

3
.gitignore vendored
View File

@ -11,6 +11,9 @@ tf_logs/*
images/**/*.png
images/**/*.dot
my_*
person.proto
person.desc
person_pb2.py
datasets/flowers
datasets/lifesat/lifesat.csv
datasets/spam

View File

@ -770,16 +770,40 @@
"### A Brief Intro to Protocol Buffers"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For this section you need to [install protobuf](https://developers.google.com/protocol-buffers/docs/downloads). In general you will not have to do so when using TensorFlow, as it comes with functions to create and parse protocol buffers of type `tf.train.Example`, which are generally sufficient. However, in this section we will learn about protocol buffers by creating our own simple protobuf definition, so we need the protobuf compiler (`protoc`): we will use it to compile the protobuf definition to a Python module that we can then use in our code."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First let's write a simple protobuf definition:"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [],
"source": [
"from homl.person_pb2 import Person\n",
"\n",
"person = Person(name=\"Al\", id=123, email=[\"a@b.com\"]) # create a Person\n",
"print(person) # display the Person"
"%%writefile person.proto\n",
"syntax = \"proto3\";\n",
"message Person {\n",
" string name = 1;\n",
" int32 id = 2;\n",
" repeated string email = 3;\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And let's compile it (the `--descriptor_set_out` and `--include_imports` options are only required for the `tf.io.decode_proto()` example below):"
]
},
{
@ -788,7 +812,7 @@
"metadata": {},
"outputs": [],
"source": [
"person.name # read a field"
"!protoc person.proto --python_out=. --descriptor_set_out=person.desc --include_imports"
]
},
{
@ -797,7 +821,7 @@
"metadata": {},
"outputs": [],
"source": [
"person.name = \"Alice\" # modify a field"
"!ls person*"
]
},
{
@ -806,7 +830,10 @@
"metadata": {},
"outputs": [],
"source": [
"person.email[0] # repeated fields can be accessed like arrays"
"from person_pb2 import Person\n",
"\n",
"person = Person(name=\"Al\", id=123, email=[\"a@b.com\"]) # create a Person\n",
"print(person) # display the Person"
]
},
{
@ -815,7 +842,7 @@
"metadata": {},
"outputs": [],
"source": [
"person.email.append(\"c@d.com\") # add an email address"
"person.name # read a field"
]
},
{
@ -823,6 +850,33 @@
"execution_count": 50,
"metadata": {},
"outputs": [],
"source": [
"person.name = \"Alice\" # modify a field"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [],
"source": [
"person.email[0] # repeated fields can be accessed like arrays"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [],
"source": [
"person.email.append(\"c@d.com\") # add an email address"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [],
"source": [
"s = person.SerializeToString() # serialize to a byte string\n",
"s"
@ -830,7 +884,7 @@
},
{
"cell_type": "code",
"execution_count": 51,
"execution_count": 54,
"metadata": {},
"outputs": [],
"source": [
@ -840,13 +894,50 @@
},
{
"cell_type": "code",
"execution_count": 52,
"execution_count": 55,
"metadata": {},
"outputs": [],
"source": [
"person == person2 # now they are equal"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Custom protobuf"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In rare cases, you may want to parse a custom protobuf (like the one we just created) in TensorFlow. For this you can use the `tf.io.decode_proto()` function:"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [],
"source": [
"person_tf = tf.io.decode_proto(\n",
" bytes=s,\n",
" message_type=\"Person\",\n",
" field_names=[\"name\", \"id\", \"email\"],\n",
" output_types=[tf.string, tf.int32, tf.string],\n",
" descriptor_source=\"person.desc\")\n",
"\n",
"person_tf.values"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For more details, see the [`tf.io.decode_proto()`](https://www.tensorflow.org/api_docs/python/tf/io/decode_proto) documentation."
]
},
{
"cell_type": "markdown",
"metadata": {},
@ -885,7 +976,7 @@
},
{
"cell_type": "code",
"execution_count": 53,
"execution_count": 57,
"metadata": {},
"outputs": [],
"source": [
@ -914,7 +1005,7 @@
},
{
"cell_type": "code",
"execution_count": 54,
"execution_count": 58,
"metadata": {},
"outputs": [],
"source": [
@ -930,7 +1021,7 @@
},
{
"cell_type": "code",
"execution_count": 55,
"execution_count": 59,
"metadata": {},
"outputs": [],
"source": [
@ -939,7 +1030,7 @@
},
{
"cell_type": "code",
"execution_count": 56,
"execution_count": 60,
"metadata": {
"scrolled": true
},
@ -950,7 +1041,7 @@
},
{
"cell_type": "code",
"execution_count": 57,
"execution_count": 61,
"metadata": {},
"outputs": [],
"source": [
@ -959,7 +1050,7 @@
},
{
"cell_type": "code",
"execution_count": 58,
"execution_count": 62,
"metadata": {},
"outputs": [],
"source": [
@ -968,7 +1059,7 @@
},
{
"cell_type": "code",
"execution_count": 59,
"execution_count": 63,
"metadata": {},
"outputs": [],
"source": [
@ -984,7 +1075,7 @@
},
{
"cell_type": "code",
"execution_count": 60,
"execution_count": 64,
"metadata": {},
"outputs": [],
"source": [
@ -999,7 +1090,7 @@
},
{
"cell_type": "code",
"execution_count": 61,
"execution_count": 65,
"metadata": {},
"outputs": [],
"source": [
@ -1012,7 +1103,7 @@
},
{
"cell_type": "code",
"execution_count": 62,
"execution_count": 66,
"metadata": {},
"outputs": [],
"source": [
@ -1030,7 +1121,7 @@
},
{
"cell_type": "code",
"execution_count": 63,
"execution_count": 67,
"metadata": {},
"outputs": [],
"source": [
@ -1039,7 +1130,7 @@
},
{
"cell_type": "code",
"execution_count": 64,
"execution_count": 68,
"metadata": {},
"outputs": [],
"source": [
@ -1065,7 +1156,7 @@
},
{
"cell_type": "code",
"execution_count": 65,
"execution_count": 69,
"metadata": {},
"outputs": [],
"source": [
@ -1076,7 +1167,7 @@
},
{
"cell_type": "code",
"execution_count": 66,
"execution_count": 70,
"metadata": {},
"outputs": [],
"source": [
@ -1085,7 +1176,7 @@
},
{
"cell_type": "code",
"execution_count": 67,
"execution_count": 71,
"metadata": {},
"outputs": [],
"source": [
@ -1095,7 +1186,7 @@
},
{
"cell_type": "code",
"execution_count": 68,
"execution_count": 72,
"metadata": {},
"outputs": [],
"source": [
@ -1104,7 +1195,7 @@
},
{
"cell_type": "code",
"execution_count": 69,
"execution_count": 73,
"metadata": {},
"outputs": [],
"source": [
@ -1116,7 +1207,7 @@
},
{
"cell_type": "code",
"execution_count": 70,
"execution_count": 74,
"metadata": {},
"outputs": [],
"source": [
@ -1148,7 +1239,7 @@
},
{
"cell_type": "code",
"execution_count": 71,
"execution_count": 75,
"metadata": {},
"outputs": [],
"source": [
@ -1187,7 +1278,7 @@
},
{
"cell_type": "code",
"execution_count": 72,
"execution_count": 76,
"metadata": {},
"outputs": [],
"source": [
@ -1196,7 +1287,7 @@
},
{
"cell_type": "code",
"execution_count": 73,
"execution_count": 77,
"metadata": {},
"outputs": [],
"source": [
@ -1205,7 +1296,7 @@
},
{
"cell_type": "code",
"execution_count": 74,
"execution_count": 78,
"metadata": {},
"outputs": [],
"source": [
@ -1225,7 +1316,7 @@
},
{
"cell_type": "code",
"execution_count": 75,
"execution_count": 79,
"metadata": {},
"outputs": [],
"source": [
@ -1234,7 +1325,7 @@
},
{
"cell_type": "code",
"execution_count": 76,
"execution_count": 80,
"metadata": {},
"outputs": [],
"source": [
@ -1243,7 +1334,7 @@
},
{
"cell_type": "code",
"execution_count": 77,
"execution_count": 81,
"metadata": {},
"outputs": [],
"source": [
@ -1252,7 +1343,7 @@
},
{
"cell_type": "code",
"execution_count": 78,
"execution_count": 82,
"metadata": {},
"outputs": [],
"source": [
@ -1275,7 +1366,7 @@
},
{
"cell_type": "code",
"execution_count": 79,
"execution_count": 83,
"metadata": {},
"outputs": [],
"source": [
@ -1299,7 +1390,7 @@
},
{
"cell_type": "code",
"execution_count": 80,
"execution_count": 84,
"metadata": {},
"outputs": [],
"source": [
@ -1308,7 +1399,7 @@
},
{
"cell_type": "code",
"execution_count": 81,
"execution_count": 85,
"metadata": {},
"outputs": [],
"source": [
@ -1321,7 +1412,7 @@
},
{
"cell_type": "code",
"execution_count": 82,
"execution_count": 86,
"metadata": {},
"outputs": [],
"source": [
@ -1331,7 +1422,7 @@
},
{
"cell_type": "code",
"execution_count": 83,
"execution_count": 87,
"metadata": {},
"outputs": [],
"source": [
@ -1340,7 +1431,7 @@
},
{
"cell_type": "code",
"execution_count": 84,
"execution_count": 88,
"metadata": {},
"outputs": [],
"source": [
@ -1351,7 +1442,7 @@
},
{
"cell_type": "code",
"execution_count": 85,
"execution_count": 89,
"metadata": {},
"outputs": [],
"source": [
@ -1362,7 +1453,7 @@
},
{
"cell_type": "code",
"execution_count": 86,
"execution_count": 90,
"metadata": {},
"outputs": [],
"source": [
@ -1371,7 +1462,7 @@
},
{
"cell_type": "code",
"execution_count": 87,
"execution_count": 91,
"metadata": {},
"outputs": [],
"source": [
@ -1382,7 +1473,7 @@
},
{
"cell_type": "code",
"execution_count": 88,
"execution_count": 92,
"metadata": {},
"outputs": [],
"source": [
@ -1391,7 +1482,7 @@
},
{
"cell_type": "code",
"execution_count": 89,
"execution_count": 93,
"metadata": {},
"outputs": [],
"source": [
@ -1403,7 +1494,7 @@
},
{
"cell_type": "code",
"execution_count": 90,
"execution_count": 94,
"metadata": {},
"outputs": [],
"source": [
@ -1415,7 +1506,7 @@
},
{
"cell_type": "code",
"execution_count": 91,
"execution_count": 95,
"metadata": {},
"outputs": [],
"source": [
@ -1431,7 +1522,7 @@
},
{
"cell_type": "code",
"execution_count": 92,
"execution_count": 96,
"metadata": {},
"outputs": [],
"source": [
@ -1440,7 +1531,7 @@
},
{
"cell_type": "code",
"execution_count": 93,
"execution_count": 97,
"metadata": {},
"outputs": [],
"source": [
@ -1457,7 +1548,7 @@
},
{
"cell_type": "code",
"execution_count": 94,
"execution_count": 98,
"metadata": {},
"outputs": [],
"source": [
@ -1466,7 +1557,7 @@
},
{
"cell_type": "code",
"execution_count": 95,
"execution_count": 99,
"metadata": {},
"outputs": [],
"source": [
@ -1477,7 +1568,7 @@
},
{
"cell_type": "code",
"execution_count": 96,
"execution_count": 100,
"metadata": {},
"outputs": [],
"source": [
@ -1492,7 +1583,7 @@
},
{
"cell_type": "code",
"execution_count": 97,
"execution_count": 101,
"metadata": {},
"outputs": [],
"source": [
@ -1515,7 +1606,7 @@
},
{
"cell_type": "code",
"execution_count": 98,
"execution_count": 102,
"metadata": {},
"outputs": [],
"source": [
@ -1532,7 +1623,7 @@
},
{
"cell_type": "code",
"execution_count": 99,
"execution_count": 103,
"metadata": {},
"outputs": [],
"source": [
@ -1553,7 +1644,7 @@
},
{
"cell_type": "code",
"execution_count": 100,
"execution_count": 104,
"metadata": {},
"outputs": [],
"source": [
@ -1582,7 +1673,7 @@
},
{
"cell_type": "code",
"execution_count": 101,
"execution_count": 105,
"metadata": {},
"outputs": [],
"source": [
@ -1594,7 +1685,7 @@
},
{
"cell_type": "code",
"execution_count": 102,
"execution_count": 106,
"metadata": {},
"outputs": [],
"source": [
@ -1603,7 +1694,7 @@
},
{
"cell_type": "code",
"execution_count": 103,
"execution_count": 107,
"metadata": {},
"outputs": [],
"source": [
@ -1624,7 +1715,7 @@
},
{
"cell_type": "code",
"execution_count": 104,
"execution_count": 108,
"metadata": {},
"outputs": [],
"source": [
@ -1640,7 +1731,7 @@
},
{
"cell_type": "code",
"execution_count": 105,
"execution_count": 109,
"metadata": {},
"outputs": [],
"source": [
@ -1658,7 +1749,7 @@
},
{
"cell_type": "code",
"execution_count": 106,
"execution_count": 110,
"metadata": {},
"outputs": [],
"source": [
@ -1677,7 +1768,7 @@
},
{
"cell_type": "code",
"execution_count": 107,
"execution_count": 111,
"metadata": {},
"outputs": [],
"source": [
@ -1696,7 +1787,7 @@
},
{
"cell_type": "code",
"execution_count": 108,
"execution_count": 112,
"metadata": {},
"outputs": [],
"source": [
@ -1706,7 +1797,7 @@
},
{
"cell_type": "code",
"execution_count": 109,
"execution_count": 113,
"metadata": {},
"outputs": [],
"source": [