Bạn có hai phần trong câu hỏi của bạn:
- Làm thế nào để thay đổi vấn đề này với một không gian chiều cao.
- Làm thế nào để thay đổi từ độ dốc hàng loạt gốc xuống gốc gốc ngẫu nhiên.
Để có cài đặt chiều cao hơn, bạn có thể xác định vấn đề tuyến tính của mình y = <x, w>
. Sau đó, bạn chỉ cần thay đổi thứ nguyên của Biến số W
để khớp với một trong số w
và thay thế phép nhân W*x_data
bằng sản phẩm vô hướng tf.matmul(x_data, W)
và mã của bạn sẽ chạy tốt.
Để thay đổi phương thức học thành gốc gốc ngẫu nhiên, bạn cần trừu tượng hóa đầu vào của hàm chi phí bằng cách sử dụng tf.placeholder
.
Khi bạn đã xác định X
và y_
để giữ đầu vào của mình ở mỗi bước, bạn có thể tạo cùng một chức năng chi phí. Sau đó, bạn cần phải gọi cho bước của bạn bằng cách cho ăn một lô nhỏ dữ liệu thích hợp.
Dưới đây là ví dụ về cách bạn có thể thực hiện hành vi như vậy và nó sẽ cho thấy rằng W
nhanh chóng hội tụ thành w
.
import tensorflow as tf
import numpy as np
# Define dimensions
d = 10 # Size of the parameter space
N = 1000 # Number of data sample
# create random data
w = .5*np.ones(d)
x_data = np.random.random((N, d)).astype(np.float32)
y_data = x_data.dot(w).reshape((-1, 1))
# Define placeholders to feed mini_batches
X = tf.placeholder(tf.float32, shape=[None, d], name='X')
y_ = tf.placeholder(tf.float32, shape=[None, 1], name='y')
# Find values for W that compute y_data = <x, W>
W = tf.Variable(tf.random_uniform([d, 1], -1.0, 1.0))
y = tf.matmul(X, W, name='y_pred')
# Minimize the mean squared errors.
loss = tf.reduce_mean(tf.square(y_ - y))
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
# Before starting, initialize the variables
init = tf.initialize_all_variables()
# Launch the graph.
sess = tf.Session()
sess.run(init)
# Fit the line.
mini_batch_size = 100
n_batch = N // mini_batch_size + (N % mini_batch_size != 0)
for step in range(2001):
i_batch = (step % n_batch)*mini_batch_size
batch = x_data[i_batch:i_batch+mini_batch_size], y_data[i_batch:i_batch+mini_batch_size]
sess.run(train, feed_dict={X: batch[0], y_: batch[1]})
if step % 200 == 0:
print(step, sess.run(W))
Hai lưu ý phụ:
Việc thực hiện dưới đây được gọi là mini-lô gradient descent như tại mỗi bước, gradient được tính bằng một tập hợp các dữ liệu của chúng ta về kích thước mini_batch_size
. Đây là một biến thể từ gốc dốc ngẫu nhiên thường được sử dụng để ổn định ước lượng gradient ở mỗi bước. Có thể thu được độ dốc gốc ngẫu nhiên bằng cách thiết lập mini_batch_size = 1
.
Tập dữ liệu có thể xáo trộn ở mọi thời đại để có được triển khai gần hơn với việc xem xét lý thuyết. Một số công việc gần đây cũng chỉ xem xét việc sử dụng một lần thông qua tập dữ liệu của bạn vì nó ngăn chặn quá phù hợp. Để có giải thích chi tiết và toán học hơn, bạn có thể xem Bottou12. Điều này có thể dễ dàng thay đổi theo thiết lập vấn đề của bạn và thuộc tính thống kê mà bạn đang tìm kiếm.
Nguồn
2016-03-16 20:01:25
Chúng tôi không phải ngẫu nhiên trộn dữ liệu ở mỗi bước? –
Theo bài viết wikipedia, đối với phiên bản lặp lại chúng tôi phải lặp lại mỗi lần thực hiện đào tạo tại mọi điểm, mặc dù đào tạo chỉ mất một hoặc nhiều điểm dữ liệu để cập nhật –
Tôi không thể nhận được những gì bạn đã làm trong dòng n_batch = N // 100 + (N% 100! = 0) –