Проблема подгонки кривой TensorFlow и подверженные ошибкам ямы

глубокое обучение

1. Реализация кода

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

x_data_arr = np.linspace(-0.5, 0.5, 200)
x_data = x_data_arr[np.newaxis, : ]
noise = np.random.normal(0, 0.02, x_data.shape) 
y_data = x_data**2 + noise 

print(x_data.shape, y_data.shape)
plt.scatter(x_data, y_data)
plt.title("scatter points")

在这里插入图片描述

x = tf.placeholder(tf.float32, name = "x")  # 定义占位符
y = tf.placeholder(tf.float32, name = "y")
w1 = tf.Variable(tf.random_normal([10, 1]))  
b1 = tf.Variable(tf.zeros([10, 1])) 
z1 = tf.matmul(w1, x) + b1  
a1 = tf.nn.tanh(z1)  

w2 = tf.Variable(tf.random_normal([1, 10])) 
b2 = tf.Variable(tf.zeros([1, 1]))
z2 = tf.matmul(w2, a1) + b2
prediction = tf.nn.tanh(z2)
loss = tf.reduce_mean(tf.square(y - prediction))  
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) 

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer()) 
    for i in range(6000):
        sess.run(train_step, feed_dict={x: x_data, y: y_data}) 
        if i%1000 == 0:
            print(sess.run(loss, feed_dict={x: x_data, y:y_data}))
 
    prediction_y = sess.run(prediction, feed_dict={x: x_data}) 
    # 把矩阵squeeze为秩为1的数组,才能plt.plot
    prediction_y_squeeze = np.squeeze(prediction_y)
    x_data_squeeze = np.squeeze(x_data)
    # 画图
    plt.figure()
    plt.scatter(x_data, y_data) 
    plt.plot(x_data_squeeze, prediction_y_squeeze, c='r', lw=3)
    plt.title("curve")
    plt.xlabel("x")
    plt.ylabel("y")
    plt.show()

在这里插入图片描述

2. Матрица в массив в plt

При использовании matplotlib.pyplot для рисования следует отметить, что plt.plot может рисовать только одномерные массивы, а не матрицы. Чтобы преобразовать матрицу в массив ранга 1, используйте следующий код:

x_squeeze = np.squeeze(x)

Если x и y являются матрицами (1, 200), можно рисовать только диаграммы рассеяния:

plt.scatter(x, y, c='r', s=1) 

Если вы хотите рисовать непрерывные изображения с графиком, вам нужно сначала преобразовать матрицу:

x_squeeze = np.squeeze(x)
y_squeeze = np.squeeze(y)
plt.plot(x_squeeze, y_squeeze, c='r', lw=5)

3. Массив в матрицу

# np.linspace是生成一维数组,而神经网络需要的是矩阵
x_data_arr = np.linspace(-0.5, 0.5, 200)
# 在数组后加上[np.newaxis, :]表示转行向量,[: ,np.newaxis]表示转列向量
x_data = x_data_arr[np.newaxis, : ]

В-четвертых, проблема размерности нейронной сети

Формула прямого распространения:z[l]=w[l]a[l1]+b[l]z^{[l]}=w^{[l]}a^{[l-1]}+b^{[l]}

a[l]=g[l](z[l])a^{[l]}=g^{[l]}(z^{[l]})

Обратное распространение: tensorflow можно реализовать за один шаг, так что не стесняйтесь передавать его в tf для вывода и оптимизации!

Подведем итоги с помощью закона размерности в глубоком обучении:w[l]:(n[l1],n[l])w^{[l]}:(n^{[l-1]},n^{[l]})

b[l]:(n[l],1)b^{[l]}:(n^{[l]},1)

z[l]:(n[l],1)z^{[l]}:(n^{[l]},1)

a[l]:(n[l],1)a^{[l]}:(n^{[l]},1)

Ну, вышесказанное является ключевым, но только основой измерения, ключевые моменты, которые я хочу упомянуть, приведены ниже: Я прочитал много сообщений в блогах о подгонке кривых, но не ясно, как получаются размеры веса инициализации w и порога b, и на что следует обратить внимание. Ниже приведены некоторые моменты программирования, которые я обобщил⚠

  • Задача подбора кривой имеетxyx\to yОтображение m x соответствует m y, подумайте об этой проблеме со стандартной идеей глубокого обучения: вход x и выход y являются матрицами (200, 1), количество выборок равно 200, а размерность каждой выборки равна 1. , столбец каждой выборки соответствует элементу выходной матрицы y.
  • Хотя есть m выборок,b[l]:(n[l],1)b[l]:(n[l],m)b^{[l]}:(n^{[l]},1)\to b^{[l]}:(n^{[l]},m), а не заменил 1 на 200 в коде! Это для единичной выборки, когда заполнитель заменяется реальными данными! Это начало векторизации. Студенты, изучившие глубокое обучение, не должны путать теорию с практикой!
  • Код измерения для параметров инициализации:
w1 = tf.Variable(tf.random_normal([ n_x, n^[1] ]))
b1 = tf.Variable(tf.zeros([ n^[1], 1 ]))

z1 = tf.matmul(w1, x) + b
a1 = tf.nn.tanh(z1)