账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Keras與Tensorflow在訓練上的差異?
    40
    0

    大家好,我刚学神经网路不久。我想到一个regression实验,想测试神经网路能不能学到这个特例。这是一个简单的试验,training data是随机产生的10,000笔资料,每笔资料特征向量维度为10x1,label为特征向量第1个元素值。

    from numpy.random import RandomState
    rdm=RandomState(1)
    data_size=10000
    xdim=10
    X=rdm.rand(data_size,xdim)
    Y = [x1[0] for x1 in X]
    

    我用一个一层的网路来训练,预期输出是Weights=[1,0,0,0,0,0,0,0,0,0],bias=0。

    我分别写了tensorflow跟keras两种版本。奇怪的是keras可以得到正确结果,tensorflow的训练却无法收敛。而且两个版本的loss差异很大。

    Tensorflow版本:

    import tensorflow as tf
    x=tf.placeholder(tf.float64,shape=(None,xdim))
    y=tf.placeholder(tf.float64,shape=(None))
    Weights = tf.Variable(tf.random_normal([xdim, 1],dtype=tf.float64))
    biases = tf.Variable(0.1,dtype=tf.float64)
    y_predict = tf.matmul(x, Weights) + biases
    loss = tf.reduce_mean(tf.square(y_predict - y))
    optimizer = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
    
    batch_size=100
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        for i in range(10001):
            start = i * batch_size % data_size
            end = min(start + batch_size,data_size)
            sess.run(optimizer,feed_dict={x:X[start:end],y:Y[start:end]})
            if i % 1000 == 0:
                ypred,training_loss= sess.run([y_predict,loss],feed_dict={x:X,y:Y})
                print("Epoch %d: loss=%g"%(i,training_loss))
    

    Tensorflow版本的输出:

    Epoch 0: loss=1.0679
    Epoch 1000: loss=0.11685
    Epoch 2000: loss=0.0842979
    Epoch 3000: loss=0.0827121
    Epoch 4000: loss=0.0824983
    Epoch 5000: loss=0.0824296
    Epoch 6000: loss=0.0824021
    Epoch 7000: loss=0.0823903
    Epoch 8000: loss=0.0823851
    Epoch 9000: loss=0.0823826
    Epoch 10000: loss=0.0823814
    

    Keras版本:

    from keras.models import Sequential
    from keras.layers import Dense
    import numpy as np
    
    model = Sequential()
    model.add(Dense(units=1, input_dim=xdim)) 
    model.compile(loss='mse', optimizer='sgd')
    
    batch_size=100
    for i in range(10001):
        start = i * batch_size % data_size
        end = min(start + batch_size,data_size)
        cost = model.train_on_batch(X[start:end], np.array(Y[start:end]))
        if i % 1000 == 0:
            print("Epoch %d: loss=%g"%(i,cost))
    

    Keras版本的输出:

    Epoch 0: loss=0.261707
    Epoch 1000: loss=0.00811771
    Epoch 2000: loss=0.000325865
    Epoch 3000: loss=2.21623e-05
    Epoch 4000: loss=4.63907e-06
    Epoch 5000: loss=1.66684e-06
    Epoch 6000: loss=6.55329e-07
    Epoch 7000: loss=2.61024e-07
    Epoch 8000: loss=1.04213e-07
    Epoch 9000: loss=4.16416e-08
    Epoch 10000: loss=1.66369e-08
    

    我认为两段代码应该是等效的,差别是我不知道keras内部如何设定learning rate。为什么keras可以得到正确结果,tensorflow却不行呢?请问我哪边弄错呢?

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 、輾轉反側 普通会员 1楼

      Keras和TensorFlow都是用於深度學習的開源開源框架,但它们在訓練和部署上有一些差異:

      1. 數據準備:TensorFlow使用tf.data.Dataset API來準備和讀取數據。Keras使用tf.keras.utils.Dataset API,但也可以直接使用TensorFlow Dataset API。此外,TensorFlow還提供了一些其他工具和API,如tf.data pipelines和tf.data reader writer,可以幫助您更方便地進行數據預處理。

      2. 模型設計:TensorFlow使用模型層、损失函数和優化器等特徵,而Keras使用調用器和卷積層等特徵。這意味著在TensorFlow中,您需要更複雜地設計和調整模型,而在Keras中,您可以使用更簡潔的方法。

      3. 預測和評估:TensorFlow使用tf.argmax、tf.reduce_mean和tf.reduce_sum等操作符來進行預測和評估,而Keras也提供了類似的功能,但具體操作符可能會有所不同。此外,TensorFlow還提供了一些其他工具和API,如tf.keras.metrics和tf.keras.callbacks,可以幫助您更方便地進行預測和評估。

      4. 特征轉換:TensorFlow使用tf.keras.layers和tf.keras.models等特徵,而Keras也提供了類似的功能,但具體操作符可能會有所不同。此外,TensorFlow還提供了一些其他工具和API,如tf.keras.layers.normalization和tf.keras.layers.convolutional,可以幫助您更方便地進行特征轉換。

      總的來說,Keras和TensorFlow都是用於深度學習的開源框架,但它们在數據準備、模型設計、預測和評估、特徵轉換等方面存在一些差異。您需要根據您的需求和場景來選擇使用哪一個框架。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部