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, : ]
В-четвертых, проблема размерности нейронной сети
Формула прямого распространения:
Обратное распространение: tensorflow можно реализовать за один шаг, так что не стесняйтесь передавать его в tf для вывода и оптимизации!
Подведем итоги с помощью закона размерности в глубоком обучении:
Ну, вышесказанное является ключевым, но только основой измерения, ключевые моменты, которые я хочу упомянуть, приведены ниже: Я прочитал много сообщений в блогах о подгонке кривых, но не ясно, как получаются размеры веса инициализации w и порога b, и на что следует обратить внимание. Ниже приведены некоторые моменты программирования, которые я обобщил⚠
- Задача подбора кривой имеетОтображение m x соответствует m y, подумайте об этой проблеме со стандартной идеей глубокого обучения: вход x и выход y являются матрицами (200, 1), количество выборок равно 200, а размерность каждой выборки равна 1. , столбец каждой выборки соответствует элементу выходной матрицы y.
- Хотя есть 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)