mirror of
https://github.com/donnemartin/data-science-ipython-notebooks.git
synced 2024-03-22 13:30:56 +08:00
195 lines
170 KiB
Python
195 lines
170 KiB
Python
|
{
|
|||
|
"cells": [
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"# Placeholders"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"So far we have used **Variables** to manage our data, but there is a more basic structure, the **placeholder**. A **placeholder** is simply a variable that we will assign data to at a later date. It allows us to create our operations and build our computation graph, without needing the data. In **TensorFlow** terminology, we then feed data into the graph through these placeholders.\n",
|
|||
|
"\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 1,
|
|||
|
"metadata": {
|
|||
|
"collapsed": false
|
|||
|
},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"[ 2. 4. 6.]\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"import tensorflow as tf\n",
|
|||
|
"\n",
|
|||
|
"x = tf.placeholder(\"float\", 3)\n",
|
|||
|
"y = x * 2\n",
|
|||
|
"\n",
|
|||
|
"with tf.Session() as session:\n",
|
|||
|
" result = session.run(y, feed_dict={x: [1, 2, 3]})\n",
|
|||
|
" print(result)"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"This example works a little differently from our previous ones, let’s break it down.\n",
|
|||
|
"\n",
|
|||
|
"First, we import **tensorflow** as normal. Then we create a **placeholder** called x, i.e. a place in memory where we will store value later on. The 3 on this line denotes that we will store three values in this placeholder.\n",
|
|||
|
"\n",
|
|||
|
"Then, we create a Tensor called, which is the operation of multiplying **x** by 2. Note that we haven’t defined any initial values for x yet.\n",
|
|||
|
"\n",
|
|||
|
"We now have an operation (**y**) defined, and can now run it in a session. We create a session object, and then run just the y variable. Note that this means, that if we defined a much larger graph of operations, we can run just a small segment of the graph. This subgraph evaluation is actually a bit selling point of TensorFlow, and one that isn’t present in many other libraries that do similar things.\n",
|
|||
|
"\n",
|
|||
|
"Running **y** requires knowledge about the values of **x**. We define these inside the **feed_dict** argument to run. We state here that the values of x are **[1, 2, 3]**. We run y, giving us the result of **[2, 4, 6]**.\n",
|
|||
|
"\n",
|
|||
|
"Placeholders do not need to be statically sized. Let’s update our program to allow x to take on any length. Change the definition of x to be:"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 2,
|
|||
|
"metadata": {
|
|||
|
"collapsed": true
|
|||
|
},
|
|||
|
"outputs": [],
|
|||
|
"source": [
|
|||
|
"x = tf.placeholder(\"float\", None)"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"Now, when we define the values of **x** in the **feed_dict** we can have any number of values. The code should still work, and give the same answer, but now it will also work with any number of values in **feed_dict**.\n",
|
|||
|
"\n",
|
|||
|
"Placeholders can also have multiple dimensions, allowing for storing arrays. In the following example, we create a 3 by 2 matrix, and store some numbers in it. We then use the same operation as before to do element-wise doubling of the numbers.\n",
|
|||
|
"\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 4,
|
|||
|
"metadata": {
|
|||
|
"collapsed": false
|
|||
|
},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"[[ 2. 4. 6.]\n",
|
|||
|
" [ 8. 10. 12.]]\n"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"import tensorflow as tf\n",
|
|||
|
"\n",
|
|||
|
"x = tf.placeholder(\"float\", [None, 3])\n",
|
|||
|
"y = x * 2\n",
|
|||
|
"\n",
|
|||
|
"with tf.Session() as session:\n",
|
|||
|
" x_data = [[1, 2, 3],\n",
|
|||
|
" [4, 5, 6],]\n",
|
|||
|
" result = session.run(y, feed_dict={x: x_data})\n",
|
|||
|
" print(result)"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "markdown",
|
|||
|
"metadata": {},
|
|||
|
"source": [
|
|||
|
"The first dimension of the placeholder is **None**, meaning we can have any number of rows. The second dimension is fixed at 3, meaning each row needs to have three columns of data.\n",
|
|||
|
"\n",
|
|||
|
"We can extend this to take an arbitrary number of **None** dimensions. In this example, we load up the image from our last lesson, then create a placeholder that stores a slice of that image. The slice is a 2D segment of the image, but each “pixel” has three components (red, green, blue). Therefore, we need **None** for the first two dimensions, but need **3** (or **None** would work) for the last dimension. We then use TensorFlow’s **slice** method to take a subsegment out of the image to operate on."
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"cell_type": "code",
|
|||
|
"execution_count": 6,
|
|||
|
"metadata": {
|
|||
|
"collapsed": false
|
|||
|
},
|
|||
|
"outputs": [
|
|||
|
{
|
|||
|
"name": "stdout",
|
|||
|
"output_type": "stream",
|
|||
|
"text": [
|
|||
|
"(3000, 3685, 3)\n"
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"data": {
|
|||
|
"image/png": "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\nPSiw3hC6bW5qYGW0jzB
|
|||
|
"text/plain": [
|
|||
|
"<matplotlib.figure.Figure at 0x10635ec50>"
|
|||
|
]
|
|||
|
},
|
|||
|
"metadata": {},
|
|||
|
"output_type": "display_data"
|
|||
|
}
|
|||
|
],
|
|||
|
"source": [
|
|||
|
"%matplotlib inline\n",
|
|||
|
"import tensorflow as tf\n",
|
|||
|
"import matplotlib.image as mpimg\n",
|
|||
|
"import matplotlib.pyplot as plt\n",
|
|||
|
"\n",
|
|||
|
"# First, load the image again\n",
|
|||
|
"filename = \"images/MarshOrchid.jpg\"\n",
|
|||
|
"raw_image_data = mpimg.imread(filename)\n",
|
|||
|
"\n",
|
|||
|
"image = tf.placeholder(\"uint8\", [None, None, 3])\n",
|
|||
|
"slice = tf.slice(image, [1000, 0, 0], [3000, -1, -1])\n",
|
|||
|
"\n",
|
|||
|
"with tf.Session() as session:\n",
|
|||
|
" result = session.run(slice, feed_dict={image: raw_image_data})\n",
|
|||
|
" print(result.shape)\n",
|
|||
|
"\n",
|
|||
|
"plt.imshow(result)\n",
|
|||
|
"plt.show()"
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"metadata": {
|
|||
|
"kernelspec": {
|
|||
|
"display_name": "Python 2",
|
|||
|
"language": "python",
|
|||
|
"name": "python2"
|
|||
|
},
|
|||
|
"language_info": {
|
|||
|
"codemirror_mode": {
|
|||
|
"name": "ipython",
|
|||
|
"version": 2
|
|||
|
},
|
|||
|
"file_extension": ".py",
|
|||
|
"mimetype": "text/x-python",
|
|||
|
"name": "python",
|
|||
|
"nbconvert_exporter": "python",
|
|||
|
"pygments_lexer": "ipython2",
|
|||
|
"version": "2.7.11"
|
|||
|
},
|
|||
|
"toc": {
|
|||
|
"toc_cell": false,
|
|||
|
"toc_number_sections": false,
|
|||
|
"toc_threshold": "8",
|
|||
|
"toc_window_display": false
|
|||
|
}
|
|||
|
},
|
|||
|
"nbformat": 4,
|
|||
|
"nbformat_minor": 0
|
|||
|
}
|