《TensorFlow深度学习应用实践》修订清单(2018年1月第1版)
(1)
第269页 5.第五层卷积层
# 卷积层5
conv5 = tf.nn.conv2d(conv4, W_conv['conv5'], strides=[1, 1, 1, 1], padding='SAME')
conv5 = tf.nn.bias_add(conv5, b_conv['conv5'])
conv5 = tf.nn.relu(conv2) 修改为 conv5 = tf.nn.relu(conv5)
# 池化层5
pool5 = tf.nn.avg_pool(conv5, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='VALID')
6.第六层卷积层
书上原文reshape = tf.reshape(pool5, [-1, 13 * 13 * 256]) 修改为 reshape = tf.reshape(pool5, [-1, 6 * 6 * 256])
282页
X_train, y_train = reader2.get_file("c:\\cat_and_dog_r")
c:\\cat_and_dog_r文件夹需要自己在c盘创建,内面还有cat和dog两个文件夹,cat文件夹存储猫的图片,dog文件夹存储狗的图片
第284页
'fc1': tf.Variable(tf.truncated_normal([13 * 13 * 256, n_fc1], stddev=0.1)), 'fc2': tf.Variable(tf.truncated_normal([n_fc1, n_fc2], stddev=0.1)), 'fc3': tf.Variable(tf.truncated_normal([n_fc2, n_classes], stddev=0.1)) }
改为
'fc1': tf.Variable(tf.truncated_normal([6 * 6 * 256, n_fc1], stddev=0.1)), 'fc2': tf.Variable(tf.truncated_normal([n_fc1, n_fc2], stddev=0.1)), 'fc3': tf.Variable(tf.truncated_normal([n_fc2, n_classes], stddev=0.1)) }
第285页
# 卷积层5 conv5 = tf.nn.conv2d(conv4, W_conv['conv5'], strides=[1, 1, 1, 1], padding='SAME') conv5 = tf.nn.bias_add(conv5, b_conv['conv5']) conv5 = tf.nn.relu(conv2) # 池化层5 pool5 = tf.nn.avg_pool(conv5, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='VALID') reshape = tf.reshape(pool5, [-1, 13 * 13 * 256])
改为
# 卷积层5 conv5 = tf.nn.conv2d(conv4, W_conv['conv5'], strides=[1, 1, 1, 1], padding='SAME') conv5 = tf.nn.bias_add(conv5, b_conv['conv5']) conv5 = tf.nn.relu(conv5) # 池化层5 pool5 = tf.nn.avg_pool(conv5, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='VALID') reshape = tf.reshape(pool5, [-1, 6 * 6 * 256])
第286页
def onehot(labels): '''one-hot 编码''' n_sample = len(labels) n_class = max(labels)+1 onehot_labels = np.zeros((n_sample, n_class)) onehot_labels[np.arange(n_sample), labels] = 1 return onehot_labels
改为
def onehot(labels):
'''one-hot 编码'''
n_sample = len(labels)
n_class = 2 #我自己修改的,不然当reader2.get_bactch()函数中batch_size为1时程序会报错
onehot_labels = np.zeros((n_sample, n_class))
onehot_labels[np.arange(n_sample), labels] = 1
return onehot_labels
(2)您好,在第34页计算出去玩的信息熵时,计算式为什么使用温度的信息熵计算,您是不是把这两个熵值颠倒了?后续的信息增益与决策树的建立是不是也错了呢?
表3-3:出去玩否的记录
(out) | 起风(wind) | 下雨(rain) | 湿度(humidity) | 温度(temperature) |
0 | 0 | 1 | 1 | |
0 | 0 | 1 | 1 | 1 |
0 | 1 | 0 | 0 | 0 |
1 | 1 | 0 | 0 | 1 |
1 | 0 | 0 | 0 | 1 |
1 | 1 | 0 | 0 | 1 |
表3-3中第一列名和最后一列名弄颠倒了。实在抱歉。
(3)在75页程序6-2中对饱和度行进调节,方括号中的第三个参数是否应为1?
答:使用0或者1只是在不同的层上进行变换,都是可以对饱和度进行调节,这点没有确定的规定。没有错误,不需要修订。
(4)76页图6-3,右图并不是对应程序仿射变换的结果,而应该还做了镜像处理。
答:图6-3是程序6-4的结果。6-4中主要使用了CV2的warpAffine函数。而warpAffine就被称为仿射变换函数。没有错误,不需要修订。
- 第327页,'import vgg16_weights_and_classe'中的vgg16_weights_and_classe.py文件在哪里?
这些文件前面说过下载地址,需要下载,可能有些被墙。最新的可以在
https://www.cs.toronto.edu/~frossard/post/vgg16/
这个下面有,已测试。或者网盘中有个目录vgg16。
- 在334页中,是否需要将‘loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(fc3_cat_and_dog, y_imgs))’’,改为‘loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_imgs, logits=fc3_cat_and_dog));labels和logits反了,运行报错。
读者反馈两个参数写反了,王老师认为没有写错。读者给出的正确的写法,只是加了参数关键字,更明确参数值,也没有错。
(7)第10章里头,程序10-5.py中涉及到jpg文件夹好像没提供呢。
这个例子用来对所需加载文件的地址和标签进行查询。
请直接找个图片文件改名、复制10个做测试即可。
(8)P75,程序6-2中第五行代码应该为less_color_hsv[:,:,1],
答:使用0或者1只是在不同的层上进行变换,都是可以对饱和度进行调节,这点没有确定的规定。使用1也是对的。
(9)程序6-3中第九行代码应该为plt.subplot(1,2,1)
答:原文没有错误,是121。subplot的参数支持(m,n,p)和(mnp)两种方式。
(10)P66,程序5-2第六行中的reshape(300,300)应该不正确
答:原文没有错误。
- 请问53页图4-11 小贷数据集的四分位显示也就是下图应该怎么理解?谢谢。
你好,这里的6列数据是从整个数据集中随机选取的6列做的数据描述结果,即对随机选择的6列数据做的四分位分布计算,图中竖的每个四分位图是随机选择的每个数据列做的数据可视化描述。主要是用来展示离群点。
- 怎么样通过程序22—1来画图22—8,运行完例程后后出不了图,求教!!!万分感激。
答:您可以把最后sess内的内容改成如下:
with tf.Session() as sess:
writer = tf.summary.FileWriter(logdir_path, sess.graph) #紧接在tf.Session() as sess下
sess.run(tf.global_variables_initializer())
for i in range(400):
sess.run(d_optimizator,feed_dict={real_input:sample_data(),fake_input:random_data()})
print("--------pre_train %d epoch end---------"%i)
if i % 50 == 0:
merged_summary = sess.run(merged_summary_op,feed_dict={real_input:sample_data(),fake_input:random_data()})
writer.add_summary(merged_summary, global_step=i)
saver.save(sess, save_path=logdir_path, global_step=i)
for i in range(2000):
sess.run([d_optimizator],feed_dict={real_input:sample_data(),fake_input:random_data()})
sess.run([g_optimizator], feed_dict={fake_input: random_data()})
print("--------model_train %d epoch end---------"%i)
if i % 50 == 0:
merged_summary=sess.run(merged_summary_op,feed_dict={real_input:sample_data(),fake_input:random_data()})
writer.add_summary(merged_summary, global_step=i)
saver.save(sess, save_path=logdir_path, global_step=i)
create_data = sess.run(Dz_f,feed_dict={fake_input:random_data()})
print(create_data)
import matplotlib.pylab as plt
plt.plot(sample_data(),"b")
plt.plot(create_data,"r")
plt.show()
这里的create_data就是生成的数据,而sanple_data()函数就是生成真是的数据。这里您需要注意的是代码的位置,加红色的部分最好都要在sess内部执行,在外部调用的话可以使用全局参数。
- 我在《TensorFlow深度学习应用实践》的代码运行中,12-5.py 代码运行达到的准确率只有 0.1 , 和书上的结果 0.98 相差巨大,请问一下是什么原因。
你好,这里作者是为了演示更多的形式,将
def conv2d(x, W):
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='VALID')
中padding类型设置成VALID,而您在如果 需要演示答案即可把padding设置成“SAME”即可,而
def max_pool_2x2(x):
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
也请您一并修改。
此外在主代码段中,由于修改了补全的模式,需要多第二次卷积的结果大小进行修改,代码如下:(请注意还有额外参数修改的地方)
import tensorflow as tf
import tensorflow.examples.tutorials.mnist.input_data as input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
x_data = tf.placeholder("float", shape=[None, 784])
y_data = tf.placeholder("float", shape=[None, 10])
def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial)
def bias_variable(shape):
initial = tf.constant(0.1, shape=shape)
return tf.Variable(initial)
def conv2d(x, W):
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
def max_pool_2x2(x):
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
W_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])
x_image = tf.reshape(x_data, [-1, 28, 28, 1])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)
W_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)
print(h_pool2.shape)
#W_fc1 = weight_variable([4 * 4 * 64, 1024])
W_fc1 = weight_variable([7 * 7 * 64, 1024]) #这里是修改的
b_fc1 = bias_variable([1024])
h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
keep_prob = tf.placeholder("float")
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])
y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_data*tf.log(y_conv), reduction_indices=[1]))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_data, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
sess = tf.Session()
sess.run(tf.initialize_all_variables())
for i in range(10000):
batch = mnist.train.next_batch(200)
if i%100 == 0:
train_accuracy = sess.run(accuracy, feed_dict={x_data:batch[0], y_data: batch[1], keep_prob: 0.5})
print("step %d, training accuracy %g"%(i, train_accuracy))
sess.run(train_step, feed_dict={x_data: batch[0], y_data: batch[1], keep_prob: 1.0})
- 读者曹雷来信:您好,我是本书的读者。本书第196页程序12-4运行结果始终为0.098,和书上的结果0.9317不符,相差甚远,望勘误,谢谢!附件是我在加上batch normalization之后的程序,加上BN之后,测试准确率飙升至98%。修改后的文件为mnist_5_conv.py,参看目录code。
(15)您好,十分有幸拜读了您的书《TensorFlow深度学习应用实践》,但是在阅读到15章的时候利用alexnet的代码时有些疑问,以下代码中create_and_read_TFRecord2 的module似乎在书中没有找到,是否可以给一下代码呢
import create_and_read_TFRecord2 as reader2
X_train, y_train = reader2.get_file("c:\\cat_and_dog_r")
image_batch, label_batch = reader2.get_batch(X_train, y_train, 227, 227, 200, 2048)
程序16-14被命名为“create_and_read_TFRecord2”,作为辅助程序包在模型训练过程中不停地输入相应的图片数据。
书中【程序16-14】上方给出定义。
(16)282页,程序15-1 文件首import create_and_read_TFRecord2 as reader2 ,但会提示找不到,看后面的程序主要是调用了get_file()和get_batch(),且在前面的272页275页分别有看到这两个函数,所以去掉了前面的import create_and_read_TFRecord2 as reader2 ,直接在程序15-1加入这两个函数的定义,在后面直接调用,但是发现仍然有问题 ,在函数get_file()倒数第二行label_list=[int(float(i)) for i in label_list] 提示float()的参数只能是字符串或者数字,不能是list。尝试注释该行,但仍然有问题 提示 ValueError: Shape must be rank 0 but is rank 1 for 'ReadFile' (op: 'ReadFile') with input shapes: [25000] 。望告知 creat_and_read_TFRecord2的具体内容,或者其它解决办法.
您好,之前问的问题已经自己解决了,百度云提供的文件的文件夹名,和书上用的有点不同,问题七在文件夹下新建cat和dog子文件(百度云提供的解压出来直接在train目录下),把对应图片放入,就好了,后来遇到OOM,换了128G内存 GTX1080TI(11G显存)的电脑可以正常运行了,大约0.1秒一次。
(17)21-3的源码中:
res=tf.nn.conv2d_transpose(img,kernel,[1,9,9,3],[1,1,1,1],padding="VALID")
应改为:
res=tf.nn.conv2d_transpose(img,kernel,[1,9,9,3],[1,3,3,1],padding="VALID")
原因:tf.nn.conv2d_transpose(x, w, output_shape, strides, padding='SAME'):推荐使用x的数据格式为默认格式[batch, height, width, in_channels]。w是滤波器,输入分格式为[height, width, output_channels, in_channels]。output_shape就是输出数据的格式[batch, height, width, in_channels],strides就是滑动的步长。[1,h_l, w_l,1]。输出数据格式的height等于h_l乘以输入的height。另外一个参数也是一样的。