TensorFlow 初学者,请教下 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
helloworld12
V2EX    TensorFlow

TensorFlow 初学者,请教下

  •  
  •   helloworld12 2018-05-19 22:37:44 +08:00 4535 次点击
    这是一个创建于 2764 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码如下:

    #encoding: utf-8 import tensorflow as tf from numpy.random import RandomState # 获取一层神经网络边上的权重,并将这个权重的 L2 正则化损失加入名称为'losses'的集合中 def get_weight(shape, lambdaF): var = tf.Variable(tf.random_normal(shape)) # add_to_collection 函数将这个新生成变量的 L2 正则化损失加入集合。 # 这个函数的第一个参数'losses', 是集合的名字,第二个参数是要加入这个集合的内容 tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(lambdaF)(var)) return var x = tf.placeholder(tf.float32, shape=(None, 2), name='x-input') y_ = tf.placeholder(tf.float32, shape=(None, 1), name='y-input') batch_size = 8 # 定义了每一层网络中节点的个数 layer_dimension = [2, 10, 10, 10, 1] # 神经网络的层数。 n_layers = len(layer_dimension) # 这个变量维护前向传播时最深层的节点,开始的时候就是输入层。 cur_layer = x # 当前层的节点个数 in_dimension = layer_dimension[0] # 通过一个循环来生成 5 层全连接的神经网络结构 for i in range(1, n_layers): # layer_dimension[i]为下一层的节点个数。 out_dimension = layer_dimension[i] # 生成当前层中权重的变量,并将这个变量的 L2 正则化损失加入计算图上的集合。 weight = get_weight([in_dimension, out_dimension], 0.001) bias = tf.Variable(tf.constant(0.1, shape=[out_dimension])) # 使用 ReLU 激活函数 cur_layer = tf.nn.relu(tf.matmul(cur_layer, weight) + bias) # 进入下一层之前将下一层的节点数更新为当前层节点个数 in_dimension = layer_dimension[i] # 在定义神经网络前向传播的同时已经将所有的 L2 正则化损失加入图上的集合, # 这里只需要计算刻画模型在训练数据上表现的损失函数 mse_loss = tf.reduce_mean(tf.square(y_ - cur_layer)) # 将均方误差损失函数加入损失集合 tf.add_to_collection('losses', mse_loss) # get_collection 返回一个列表, 这个列表是所有这个集合的元素。在这个样例中, # 这些元素就是损失函数的不同部分,将它们加起来就可以得到最终的损失函数 loss = tf.add_n(tf.get_collection('losses')) tran = tf.train.AdamOptimizer().minimize(loss) rdm = RandomState(1) dataset_size = 12800 X = rdm.rand(dataset_size, 2) Y = [ (x1*x2 + rdm.rand()/10.0 - 0.05,) for (x1, x2) in X] with tf.Session() as sess: sess.run(tf.global_variables_initializer()) STEPS = 1500000 for i in range(STEPS): start = (i * batch_size) % dataset_size end = min(dataset_size, start+batch_size) sess.run(tran, feed_dict={x:X[start:end], y_:Y[start:end]}) if i % 200 == 0: print(sess.run(loss, feed_dict={x:X, y_:Y})) 

    主要疑问是:

    X = rdm.rand(dataset_size, 2) Y = [ (x1*x2 + rdm.rand()/10.0 - 0.05,) for (x1, x2) in X] 

    为什么,那些权重参数,能拟合出 X 和 Y 的映射关系,Y 是等于 x1*x2,这一点也不线性啊
    运行了下,loss 可以小到 0.0035882844

    第 1 条附言    2018-05-19 23:48:18 +08:00
    嗯,标题,改成, <<机器学习初学者,请教下吧>>
    第 2 条附言    2018-05-20 12:08:59 +08:00
    我可能,会先跟着书本,拿几个 demo 练练手,后续,看情况再去深入理解各种基础概念吧

    什么都从基础概念学起,可能导致,没那么有趣, 自顶而下,比较有趣
    第 3 条附言    2018-05-20 12:13:24 +08:00
    谢谢大家
    13 条回复    2018-05-21 11:14:42 +08:00
    yu099
        1
    yu099  
       2018-05-19 22:55:43 +08:00 via Android
    你不懂的是机器学习还是 tensorflow ?
    WildCat
        2
    WildCat  
       2018-05-19 23:10:17 +08:00
    @yu099 你不懂的是机器学习还是 TensorFlow ?+1

    建议从基础学起吧,这些框架都是表象。
    nine99
        3
    nine99  
       2018-05-19 23:14:26 +08:00
    +1 看下理论基础吧
    Hsinyao
        4
    Hsinyao  
       2018-05-19 23:40:55 +08:00 via iPhone   1
    我也是机器学习入门选手。你的问题应该算机器学习的基础知识了,权重参数 w 最开始还没训练的时候可以认为是乱给的,经过一次前向传播后得出 y 的预测值,然后再把预测值和正确答案对比,得到损失函数,然后在反向传播里用各种优化方法优化 w 参数,让损失降低,接着用优化过的 w 参数再进行下一次学习,这样重复成千上万轮的学习,w 最后就能很好的拟合 x 和 y 的关系。
    helloworld12
        5
    helloworld12  
    OP
       2018-05-19 23:46:39 +08:00
    @Hsinyao 这个我到时知道,只是不知道为什么矩阵的权重,能拟合出 y=x1*x2, x1*x2 的变化怎么能够从 X1, X2 这两个乘以矩阵得出(这两个乘以矩阵,没法得出 x1*x2 的子项啊)
    Xs0ul
        6
    Xs0ul  
       2018-05-20 00:21:17 +08:00
    @helloworld12 #5 所以只是拟合,并不是求出原函数。
    Pikaping
        7
    Pikaping  
       2018-05-20 00:46:52 +08:00
    建议楼主先学习机器学习基础(概率,统计,等),尝试用 numpy 写一写 linear regression, logistic regression,浅层的神经网络并可以正确反向求导,上来就用 TF 会增加你对知识本身的理解的难度,因为 TF 对新手并不友好。
    Hsinyao
        8
    Hsinyao  
       2018-05-20 02:41:36 +08:00 via iPhone
    @helloworld12 大写的 Y=x1*x2 那一堆是你设定的正确答案,用来喂给 y_变量,它并不是机器的预测拟合结果,机器预测结果是你的生成五层网络那个循环里的 cur_layer 变量。
    Hsinyao
        9
    Hsinyao  
       2018-05-20 02:45:29 +08:00 via iPhone
    推荐去中国大学 mooc 上看下北大的 tensorflow 教程,也可以去京东买书,郑泽宇那本,用来入门蛮快的。
    hxdhttk
        10
    hxdhttk  
       2018-05-20 04:03:36 +08:00 via Android   1
    能够拟合非线性关系是因为应用了非线性的激活函数,把 relu 替换成线性函数,或者删去,神经网络就无法拟合非线性关系了。
    helloworld12
        11
    helloworld12  
    OP
       
    @Hsinyao 目前就是跟郑泽宇的书,在入门
    helloworld12
        12
    helloworld12  
    OP
       2018-05-20 12:12:25 +08:00
    @hxdhttk 应该是激活函数的原因吧
    flowfire
        13
    flowfire  
       2018-05-21 11:14:42 +08:00 via iPhone
    推荐 u2b 上一个叫 3blue1brown 的频道
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     888 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 22:40 PVG 06:40 LAX 14:40 JFK 17:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86