关于神经网络维度
发现很多时候维度不明确 代码如下
#author MJY
import tensorflow as tf
import numpy as np
def add_layer(inputs, in_size, out_size, activation_function=None):
Weights=tf.Variable(tf.random_normal([out_size, in_size]))#初始化了一个insize行outsize列的权重矩阵
biases=tf.Variable(tf.zeros([out_size,1])+0.1)#b不建议以0初始化
Wx_plus_b = tf.matmul( Weights,inputs) + biases#未激活的值
if activation_function is None:
outputs = Wx_plus_b#线性7
else:
outputs=activation_function(Wx_plus_b)
return outputs
#以上添加了一个神经层
#我终于明白了!!!!!!!!
#你这个建立的时候 w b 都是只是相对于一个样本来说的 所以不考虑m
#以下自己建造一个数据集
x_data=np.linspace(-1,1,300)[ np.newaxis,:]#-1到1这个区间 300个单位 并变列向量,即加一个维度 但每次输入好像就输入一个
noise=np.random.normal(0, 0.05, x_data.shape)#均值0 标准差0.05 xdata一样的格式 加噪点以更像真实数据
y_data=np.square(x_data)-0.5+noise
#以下建立神经网络
xs=tf.placeholder(tf.float32,[1,None])#[None,1]即为行不定 列为一 可理解为列向量
ys=tf.placeholder(tf.float32,[1,None])
l1=add_layer(xs, 1, 10, activation_function=tf.nn.relu)#输入层
prediction=add_layer(l1, 10, 1, activation_function=None)#输出层
loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),reduction_indices=[0]))#reduce_sum 求和命令 reduce_mean求平均值 reduction_indices命令看csdn收藏夹
train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss)#0.1为学习率 一般小于一
#minimize(loss)为每次需要降低loss
init=tf.global_variables_initializer()
sess=tf.Session()
sess.run(init)
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}))
值得注意的是 看过吴恩达教程的都知道当训练样本为m个的时候要把n1 ,biases都根据m向量化,但是这里要注意,当构建神经网络单层解释的时候默认只有一个样本的输入,当构建完毕之后,引入x_data之后才将其看作向量化后的结果
也就是说 这里最重要的一点是上面的这一句
biases=tf.Variable(tf.zeros([out_size,**1**])+0.1)
这个1,一定要注意!!!而不是300!!!
0 ↩︎