Lưu biến trăn dưa chua

Cập nhật. Bài viết phổ biến này cho biết cách lưu và khôi phục các mô hình trong Tensorflow 1. x. Nếu bạn muốn học tương tự với Tensorflow2. x, vui lòng xem bài viết giải thích cách lưu và khôi phục Tensorflow 2. x mô hình

Trong hướng dẫn Tensorflow này, tôi sẽ giải thích

  1. Mô hình Tensorflow trông như thế nào?
  2. Làm cách nào để lưu mô hình Tensorflow?
  3. Làm cách nào để khôi phục mô hình Tensorflow để học dự đoán/chuyển giao?
  4. Cách làm việc với các mô hình được đào tạo trước đã nhập để tinh chỉnh và sửa đổi

Hướng dẫn này giả định rằng bạn có một số ý tưởng về đào tạo mạng lưới thần kinh. Nếu không, vui lòng làm theo hướng dẫn này và quay lại đây

1. Mô hình Tensorflow là gì?

Sau khi bạn đã đào tạo một mạng lưới thần kinh, bạn sẽ muốn lưu nó để sử dụng trong tương lai và triển khai vào sản xuất. Vậy, mô hình Tensorflow là gì? . Do đó, mô hình Tensorflow có hai tệp chính

a] Siêu đồ thị

Đây là bộ đệm giao thức lưu biểu đồ Tensorflow hoàn chỉnh; . e. tất cả các biến, hoạt động, bộ sưu tập, v.v. Tập tin này có. phần mở rộng meta

b] Tệp điểm kiểm tra

Đây là tệp nhị phân chứa tất cả các giá trị của trọng số, độ lệch, độ dốc và tất cả các biến khác được lưu. Tập tin này có phần mở rộng. ckpt. Tuy nhiên, Tensorflow đã thay đổi điều này từ phiên bản 0. 11. Bây giờ, thay vì độc thân. ckpt, chúng tôi có hai tệp

con trăn

1

2

3

 

mô hình của tôi. dữ liệu - 00000 - của-00001

mô hình của tôi. chỉ mục

tệp dữ liệu là tệp chứa các biến đào tạo của chúng tôi và chúng tôi sẽ theo dõi nó

Cùng với điều này, Tensorflow cũng có một tệp có tên điểm kiểm tra, đơn giản là lưu giữ bản ghi các tệp điểm kiểm tra mới nhất được lưu

Vì vậy, để tóm tắt, các mô hình Tensorflow cho các phiên bản lớn hơn 0. 10 trông như thế này

trong khi mô hình Tensorflow trước 0. 11 chỉ chứa ba tệp

con trăn

1

2

3

4

 

inception_v1. siêu dữ liệu

inception_v1. ckpt

trạm kiểm soát

Bây giờ chúng ta đã biết mô hình Tensorflow trông như thế nào, hãy tìm hiểu cách lưu mô hình

2. Lưu mô hình Tensorflow

Giả sử bạn đang huấn luyện một mạng nơ-ron tích chập để phân loại hình ảnh. Như một thông lệ tiêu chuẩn, bạn theo dõi số liệu thua lỗ và độ chính xác. Khi bạn thấy rằng mạng đã hội tụ, bạn có thể dừng quá trình đào tạo theo cách thủ công hoặc bạn sẽ chạy quá trình đào tạo trong một số kỷ nguyên cố định. Sau khi đào tạo xong, chúng tôi muốn lưu tất cả các biến và biểu đồ mạng vào một tệp để sử dụng trong tương lai. Vì vậy, trong Tensorflow, bạn muốn lưu biểu đồ và giá trị của tất cả các tham số mà chúng ta sẽ tạo một phiên bản của tf. tàu hỏa. lớp Saver[]

saver = tf.train.Saver[]

Hãy nhớ rằng các biến Tensorflow chỉ tồn tại trong một phiên. Vì vậy, bạn phải lưu mô hình bên trong phiên bằng cách gọi phương thức lưu trên đối tượng trình tiết kiệm mà bạn vừa tạo

con trăn

1

2

 

trình tiết kiệm. lưu[ss, ']

Ở đây, sess là đối tượng phiên, trong khi 'my-test-model' là tên bạn muốn đặt cho mô hình của mình. Hãy xem một ví dụ hoàn chỉnh

con trăn

1

2

3

4

5

6

7

8

9

10

11

12

13

14

 

nhập tensorflow as tf

w1 = tf. Biến[tf. random_normal[hình dạng = [2]], name='w1']

w2 = tf. Biến[tf. random_normal[hình dạng = [5]], name='w2']

trình tiết kiệm = tf. huấn luyện. Trình tiết kiệm[]

sess = tf. Phiên[]

chúc. chạy[tf. global_variables_initializer[]]

trình tiết kiệm. lưu[ss, ']

 

# Điều này sẽ lưu các tệp sau trong Tensorflow v >= 0. 11

# my_test_model. dữ liệu-00000-of-00001

# my_test_model. mục lục

# my_test_model. meta

# trạm kiểm soát

Nếu chúng tôi đang lưu mô hình sau 1000 lần lặp lại, chúng tôi sẽ gọi lưu bằng cách chuyển số bước

saver.save[sess, 'my_test_model',global_step=1000]

Điều này sẽ chỉ thêm '-1000' vào tên kiểu máy và các tệp sau sẽ được tạo

con trăn

1

2

3

4

5

 

my_test_model - 1000. chỉ mục

my_test_model - 1000. siêu dữ liệu

my_test_model - 1000. dữ liệu - 00000 - của-00001

trạm kiểm soát

Giả sử, trong khi đào tạo, chúng tôi đang lưu mô hình của mình sau mỗi 1000 lần lặp lại, vì vậy. tệp meta được tạo lần đầu tiên [ở lần lặp thứ 1000] và chúng tôi không cần phải tạo lại. meta mỗi lần [vì vậy, chúng tôi không lưu tệp. tệp meta ở 2000, 3000. hoặc bất kỳ lần lặp nào khác]. Chúng tôi chỉ lưu mô hình cho các lần lặp lại tiếp theo vì biểu đồ sẽ không thay đổi. Do đó, khi chúng tôi không muốn viết biểu đồ meta, chúng tôi sử dụng cái này

con trăn

1

2

 

trình tiết kiệm. lưu[ss, ', global_step=step,write_meta_graph=False]

Nếu bạn chỉ muốn giữ 4 mô hình mới nhất và muốn lưu một mô hình sau mỗi 2 giờ trong quá trình đào tạo, bạn có thể sử dụng max_to_keep và keep_checkpoint_every_n_hours như thế này

con trăn

1

2

3

 

# lưu một mô hình cứ sau 2 giờ và lưu tối đa 4 mô hình mới nhất

trình tiết kiệm = tf. huấn luyện. Tiết kiệm[max_to_keep = 4, keep_checkpoint_every_n_hours=2]

 

Lưu ý, nếu chúng tôi không chỉ định bất cứ điều gì trong tf. tàu hỏa. Saver[], nó lưu tất cả các biến. Điều gì sẽ xảy ra nếu, chúng tôi không muốn lưu tất cả các biến và chỉ một số trong số chúng. Chúng tôi có thể chỉ định các biến/bộ sưu tập mà chúng tôi muốn lưu. Trong khi tạo tf. tàu hỏa. Ví dụ Saver chúng tôi chuyển cho nó một danh sách hoặc một từ điển các biến mà chúng tôi muốn lưu. Hãy xem một ví dụ

con trăn

1

2

3

4

5

6

7

8

 

nhập tensorflow as tf

w1 = tf. Biến[tf. random_normal[hình dạng = [2]], name='w1']

w2 = tf. Biến[tf. random_normal[hình dạng = [5]], name='w2']

trình tiết kiệm = tf. huấn luyện. Trình tiết kiệm[[w1,w2]]

sess = tf. Phiên[]

chúc. chạy[tf. global_variables_initializer[]]

trình tiết kiệm. lưu[ss, ',global_step=1000]

Điều này có thể được sử dụng để lưu một phần cụ thể của biểu đồ Tensorflow khi được yêu cầu

3. Nhập một mô hình được đào tạo trước

Nếu bạn muốn sử dụng mô hình được đào tạo trước của người khác để tinh chỉnh, có hai điều bạn cần làm

a] Tạo mạng

Bạn có thể tạo mạng bằng cách viết mã python để tạo thủ công từng lớp như mô hình ban đầu. Tuy nhiên, nếu bạn nghĩ về nó, chúng tôi đã cứu mạng trong. meta mà chúng ta có thể sử dụng để tạo lại mạng bằng tf. tàu hỏa. hàm import[] như thế này. saver = tf.train.import_meta_graph['my_test_model-1000.meta']

Hãy nhớ rằng, import_meta_graph nối thêm mạng được xác định trong. tệp meta vào biểu đồ hiện tại. Vì vậy, điều này sẽ tạo biểu đồ/mạng cho bạn nhưng chúng tôi vẫn cần tải giá trị của các tham số mà chúng tôi đã đào tạo trên biểu đồ này

b] Nạp tham số

Chúng tôi có thể khôi phục các tham số của mạng bằng cách gọi khôi phục trên trình tiết kiệm này, đây là một phiên bản của tf. tàu hỏa. lớp Saver[]

con trăn

1

2

3

4

 

với tf. Phiên[] như phiên . :

  new_saver = tf. huấn luyện. import_meta_graph['my_test_model-1000. meta']

  new_saver. khôi phục[sess, tf . .huấn luyện. latest_checkpoint['. /']]

Sau đó, giá trị của các tenxơ như w1 và w2 đã được khôi phục và có thể được truy cập

con trăn

1

2

3

4

5

6

 

với tf. Phiên[] như phiên . :    

    trình tiết kiệm = tf. huấn luyện. import_meta_graph['my-model-1000. meta']

    trình tiết kiệm. khôi phục[sess,tf . .huấn luyện. latest_checkpoint['. /']]

    in[ses. chạy['w1. 0']]

##Mô hình đã được khôi phục. Câu lệnh trên sẽ in giá trị đã lưu của w1

Vì vậy, bây giờ bạn đã hiểu cách lưu và nhập hoạt động cho mô hình Tensorflow. Trong phần tiếp theo, tôi đã mô tả cách sử dụng thực tế ở trên để tải bất kỳ mô hình được đào tạo trước nào

4. Làm việc với các mô hình được khôi phục

Bây giờ bạn đã hiểu cách lưu và khôi phục các mô hình Tensorflow, Hãy phát triển một hướng dẫn thực tế để khôi phục bất kỳ mô hình được đào tạo trước nào và sử dụng nó để dự đoán, tinh chỉnh hoặc đào tạo thêm. Bất cứ khi nào bạn đang làm việc với Tensorflow, bạn xác định một biểu đồ được cung cấp các ví dụ [dữ liệu đào tạo] và một số siêu tham số như tốc độ học tập, bước toàn cầu, v.v. Đó là một thông lệ tiêu chuẩn để cung cấp tất cả dữ liệu đào tạo và siêu tham số bằng cách sử dụng trình giữ chỗ. Hãy xây dựng một mạng nhỏ bằng cách sử dụng trình giữ chỗ và lưu nó. Lưu ý rằng khi mạng được lưu, các giá trị của trình giữ chỗ không được lưu

con trăn

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

 

nhập tensorflow as tf

 

#Chuẩn bị nguồn cấp dữ liệu đầu vào, tôi. e. feed_dict và trình giữ chỗ

w1 = tf. giữ chỗ["float", name="w1"]

w2 = tf. giữ chỗ["float", name="w2"]

b1 = tf. Biến[2. 0,tên = "bias"]

feed_dict = {w1. 4,w2. 8}

 

#Xác định hoạt động thử nghiệm mà chúng tôi sẽ khôi phục

w3 = tf. thêm[w1,w2]

w4 = tf. nhân lên[w3,b1,name="op_to_restore"]

sess = tf. Phiên[]

chúc. chạy[tf. global_variables_initializer[]]

 

#Tạo một đối tượng tiết kiệm sẽ lưu tất cả các biến

trình tiết kiệm = tf. huấn luyện. Trình tiết kiệm[]

 

# Chạy hoạt động bằng cách nạp đầu vào

in đánh giá. chạy[w4,feed_dict]

#Prints 24 là tổng của [w1+w2]*b1

 

#Bây giờ, hãy lưu biểu đồ

trình tiết kiệm. lưu[ss, ',global_step=1000]

Bây giờ, khi chúng tôi muốn khôi phục nó, chúng tôi không chỉ phải khôi phục biểu đồ và trọng số mà còn phải chuẩn bị một feed_dict mới sẽ cung cấp dữ liệu đào tạo mới cho mạng. Chúng tôi có thể tham chiếu đến các hoạt động đã lưu này và các biến giữ chỗ thông qua biểu đồ. phương thức get_tensor_by_name[]

con trăn

1

2

3

4

5

6

 

#Cách truy cập biến/Tensor/placeholders đã lưu

w1 = đồ thị. get_tensor_by_name["w1. 0"]

 

## Cách truy cập thao tác đã lưu

op_to_restore = biểu đồ. get_tensor_by_name["op_to_restore. 0"]

Nếu chúng tôi chỉ muốn chạy cùng một mạng với các dữ liệu khác nhau, bạn chỉ cần chuyển dữ liệu mới qua feed_dict vào mạng

Khôi phục mô hình và đào tạo lại với dữ liệu của riêng bạn

con trăn

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

 

nhập tensorflow as tf

 

sess = tf. Phiên[]    

#Đầu tiên, hãy tải biểu đồ meta và khôi phục trọng số

trình tiết kiệm = tf. huấn luyện. import_meta_graph['my_test_model-1000. meta']

trình tiết kiệm. khôi phục[sess,tf . .đào tạo. latest_checkpoint['. /']]

 

 

# Bây giờ, hãy truy cập và tạo các biến giữ chỗ và

# tạo feed-dict để nạp dữ liệu mới

 

đồ thị = tf. get_default_graph[]

w1 = đồ thị. get_tensor_by_name["w1. 0"]

w2 = đồ thị. get_tensor_by_name["w2. 0"]

feed_dict = {w1. 13. 0,w2. 17. 0}

 

#Bây giờ, hãy truy cập op mà bạn muốn chạy

op_to_restore = biểu đồ. get_tensor_by_name["op_to_restore. 0"]

 

in đánh giá. chạy[op_to_restore,feed_dict]

#Điều này sẽ in 60 được tính toán

#sử dụng các giá trị mới của w1 và w2 và giá trị đã lưu của b1

Điều gì sẽ xảy ra nếu bạn muốn thêm nhiều thao tác hơn vào biểu đồ bằng cách thêm nhiều lớp hơn rồi huấn luyện nó. Tất nhiên bạn cũng có thể làm điều đó. Xem tại đây

Khôi phục mô hình và đào tạo lại với dữ liệu của riêng bạn

con trăn

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

 

nhập tensorflow as tf

 

sess = tf. Phiên[]    

#Đầu tiên, hãy tải biểu đồ meta và khôi phục trọng số

trình tiết kiệm = tf. huấn luyện. import_meta_graph['my_test_model-1000. meta']

trình tiết kiệm. khôi phục[sess,tf . .đào tạo. latest_checkpoint['. /']]

 

 

# Bây giờ, hãy truy cập và tạo các biến giữ chỗ và

# tạo feed-dict để nạp dữ liệu mới

 

đồ thị = tf. get_default_graph[]

w1 = đồ thị. get_tensor_by_name["w1. 0"]

w2 = đồ thị. get_tensor_by_name["w2. 0"]

feed_dict = {w1. 13. 0,w2. 17. 0}

 

#Bây giờ, hãy truy cập op mà bạn muốn chạy

op_to_restore = biểu đồ. get_tensor_by_name["op_to_restore. 0"]

 

#Thêm vào biểu đồ hiện tại

add_on_op = tf. nhân lên[op_to_restore,2]

 

in đánh giá. chạy[add_on_op,feed_dict]

#Điều này sẽ in 120

Tuy nhiên, bạn có thể khôi phục một phần của biểu đồ cũ và bổ sung vào biểu đồ đó để tinh chỉnh không? . get_tensor_by_name[] và xây dựng biểu đồ trên đó. Đây là một ví dụ thực tế. Ở đây, chúng tôi tải một mạng được đào tạo trước vgg bằng biểu đồ meta và thay đổi số lượng đầu ra thành 2 ở lớp cuối cùng để tinh chỉnh với dữ liệu mới

Chủ Đề