Keras: Develop Your First Neural Network in Python Step-By-Step
Sumber: https://machinelearningmastery.com/tutorial-first-neural-network-python-keras/
Keras adalah library Python open source free yang powerful dan mudah digunakan untuk mengembangkan dan mengevaluasi model deep learning.
Ini membungkus library perhitungan numerik yang efisien Theano dan TensorFlow dan memungkinkan kita untuk mendefinisikan dan melatih model neural network hanya dalam beberapa baris kode.
Dalam tutorial ini, kita akan menemukan cara membuat model neural network deep learning pertama dalam Python menggunakan Keras.
Keras Tutorial Overview
Tidak ada banyak kode yang diperlukan, tetapi kita akan melangkah perlahan-lahan sehingga kita akan tahu cara membuat model sendiri di masa depan.
Langkah-langkah yang akan kita bahas dalam tutorial ini adalah sebagai berikut:
- Load Data.
- Define Keras Model.
- Compile Keras Model.
- Fit Keras Model.
- Evaluate Keras Model.
- Tie It All Together.
- Make Predictions
Kebutuhan untuk bisa menjalankan tutorial:
- Python 2 atau 3
- SciPy (termasuk NumPy)
- Keras dan backend (Theano atau TensorFlow)
Selanjutnya kita dapat membuat file baru, misalnya,
keras_first_network.py
dan copy paste code ke file sambil kita jalan.
1. Load Data
Langkah pertama adalah mendefinisikan fungsi dan kelas yang ingin kita gunakan dalam tutorial ini.
Kita akan menggunakan library NumPy untuk memuat dataset kita dan kita akan menggunakan dua kelas dari library Keras untuk mendefinisikan model kita.
Import yang dibibutuhkan tampak pada daftar di bawah ini,
# first neural network with keras tutorial from numpy import loadtxt from keras.models import Sequential from keras.layers import Dense ...
Kita sekarang dapat memuat dataset kita.
Dalam tutorial Keras ini, kita akan menggunakan dataset diabetes Pima Indian. Ini adalah dataset standar machine learning dari repositori UCI Machine Learning. Ini menggambarkan data rekam medis pasien untuk orang India Pima dan apakah mereka memiliki diabetes dalam lima tahun.
Dengan apa adanya, ini adalah masalah klasifikasi biner (dengan diabetes 1 atau tidak 0). Semua variabel input yang menggambarkan setiap pasien adalah numerik. Ini membuatnya mudah digunakan secara langsung dengan neural network yang mengharapkan input numerik dan nilai output, dan ideal untuk neural network kita yang pertama di Keras.
Dataset kita tersedia dari sini:
- Dataset CSV File (pima-indians-diabetes.csv) https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv
- Dataset Details https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.names
Download dataset dan letakkan di direktori kerja lokal anda, lokasi yang sama dengan file python anda. Save dan beri nama filename:
pima-indians-diabetes.csv
Lihatlah di dalam file, kita akan melihat deretan data seperti berikut:
6,148,72,35,0,33.6,0.627,50,1 1,85,66,29,0,26.6,0.351,31,0 8,183,64,0,0,23.3,0.672,32,1 1,89,66,23,94,28.1,0.167,21,0 0,137,40,35,168,43.1,2.288,33,1 ...
Kita dapat me-load file sebagai matrix menggunakan NumPy function loadtxt().
Ada delapan variabel input dan satu variabel output (kolom terakhir). Kita akan mempelajari sebuah model untuk memetakan baris variabel input (X) ke variabel output (y), yang sering kita ringkas sebagai y = f (X).
Variabel dapat diringkas sebagai berikut:
Variable Input (X):
- Berapa kali hamil
- Konsentrasi Plasma glucose dalam 2 jam dalam oral glucose tolerance test
- Diastolic blood pressure (mm Hg)
- Triceps skin fold thickness (mm)
- 2-Hour serum insulin (mu U/ml)
- Body mass index (weight in kg/(height in m)^2)
- Diabetes pedigree function
- Umur (Tahun)
Variable Output (y):
- Class variable (0 atau 1)
Setelah file CSV dimuat ke dalam memori, kita dapat membagi kolom data menjadi variabel input dan output.
Data akan disimpan dalam array 2D di mana dimensi pertama adalah baris dan dimensi kedua adalah kolom, mis. [baris, kolom].
Kita dapat membagi array menjadi dua array dengan memilih subset kolom menggunakan operator slice NumPy standar atau “:” Kita dapat memilih 8 kolom pertama dari indeks 0 hingga indeks 7 melalui slice 0:8. Kita kemudian dapat memilih kolom output (variabel ke-9) melalui indeks 8.
... # load the dataset dataset = loadtxt('pima-indians-diabetes.csv', delimiter=',') # split into input (X) and output (y) variables X = dataset[:,0:8] y = dataset[:,8] ...
Kita sekarang siap untuk mendefinisikan model neural network kita.
Catatan, dataset memiliki 9 kolom dan kisaran 0:8 akan memilih kolom dari 0 hingga 7, berhenti sebelum indeks 8. Jika ini baru bagi anda, maka anda dapat mempelajari lebih lanjut tentang pengirisan array dan rentang dalam:
2. Define Keras Model
Model dalam Keras didefinisikan sebagai urutan lapisan.
Kita membuat model Sequential dan menambahkan layer satu per satu sampai kita puas dengan arsitektur network yang kita buat.
Hal pertama yang harus dilakukan adalah memastikan layer input memiliki jumlah fitur input yang tepat. Ini dapat ditentukan saat membuat layer pertama dengan argumen input_dim dan, misalnya, men-set menjadi 8 untuk 8 variabel input.
Bagaimana kita mengetahui jumlah lapisan dan jenisnya?
Ini pertanyaan yang sangat sulit. Setelah melalui proses trial dan experimen / percobaan panjang kita akan menemukan struktur network yang terbaik. Secara umum, kita memerlukan network yang cukup besar untuk menangkap struktur masalah.
Dalam contoh ini, kita akan menggunakan fully-connected network structure dengan tiga layer.
Fully connected layer di definisikan dengan menggunakan Dense class. Kita dapat menentukan jumlah neuron atau node di lapisan sebagai argumen pertama, dan menentukan fungsi aktivasi menggunakan argumen aktivasi.
We will use the rectified linear unit activation function referred to as ReLU on the first two layers and the Sigmoid function in the output layer.
Pada masa lalu fungsi aktivasi Sigmoid dan Tanh lebih disukai untuk semua lapisan. Saat ini, kinerja yang lebih baik dicapai menggunakan fungsi aktivasi ReLU. Kita menggunakan sigmoid pada layer output untuk memastikan output jaringan kami antara 0 dan 1 dan mudah dipetakan ke probabilitas class 1 atau snap ke klasifikasi keras dari kedua kelas dengan ambang batas standar 0,5.
Kita dapat menyatukan semuanya dengan menambahkan setiap layer:
- Model mengharapkan deretan data dengan 8 variabel (argumen input_dim = 8)
- Lapisan hidden pertama memiliki 12 node dan menggunakan fungsi aktivasi relu.
- Lapisan hidden kedua memiliki 8 node dan menggunakan fungsi aktivasi relu.
- Lapisan output memiliki satu node dan menggunakan fungsi aktivasi sigmoid.
... # define the keras model model = Sequential() model.add(Dense(12, input_dim=8, activation='relu')) model.add(Dense(8, activation='relu')) model.add(Dense(1, activation='sigmoid')) ...
Catatan, hal yang paling membingungkan di sini adalah bahwa bentuk input ke model didefinisikan sebagai argumen pada lapisan hidden pertama. Ini berarti bahwa baris kode yang menambahkan Dense Layer melakukan 2 hal, menentukan input atau lapisan yang terlihat dan lapisan hidden pertama.
3. Compile Keras Model
Sekarang model sudah didefinisikan, kita bisa meng-compile-nya.
Meng-compile model menggunakan library numerik yang efisien di belakang layar (yang disebut backend) seperti Theano atau TensorFlow. Backend secara otomatis memilih cara terbaik untuk me-representasikan network untuk training dan membuat prediksi untuk berjalan pada perangkat keras kita, seperti CPU atau GPU atau bahkan terdistribusi.
Saat mengkompilasi, kita harus menentukan beberapa properti tambahan yang diperlukan saat men-train network. Ingat network training berarti menemukan set weight terbaik untuk memetakan input ke output dalam dataset yang kita miliki.
Kita harus menentukan fungsi loss yang digunakan untuk mengevaluasi satu set weight, optimizer digunakan untuk mencari berbagai weight untuk network dan metrik opsional yang ingin kita kumpulkan dan laporkan selama pelatihan.
Dalam hal ini, kita akan menggunakan cross entropy sebagai argumen loss. Loss ini untuk masalah klasifikasi biner dan didefinisikan dalam Keras sebagai "binary_crossentropy". Kita dapat mempelajari lebih lanjut tentang memilih fungsi loss berdasarkan masalah kita di sini:
Kita akan mendefinisikan optimizer sebagai algoritma stochastic gradient descent yang efisien "adam". Ini adalah versi populer dari gradient descent karena secara otomatis men-tune diri sendiri dan memberikan hasil yang baik dalam berbagai masalah. Untuk mempelajari lebih lanjut tentang versi Adam dari stochastic gradient descent, lihat tulisan:
Akhirnya, karena ini adalah masalah klasifikasi, kita akan mengumpulkan dan melaporkan keakuratan klasifikasi, yang didefinisikan melalui argumen metrik.
... # compile the keras model model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) ...
4. Fit Keras Model
Kita telah mendefinisikan model dan meng-compile-nya agar siap untuk melakukan komputasi yang efisien.
Sekarang saatnya untuk mengeksekusi model pada beberapa data.
Kita dapat men-train atau fit model kita pada data yang dimuat dengan meng-call fungsi fit() pada model.
Training terjadi pada epoch dan setiap epoch dibagi menjadi beberapa batch.
- Epoch: Satu pass pada semua baris dalam dataset training.
- Batch: Satu atau lebih sampel yang di analisa oleh model dalam epoch sebelum weaight diperbarui.
Satu epoch terdiri dari satu atau lebih batch, berdasarkan ukuran batch yang dipilih dan model ini cocok untuk banyak epoch. Untuk lebih lanjut tentang perbedaan antara epoch dan batch, lihat posting:
Proses training akan berjalan untuk sejumlah iterasi yang tetap melalui dataset yang disebut epochs, yang harus kita tentukan menggunakan argumen epochs. Kita juga harus mengatur jumlah baris dataset yang dipertimbangkan sebelum weightmodel diperbarui dalam setiap epoch, mengambil ukuran batch dan di-set menggunakan argumen batch_size.
Untuk masalah ini, kita akan menjalakan untuk epoch yang kecil (150) dan menggunakan ukuran batch yang relatif kecil yaitu 10. Ini berarti bahwa setiap epoch akan melibatkan (150/10) 15 pembaruan untuk weight model.
Konfigurasi ini dapat dipilih secara eksperimental dengan coba-coba. Kita ingin melatih model cukup sehingga ia dapat belajar memetakan baris input data dengan baik (atau cukup baik) ke klasifikasi output. Model akan selalu memiliki beberapa kesalahan, tetapi jumlah kesalahan akan keluar setelah beberapa titik untuk konfigurasi model yang diberikan. Ini disebut model konvergensi.
... # fit the keras model on the dataset model.fit(X, y, epochs=150, batch_size=10) ...
Ini adalah perintah yang menyebabkan pekerjaan terjadi pada CPU atau GPU yang kita gunakan.
Pada contoh ini memang tidak digunakan GPU. Tapi jika kita tertarik untuk menjalankan model yang besar pada GPU hardware dapat menggunakan cloud yang murah seperti Amazon.
5. Evaluate Keras Model
Kita telah men-train neural network kita pada keseluruhan dataset dan kita dapat mengevaluasi kinerja jaringan pada dataset yang sama.
Ini hanya akan memberi kita gambaran tentang seberapa baik kita telah memodelkan dataset (mis. akurasi training), tetapi tidak tahu seberapa baik algoritma dapat bekerja pada data baru. Kita melakukan ini agar sedehana, tetapi idealnya, kita dapat memisahkan data kita ke dalam set data training dan testing untuk men-training dan meng0evaluasi model yang kita gunakan.
Kita dapat meng-evaluasi model pada dataset training menggunakan fungsi evaluate() pada model yang kita gunakan dan memberikan input dan output yang sama dengan yang digunakan untuk men-train model.
Ini akan menghasilkan prediksi untuk setiap pasangan input dan output dan mengumpulkan skor, termasuk loss rata-rata dan metrik apa pun yang telah kita konfigurasi, seperti akurasi.
Fungsi evaluate() akan mengembalikan list dengan dua nilai. Yang pertama adalah loss model pada dataset dan yang kedua adalah akurasi model pada dataset. Kita hanya tertarik untuk melaporkan keakuratan, sehingga kami akan mengabaikan nilai loss-nya.
... # evaluate the keras model _, accuracy = model.evaluate(X, y) print('Accuracy: %.2f' % (accuracy*100))
6. Tie It All Together
Kita baru saja melihat bagaimana kita dapat dengan mudah membuat model neural network pertama kita di Keras.
Mari ikat semuanya menjadi contoh kode lengkap.
# first neural network with keras tutorial from numpy import loadtxt from keras.models import Sequential from keras.layers import Dense # load the dataset dataset = loadtxt('pima-indians-diabetes.csv', delimiter=',') # split into input (X) and output (y) variables X = dataset[:,0:8] y = dataset[:,8] # define the keras model model = Sequential() model.add(Dense(12, input_dim=8, activation='relu')) model.add(Dense(8, activation='relu')) model.add(Dense(1, activation='sigmoid')) # compile the keras model model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # fit the keras model on the dataset model.fit(X, y, epochs=150, batch_size=10) # evaluate the keras model _, accuracy = model.evaluate(X, y) print('Accuracy: %.2f' % (accuracy*100))
Kita dapat menyalin semua kode ke file Python dan menyimpannya sebagai "keras_first_network.py" di direktori yang sama dengan file data "pima-indians-diabetes.csv". Kita kemudian dapat menjalankan file Python sebagai skrip dari command line (command prompt) sebagai berikut:
python keras_first_network.py
Menjalankan contoh ini, kita akan melihat pesan untuk masing-masing dari 150 epoch yang mencetak loss dan accuracy, diikuti dengan evaluasi akhir dari model yang di-train pada dataset training.
Idealnya, kita ingin loss menjadi nol dan accuracy menjadi 1,0 (mis. 100%). Ini tidak mungkin untuk problem machine learning yang paling sederhana sekalipun. Sebaliknya, kita akan selalu memiliki beberapa kesalahan dalam model yang kita gunakan. Tujuannya adalah untuk memilih konfigurasi model dan konfigurasi pelatihan yang mencapai loss terendah dan akurasi setinggi mungkin untuk dataset yang diberikan.
... 768/768 [==============================] - 0s 63us/step - loss: 0.4817 - acc: 0.7708 Epoch 147/150 768/768 [==============================] - 0s 63us/step - loss: 0.4764 - acc: 0.7747 Epoch 148/150 768/768 [==============================] - 0s 63us/step - loss: 0.4737 - acc: 0.7682 Epoch 149/150 768/768 [==============================] - 0s 64us/step - loss: 0.4730 - acc: 0.7747 Epoch 150/150 768/768 [==============================] - 0s 63us/step - loss: 0.4754 - acc: 0.7799 768/768 [==============================] - 0s 38us/step Accuracy: 76.56
Catatan, bagi mereka yang menjalankan contoh ini menggunakan IPython atau Jupyter notebook kemungkinan akan mendapat error.
Ini karena ada progress bar saat training. Kita dapat dengan mudah mematikannya dengan mengatur verbose=0 saat call ke fungsi fit() dan fungsi evaluasi(), misalnya:
... # fit the keras model on the dataset without progress bars model.fit(X, y, epochs=150, batch_size=10, verbose=0) # evaluate the keras model _, accuracy = model.evaluate(X, y, verbose=0) ...
Perhatikan, akurasi model anda akan bervariasi.
Neural network adalah algoritma stokastik, yang berarti bahwa algoritma yang sama pada data yang sama dapat melatih model yang berbeda dengan kemampuan yang berbeda setiap kali kode dijalankan. Ini adalah fitur, bukan bug. Kita dapat mempelajari lebih lanjut tentang ini di tulisan:
Varian dalam kinerja model berarti bahwa untuk mendapatkan perkiraan yang masuk akal tentang seberapa baik kinerja model, kita mungkin perlu menyesuaikannya berkali-kali dan menghitung rata-rata skor akurasi. Untuk lebih lanjut tentang pendekatan ini untuk meng-evaluasi neural network, lihat posting:
Misalnya, di bawah ini adalah skor akurasi dari re-run contoh 5 kali:
Accuracy: 75.00 Accuracy: 77.73 Accuracy: 77.60 Accuracy: 78.12 Accuracy: 76.17
Kita dapat melihat bahwa semua skor akurasi sekitar 77% dan rata-rata 76,924%.
7. Make Prediction
Pertanyaan pertama yang biasanya akan kita tanyakan adalah "Setelah kita men-train model, bagaimana kita bisa menggunakan-nya untuk melakukan prediksi pada data baru?"
Pertanyaan yang baik.
Kita dapat mengadaptasi contoh di atas dan menggunakannya untuk menghasilkan prediksi pada dataset training, menganggapnya sebagai dataset baru yang belum kita lihat sebelumnya.
Membuat prediksi semudah memanggil fungsi predict() pada model. Kita menggunakan fungsi aktivasi sigmoid pada layer output, sehingga prediksi akan menjadi probabilitas dalam kisaran antara 0 dan 1. Kita dapat dengan mudah mengubahnya menjadi prediksi biner yang tajam untuk tugas klasifikasi ini dengan membulatkannya.
Contoh:
... # make probability predictions with the model predictions = model.predict(X) # round predictions rounded = [round(x[0]) for x in predictions]
Sebagai alternatif, kita dapat memanggil fungsi predict_classes() pada model untuk memprediksi class secara langsung, misalnya:
... # make class predictions with the model predictions = model.predict_classes(X)
Contoh lengkap di bawah ini membuat prediksi untuk setiap contoh dalam dataset, lalu mencetak data input, prediksi class dan class yang diharapkan untuk 5 contoh pertama dalam dataset.
# first neural network with keras make predictions from numpy import loadtxt from keras.models import Sequential from keras.layers import Dense # load the dataset dataset = loadtxt('pima-indians-diabetes.csv', delimiter=',') # split into input (X) and output (y) variables X = dataset[:,0:8] y = dataset[:,8] # define the keras model model = Sequential() model.add(Dense(12, input_dim=8, activation='relu')) model.add(Dense(8, activation='relu')) model.add(Dense(1, activation='sigmoid')) # compile the keras model model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # fit the keras model on the dataset model.fit(X, y, epochs=150, batch_size=10, verbose=0) # make class predictions with the model predictions = model.predict_classes(X) # summarize the first 5 cases for i in range(5): print('%s => %d (expected %d)' % (X[i].tolist(), predictions[i], y[i]))
Menjalankan contoh tidak menunjukkan progress bar seperti sebelumnya karena kita telah men-set argumen verbose menjadi 0.
Setelah model fit, prediksi dibuat untuk semua contoh dalam dataset, dan baris input dan nilai class yang prediksi untuk 5 contoh pertama dicetak dan dibandingkan dengan nilai class yang diharapkan.
Kita dapat melihat bahwa sebagian besar baris diprediksi dengan benar. Bahkan, kita berharap sekitar 76,9% dari baris akan diprediksi dengan benar berdasarkan perkiraan kinerja model kita di bagian sebelumnya.
[6.0, 148.0, 72.0, 35.0, 0.0, 33.6, 0.627, 50.0] => 0 (expected 1) [1.0, 85.0, 66.0, 29.0, 0.0, 26.6, 0.351, 31.0] => 0 (expected 0) [8.0, 183.0, 64.0, 0.0, 0.0, 23.3, 0.672, 32.0] => 1 (expected 1) [1.0, 89.0, 66.0, 23.0, 94.0, 28.1, 0.167, 21.0] => 0 (expected 0) [0.0, 137.0, 40.0, 35.0, 168.0, 43.1, 2.288, 33.0] => 1 (expected 1)
Jika anda ingin tahu lebih banyak tentang cara membuat prediksi dengan model Keras, lihat tulisan:
Summary
Dalam posting ini, kita menemukan cara membuat model neural network pertama kita menggunakan library Python Keras yang powerful untuk deep learning.
Secara khusus, kita mempelajari enam langkah utama dalam menggunakan Keras untuk membuat neural network atau model deep learning, langkah-demi-langkah termasuk:
- Cara load data.
- Cara men-definisikan neural network di Keras.
- Cara men-compile Keras model menggunakan numerical backend yang effisien.
- Cara men-train model pada data.
- Cara meng-evaluate model pada data.
- Cara membuat prediction dengan model.