环境:Ubuntu 16.04.1 +cuda 9.0 + cudnn 7+tensorflow-gpu 1.6.0 +python 3.5.2
1.Session
tf.Session()
import tensorflow as tf
m1=tf.constant([[3,3]])
m2=tf.constant([[2],
[2]])
product=tf.matmul(m1,m2)# 相当于np.dot(m1,ma2)
#method 1
sess=tf.Session()
result=sess.run(product)
print(result)
sess.close()
#method 2
#在 with ...as 当中会自动执行sess.close()
with tf.Session() as sess1:
result2=sess.run(product)
print(result2)
2 Variable()
import tensorflow as tf
#tensorflow 当中一定要定义成变量,才会是变量,如同定义一个常量
state=tf.Variable(0,name='counter')#给定初始值和名字
#print(state.name)
one=tf.constant(1)
new_value=tf.add(state,one)
update=tf.assign(state,new_value)
#tensorflow当中必须执行这一句,才能激活所有变量
init=tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
for _ in range(3):
sess.run(update)
print(sess.run(state))
3.placeholder()
import tensorflow as tf
input1=tf.placeholder(tf.float32)#tensorflow 大部分情况处理的type 为float32
input2=tf.placeholder(tf.float32)
output=tf.multiply(input1,input2)
with tf.Session() as sess:
print(sess.run(output,feed_dict={input1:[7.],input2:[2.]}))#每次执行session时,再喂入值,值的形式是字典
4 建立一个简单的三层神经网络
import tensorflow as tf
import numpy as np
def add_layer(inputs,in_size,out_size,activation_funcion=None):
Weights=tf.Variable(tf.random_normal([in_size,out_size]))#定义权重,生成随机变量比全部为0更好
biases=tf.Variable(tf.zeros([1,out_size])+0.1)#最好不要全为0,故多加0.1
Wx_plus_b=tf.matmul(inputs,Weights)+biases
if activation_funcion is None:
outputs=Wx_plus_b
else:
outputs=activation_funcion(Wx_plus_b)
return outputs
#自己构造输入
x_data=np.linspace(-1,1,300)[:,np.newaxis]
#增加噪音,使得数据更加真实,而不是完全契合二次曲线
noise=np.random.normal(0,0.05,x_data.shape)
y_data=np.square(x_data)-0.5+noise
xs=tf.placeholder(tf.float32,[None,1])#无论给多少sample 都可行
ys=tf.placeholder(tf.float32,[None,1])
#建立简单的三层神经网络(输入层:1;隐藏层:10;输出层:1)
L1=add_layer(xs,1,10,activation_funcion=tf.nn.relu)
prediction=add_layer(L1,10,1,activation_funcion=None)
loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),
reduction_indices=[1]))
#学习
train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss)#以0.1的学习率进行优化误差
init=tf.initialize_all_variables()
sess=tf.Session()
#只有运行到sess.run(),上面的代码才开始执行
sess.run(init)
for i in range(1000):
sess.run(train_step,feed_dict={xs:x_data,ys:y_data})#假设使用全部数据来进行运算
if i % 50==0:#每50次,显示loss值,观测loss值是否逐渐减小
print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))
5. 可视化结果
fig=plt.figure() #生成图片框
ax=fig.add_subplot(1,1,1)
ax.scatter(x_data,y_data)
#连续plot,不暂停
plt.ion()
fig.savefig('save_img.jpg', facecolor='grey', edgecolor='red')
plt.show()
for i in range(1000):
sess.run(train_step,feed_dict={xs:x_data,ys:y_data})#假设使用全部数据来进行运算
if i % 50==0:
print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))
try: #第一次会报错,因为没有。但可以忽略。这种方法可以紧密衔接
ax.lines.remove(lines[0])
except Exception:
pass
prediction_value=sess.run(prediction,feed_dict={xs:x_data})
lines=ax.plot(x_data,prediction_value,'r-',lw=5)
#显示一条线后,要抹除该条线,才能更好的显示下一条
fig.savefig('img.jpg', facecolor='grey', edgecolor='red')
plt.pause(0.1)
6