Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用带有Dataset类的TensorFlow提升到正方形_Python_Tensorflow_Neural Network_Tensorflow Datasets - Fatal编程技术网

Python 使用带有Dataset类的TensorFlow提升到正方形

Python 使用带有Dataset类的TensorFlow提升到正方形,python,tensorflow,neural-network,tensorflow-datasets,Python,Tensorflow,Neural Network,Tensorflow Datasets,我想写一个神经网络,它寻找没有预定义模型的x^2分布。精确地说,它在[-1,1]中给出了一些点及其平方来训练,然后它必须重现和预测类似的点,例如[-10,10]。 我或多或少都做过——没有数据集。但后来我试图修改它,以便使用数据集并学习如何使用它。现在,我成功地使程序运行,但输出比以前更差,主要是常数0 以前的版本类似于[-1,1]中的x^2,具有线性延长,这更好。。 现在蓝线是平的。目标是与红色的一致 这里,评论是用波兰语写的,很抱歉 # square2.py - drugie podejsc

我想写一个神经网络,它寻找没有预定义模型的x^2分布。精确地说,它在[-1,1]中给出了一些点及其平方来训练,然后它必须重现和预测类似的点,例如[-10,10]。 我或多或少都做过——没有数据集。但后来我试图修改它,以便使用数据集并学习如何使用它。现在,我成功地使程序运行,但输出比以前更差,主要是常数0

以前的版本类似于[-1,1]中的x^2,具有线性延长,这更好。。 现在蓝线是平的。目标是与红色的一致

这里,评论是用波兰语写的,很抱歉

# square2.py - drugie podejscie do trenowania sieci za pomocą Tensorflow
# cel: nauczyć sieć rozpoznawać rozkład x**2
# analiza skryptu z:
# https://stackoverflow.com/questions/43140591/neural-network-to-predict-nth-square

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
from tensorflow.python.framework.ops import reset_default_graph

# def. danych do trenowania sieci
# x_train = (np.random.rand(10**3)*4-2).reshape(-1,1)
# y_train = x_train**2
square2_dane = np.load("square2_dane.npz")
x_train = square2_dane['x_tren'].reshape(-1,1)
y_train = square2_dane['y_tren'].reshape(-1,1) 

# zoptymalizować dzielenie danych
# x_train = square2_dane['x_tren'].reshape(-1,1)
# ds_x = tf.data.Dataset.from_tensor_slices(x_train)
# batch_x = ds_x.batch(rozm_paczki)
# iterator = ds_x.make_one_shot_iterator()

# określenie parametrów sieci
wymiary = [50,50,50,1]
epoki = 500
rozm_paczki = 200

reset_default_graph()
X = tf.placeholder(tf.float32, shape=[None,1])
Y = tf.placeholder(tf.float32, shape=[None,1])

weights = []
biases = []
n_inputs = 1

# inicjalizacja zmiennych
for i,n_outputs in enumerate(wymiary):
    with tf.variable_scope("layer_{}".format(i)):
        w = tf.get_variable(name="W", shape=[n_inputs,n_outputs],initializer = tf.random_normal_initializer(mean=0.0,stddev=0.02,seed=42))
        b=tf.get_variable(name="b",shape=[n_outputs],initializer=tf.zeros_initializer)
        weights.append(w)
        biases.append(b)
        n_inputs=n_outputs

def forward_pass(X,weights,biases):
    h=X
    for i in range(len(weights)):
        h=tf.add(tf.matmul(h,weights[i]),biases[i])
        h=tf.nn.relu(h)
    return h    

output_layer = forward_pass(X,weights,biases)
f_strat = tf.reduce_mean(tf.squared_difference(output_layer,Y),1)
f_strat = tf.reduce_sum(f_strat)
# alternatywna funkcja straty
#f_strat2 = tf.reduce_sum(tf.abs(Y-y_train)/y_train)
optimizer = tf.train.AdamOptimizer(learning_rate=0.003).minimize(f_strat)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    # trenowanie
    dataset = tf.data.Dataset.from_tensor_slices((x_train,y_train))
    dataset = dataset.batch(rozm_paczki)
    dataset = dataset.repeat(epoki)
    iterator = dataset.make_one_shot_iterator()
    ds_x, ds_y = iterator.get_next()
    sess.run(optimizer, {X: sess.run(ds_x), Y: sess.run(ds_y)})
    saver = tf.train.Saver()
    save = saver.save(sess, "./model.ckpt")
    print("Model zapisano jako: %s" % save)

    # puszczenie sieci na danych
    x_test = np.linspace(-1,1,600)
    network_outputs = sess.run(output_layer,feed_dict = {X :x_test.reshape(-1,1)})

plt.plot(x_test,x_test**2,color='r',label='y=x^2')
plt.plot(x_test,network_outputs,color='b',label='sieć NN')
plt.legend(loc='right')
plt.show()
我认为问题在于训练数据的输入
sess.run(优化器,{X:sess.run(ds_X),Y:sess.run(ds_Y)})
或者用ds_x,ds_y的定义。这是我第一次参加这样的节目。。 这就是行的输出(sees块的insead)

谢谢


附言:我深受启发,有两个问题共同导致你的模型精度很差,都涉及到这一行:

sess.run(optimizer, {X: sess.run(ds_x), Y: sess.run(ds_y)})
  • 由于此代码不在循环中,因此只执行一个训练步骤。您的原始代码运行了
    len(x_train)//rozm_paczki
    步骤,这些步骤应该会取得更大的进展

  • sess.run(ds_x)
    sess.run(ds_y)
    的两个调用以单独的步骤运行,这意味着它们将包含来自不同批次的无关值。每次调用
    sess.run(ds_x)
    sess.run(ds_y)
    都会将
    迭代器
    移动到下一批,并丢弃未在
    sess.run()调用中显式请求的输入元素的任何部分。基本上,您将从批次i获得
    X
    ,从批次i+1获得
    Y
    (反之亦然),并且模型将在无效数据上训练。如果要从同一批中获取值,则需要在单个
    sess.run([ds\u x,ds\u y])
    调用中执行

  • 还有两个问题可能会影响效率:

  • 数据集
    未被洗牌。您的原始代码在每个历元开始时调用
    np.random.shuffle()
    。您应该在
    dataset=dataset.repeat()之前包含一个
    dataset=dataset.shuffle(len(x_train))

  • 将值从
    迭代器
    中提取回Python(例如,当您执行
    sess.run(ds_x)
    )并将其反馈回培训步骤时,效率很低。将
    迭代器的输出。get_next()
    操作直接作为输入传递到前馈步骤更有效

  • 总而言之,这里有一个重写版本的程序,它解决了这四个问题,并获得了正确的结果。(不幸的是,我的波兰语不够好,无法保留评论,所以我翻译成了英语。)

    sess.run(optimizer, {X: sess.run(ds_x), Y: sess.run(ds_y)})
    
    import tensorflow as tf
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Generate training data.
    x_train = np.random.rand(10**3, 1).astype(np.float32) * 4 - 2
    y_train = x_train ** 2
    
    # Define hyperparameters.
    DIMENSIONS = [50,50,50,1]
    NUM_EPOCHS = 500
    BATCH_SIZE = 200
    
    dataset = tf.data.Dataset.from_tensor_slices((x_train,y_train))
    dataset = dataset.shuffle(len(x_train))  # (Point 3.) Shuffle each epoch.
    dataset = dataset.repeat(NUM_EPOCHS)
    dataset = dataset.batch(BATCH_SIZE)
    iterator = dataset.make_one_shot_iterator()
    
    # (Point 2.) Ensure that `X` and `Y` correspond to the same batch of data.
    # (Point 4.) Pass the tensors returned from `iterator.get_next()`
    # directly as the input of the network.
    X, Y = iterator.get_next()
    
    # Initialize variables.
    weights = []
    biases = []
    n_inputs = 1
    for i, n_outputs in enumerate(DIMENSIONS):
      with tf.variable_scope("layer_{}".format(i)):
        w = tf.get_variable(name="W", shape=[n_inputs, n_outputs],
                            initializer=tf.random_normal_initializer(
                                mean=0.0, stddev=0.02, seed=42))
        b = tf.get_variable(name="b", shape=[n_outputs],
                            initializer=tf.zeros_initializer)
        weights.append(w)
        biases.append(b)
        n_inputs = n_outputs
    
    def forward_pass(X,weights,biases):
      h = X
      for i in range(len(weights)):
        h=tf.add(tf.matmul(h, weights[i]), biases[i])
        h=tf.nn.relu(h)
      return h
    
    output_layer = forward_pass(X, weights, biases)
    loss = tf.reduce_sum(tf.reduce_mean(
        tf.squared_difference(output_layer, Y), 1))
    optimizer = tf.train.AdamOptimizer(learning_rate=0.003).minimize(loss)
    saver = tf.train.Saver()
    
    with tf.Session() as sess:
      sess.run(tf.global_variables_initializer())
    
      # (Point 1.) Run the `optimizer` in a loop. Use try-while-except to iterate
      # until all elements in `dataset` have been consumed.
      try:
        while True:
          sess.run(optimizer)
      except tf.errors.OutOfRangeError:
        pass
    
      save = saver.save(sess, "./model.ckpt")
      print("Model saved to path: %s" % save)
    
      # Evaluate network.
      x_test = np.linspace(-1, 1, 600)
      network_outputs = sess.run(output_layer, feed_dict={X: x_test.reshape(-1, 1)})
    
    plt.plot(x_test,x_test**2,color='r',label='y=x^2')
    plt.plot(x_test,network_outputs,color='b',label='NN prediction')
    plt.legend(loc='right')
    plt.show()