CNTK - Klasifikasi Jaringan Neural
Pada bab ini, kita akan mempelajari bagaimana mengklasifikasikan jaringan saraf dengan menggunakan CNTK.
pengantar
Klasifikasi dapat didefinisikan sebagai proses untuk memprediksi label keluaran kategorial atau tanggapan untuk data masukan yang diberikan. Keluaran yang dikategorikan, yang akan didasarkan pada apa yang telah dipelajari model dalam fase pelatihan, dapat berbentuk seperti "Hitam" atau "Putih" atau "spam" atau "tidak ada spam".
Di sisi lain, secara matematis, ini adalah tugas untuk memperkirakan fungsi pemetaan, katakanlah f dari variabel input katakan X ke variabel output katakan Y.
Contoh klasik dari masalah klasifikasi adalah deteksi spam di email. Jelas bahwa hanya ada dua kategori keluaran, "spam" dan "tidak ada spam".
Untuk menerapkan klasifikasi seperti itu, pertama-tama kita perlu melakukan pelatihan pengklasifikasi di mana email "spam" dan "tanpa spam" akan digunakan sebagai data pelatihan. Setelah pengklasifikasi berhasil dilatih, pengklasifikasi dapat digunakan untuk mendeteksi email yang tidak dikenal.
Di sini, kita akan membuat 4-5-3 NN menggunakan dataset bunga iris yang memiliki:
Node 4-masukan (satu untuk setiap nilai prediktor).
5 node pemrosesan tersembunyi.
Node 3-output (karena ada tiga kemungkinan spesies dalam dataset iris).
Memuat Set Data
Kami akan menggunakan dataset bunga iris, dari mana kami ingin mengklasifikasikan spesies bunga iris berdasarkan sifat fisik lebar dan panjang sepal, dan lebar dan panjang kelopak. Dataset menggambarkan sifat fisik berbagai varietas bunga iris -
Panjang sepal
Lebar sepal
Panjang kelopak
Lebar kelopak
Kelasnya yaitu iris setosa atau iris versicolor atau iris virginica
Kita punya iris.CSVfile yang kami gunakan sebelumnya di bab-bab sebelumnya juga. Itu dapat dimuat dengan bantuanPandasPerpustakaan. Namun, sebelum menggunakannya atau memuatnya untuk pengklasifikasi kita, kita perlu menyiapkan file training dan test, agar dapat digunakan dengan mudah dengan CNTK.
Mempersiapkan file pelatihan & pengujian
Dataset Iris adalah salah satu set data paling populer untuk proyek ML. Ini memiliki 150 item data dan data mentah terlihat sebagai berikut -
5.1 3.5 1.4 0.2 setosa
4.9 3.0 1.4 0.2 setosa
…
7.0 3.2 4.7 1.4 versicolor
6.4 3.2 4.5 1.5 versicolor
…
6.3 3.3 6.0 2.5 virginica
5.8 2.7 5.1 1.9 virginica
Seperti yang dikisahkan sebelumnya, empat nilai pertama pada setiap garis menggambarkan sifat fisik varietas yang berbeda, yaitu panjang sepal, lebar sepal, panjang kelopak, lebar kelopak bunga iris.
Tapi, kita harus mengkonversi datanya dalam format yang mudah digunakan oleh CNTK dan formatnya adalah file .ctf (kita juga membuat satu iris.ctf di bagian sebelumnya). Ini akan terlihat seperti berikut -
|attribs 5.1 3.5 1.4 0.2|species 1 0 0
|attribs 4.9 3.0 1.4 0.2|species 1 0 0
…
|attribs 7.0 3.2 4.7 1.4|species 0 1 0
|attribs 6.4 3.2 4.5 1.5|species 0 1 0
…
|attribs 6.3 3.3 6.0 2.5|species 0 0 1
|attribs 5.8 2.7 5.1 1.9|species 0 0 1
Pada data di atas, tag | attribs menandai awal nilai fitur dan | spesies menandai nilai label kelas. Kita juga bisa menggunakan nama tag lain sesuai keinginan kita, bahkan kita bisa menambahkan ID item juga. Misalnya, lihat data berikut -
|ID 001 |attribs 5.1 3.5 1.4 0.2|species 1 0 0 |#setosa
|ID 002 |attribs 4.9 3.0 1.4 0.2|species 1 0 0 |#setosa
…
|ID 051 |attribs 7.0 3.2 4.7 1.4|species 0 1 0 |#versicolor
|ID 052 |attribs 6.4 3.2 4.5 1.5|species 0 1 0 |#versicolor
…
Ada total 150 item data dalam dataset iris dan untuk contoh ini, kita akan menggunakan 80-20 item data hold-out yaitu 80% (120 item) item data untuk tujuan pelatihan dan sisa 20% (30 item) item data untuk pengujian tujuan.
Membangun model Klasifikasi
Pertama, kita perlu memproses file data dalam format CNTK dan untuk itu kita akan menggunakan fungsi helper bernama create_reader sebagai berikut -
def create_reader(path, input_dim, output_dim, rnd_order, sweeps):
x_strm = C.io.StreamDef(field='attribs', shape=input_dim, is_sparse=False)
y_strm = C.io.StreamDef(field='species', shape=output_dim, is_sparse=False)
streams = C.io.StreamDefs(x_src=x_strm, y_src=y_strm)
deserial = C.io.CTFDeserializer(path, streams)
mb_src = C.io.MinibatchSource(deserial, randomize=rnd_order, max_sweeps=sweeps)
return mb_src
Sekarang, kita perlu menyetel argumen arsitektur untuk NN kita dan juga menyediakan lokasi file data. Itu dapat dilakukan dengan bantuan kode python berikut -
def main():
print("Using CNTK version = " + str(C.__version__) + "\n")
input_dim = 4
hidden_dim = 5
output_dim = 3
train_file = ".\\...\\" #provide the name of the training file(120 data items)
test_file = ".\\...\\" #provide the name of the test file(30 data items)
Sekarang, dengan bantuan baris kode berikut, program kami akan membuat NN yang tidak terlatih -
X = C.ops.input_variable(input_dim, np.float32)
Y = C.ops.input_variable(output_dim, np.float32)
with C.layers.default_options(init=C.initializer.uniform(scale=0.01, seed=1)):
hLayer = C.layers.Dense(hidden_dim, activation=C.ops.tanh, name='hidLayer')(X)
oLayer = C.layers.Dense(output_dim, activation=None, name='outLayer')(hLayer)
nnet = oLayer
model = C.ops.softmax(nnet)
Sekarang, setelah kita membuat model ganda yang tidak terlatih, kita perlu menyiapkan objek algoritme Pelajar dan kemudian menggunakannya untuk membuat objek pelatihan Trainer. Kami akan menggunakan pelajar SGD dancross_entropy_with_softmax fungsi kerugian -
tr_loss = C.cross_entropy_with_softmax(nnet, Y)
tr_clas = C.classification_error(nnet, Y)
max_iter = 2000
batch_size = 10
learn_rate = 0.01
learner = C.sgd(nnet.parameters, learn_rate)
trainer = C.Trainer(nnet, (tr_loss, tr_clas), [learner])
Kode algoritma pembelajaran sebagai berikut -
max_iter = 2000
batch_size = 10
lr_schedule = C.learning_parameter_schedule_per_sample([(1000, 0.05), (1, 0.01)])
mom_sch = C.momentum_schedule([(100, 0.99), (0, 0.95)], batch_size)
learner = C.fsadagrad(nnet.parameters, lr=lr_schedule, momentum=mom_sch)
trainer = C.Trainer(nnet, (tr_loss, tr_clas), [learner])
Sekarang, setelah kita selesai dengan objek Trainer, kita perlu membuat fungsi pembaca untuk membaca data pelatihan−
rdr = create_reader(train_file, input_dim, output_dim, rnd_order=True, sweeps=C.io.INFINITELY_REPEAT)
iris_input_map = { X : rdr.streams.x_src, Y : rdr.streams.y_src }
Sekarang saatnya melatih model NN kita−
for i in range(0, max_iter):
curr_batch = rdr.next_minibatch(batch_size, input_map=iris_input_map) trainer.train_minibatch(curr_batch)
if i % 500 == 0:
mcee = trainer.previous_minibatch_loss_average
macc = (1.0 - trainer.previous_minibatch_evaluation_average) * 100
print("batch %4d: mean loss = %0.4f, accuracy = %0.2f%% " \ % (i, mcee, macc))
Setelah kita selesai dengan pelatihan, mari kita evaluasi model menggunakan item data uji -
print("\nEvaluating test data \n")
rdr = create_reader(test_file, input_dim, output_dim, rnd_order=False, sweeps=1)
iris_input_map = { X : rdr.streams.x_src, Y : rdr.streams.y_src }
num_test = 30
all_test = rdr.next_minibatch(num_test, input_map=iris_input_map) acc = (1.0 - trainer.test_minibatch(all_test)) * 100
print("Classification accuracy = %0.2f%%" % acc)
Setelah mengevaluasi keakuratan model NN terlatih kami, kami akan menggunakannya untuk membuat prediksi pada data yang tidak terlihat -
np.set_printoptions(precision = 1, suppress=True)
unknown = np.array([[6.4, 3.2, 4.5, 1.5]], dtype=np.float32)
print("\nPredicting Iris species for input features: ")
print(unknown[0]) pred_prob = model.eval(unknown)
np.set_printoptions(precision = 4, suppress=True)
print("Prediction probabilities are: ")
print(pred_prob[0])
Model Klasifikasi Lengkap
Import numpy as np
Import cntk as C
def create_reader(path, input_dim, output_dim, rnd_order, sweeps):
x_strm = C.io.StreamDef(field='attribs', shape=input_dim, is_sparse=False)
y_strm = C.io.StreamDef(field='species', shape=output_dim, is_sparse=False)
streams = C.io.StreamDefs(x_src=x_strm, y_src=y_strm)
deserial = C.io.CTFDeserializer(path, streams)
mb_src = C.io.MinibatchSource(deserial, randomize=rnd_order, max_sweeps=sweeps)
return mb_src
def main():
print("Using CNTK version = " + str(C.__version__) + "\n")
input_dim = 4
hidden_dim = 5
output_dim = 3
train_file = ".\\...\\" #provide the name of the training file(120 data items)
test_file = ".\\...\\" #provide the name of the test file(30 data items)
X = C.ops.input_variable(input_dim, np.float32)
Y = C.ops.input_variable(output_dim, np.float32)
with C.layers.default_options(init=C.initializer.uniform(scale=0.01, seed=1)):
hLayer = C.layers.Dense(hidden_dim, activation=C.ops.tanh, name='hidLayer')(X)
oLayer = C.layers.Dense(output_dim, activation=None, name='outLayer')(hLayer)
nnet = oLayer
model = C.ops.softmax(nnet)
tr_loss = C.cross_entropy_with_softmax(nnet, Y)
tr_clas = C.classification_error(nnet, Y)
max_iter = 2000
batch_size = 10
learn_rate = 0.01
learner = C.sgd(nnet.parameters, learn_rate)
trainer = C.Trainer(nnet, (tr_loss, tr_clas), [learner])
max_iter = 2000
batch_size = 10
lr_schedule = C.learning_parameter_schedule_per_sample([(1000, 0.05), (1, 0.01)])
mom_sch = C.momentum_schedule([(100, 0.99), (0, 0.95)], batch_size)
learner = C.fsadagrad(nnet.parameters, lr=lr_schedule, momentum=mom_sch)
trainer = C.Trainer(nnet, (tr_loss, tr_clas), [learner])
rdr = create_reader(train_file, input_dim, output_dim, rnd_order=True, sweeps=C.io.INFINITELY_REPEAT)
iris_input_map = { X : rdr.streams.x_src, Y : rdr.streams.y_src }
for i in range(0, max_iter):
curr_batch = rdr.next_minibatch(batch_size, input_map=iris_input_map) trainer.train_minibatch(curr_batch)
if i % 500 == 0:
mcee = trainer.previous_minibatch_loss_average
macc = (1.0 - trainer.previous_minibatch_evaluation_average) * 100
print("batch %4d: mean loss = %0.4f, accuracy = %0.2f%% " \ % (i, mcee, macc))
print("\nEvaluating test data \n")
rdr = create_reader(test_file, input_dim, output_dim, rnd_order=False, sweeps=1)
iris_input_map = { X : rdr.streams.x_src, Y : rdr.streams.y_src }
num_test = 30
all_test = rdr.next_minibatch(num_test, input_map=iris_input_map) acc = (1.0 - trainer.test_minibatch(all_test)) * 100
print("Classification accuracy = %0.2f%%" % acc)
np.set_printoptions(precision = 1, suppress=True)
unknown = np.array([[7.0, 3.2, 4.7, 1.4]], dtype=np.float32)
print("\nPredicting species for input features: ")
print(unknown[0])
pred_prob = model.eval(unknown)
np.set_printoptions(precision = 4, suppress=True)
print("Prediction probabilities: ")
print(pred_prob[0])
if __name__== ”__main__”:
main()
Keluaran
Using CNTK version = 2.7
batch 0: mean loss = 1.0986, mean accuracy = 40.00%
batch 500: mean loss = 0.6677, mean accuracy = 80.00%
batch 1000: mean loss = 0.5332, mean accuracy = 70.00%
batch 1500: mean loss = 0.2408, mean accuracy = 100.00%
Evaluating test data
Classification accuracy = 94.58%
Predicting species for input features:
[7.0 3.2 4.7 1.4]
Prediction probabilities:
[0.0847 0.736 0.113]
Menyimpan model terlatih
Dataset Iris ini hanya memiliki 150 item data, oleh karena itu hanya perlu beberapa detik untuk melatih model pengklasifikasi NN, tetapi pelatihan pada set data besar yang memiliki ratusan atau ribu item data dapat memakan waktu berjam-jam atau bahkan berhari-hari.
Kita dapat menyimpan model kita sehingga kita tidak perlu menyimpannya dari awal. Dengan bantuan kode Python berikut, kita dapat menyimpan NN terlatih kita -
nn_classifier = “.\\neuralclassifier.model” #provide the name of the file
model.save(nn_classifier, format=C.ModelFormat.CNTKv2)
Berikut adalah argumen dari save() fungsi yang digunakan di atas -
Nama file adalah argumen pertama dari save()fungsi. Itu juga dapat ditulis bersama dengan jalur file.
Parameter lainnya adalah format parameter yang memiliki nilai default C.ModelFormat.CNTKv2.
Memuat model terlatih
Setelah Anda menyimpan model terlatih, sangat mudah untuk memuat model itu. Kami hanya perlu menggunakanload ()fungsi. Mari kita periksa dalam contoh berikut -
import numpy as np
import cntk as C
model = C.ops.functions.Function.load(“.\\neuralclassifier.model”)
np.set_printoptions(precision = 1, suppress=True)
unknown = np.array([[7.0, 3.2, 4.7, 1.4]], dtype=np.float32)
print("\nPredicting species for input features: ")
print(unknown[0])
pred_prob = model.eval(unknown)
np.set_printoptions(precision = 4, suppress=True)
print("Prediction probabilities: ")
print(pred_prob[0])
Manfaat model tersimpan adalah, setelah Anda memuat model yang disimpan, model tersebut dapat digunakan persis seperti jika model tersebut baru saja dilatih.