Thuật toán training cũ chỉ train được các hình ảnh trắng đen, điều này làm khả năng tiếp cận các hình ảnh màu hoặc ảnh thực tế bị gặp khó khăn, vì vậy việc phát triển một thuật toán traning mới và kiểm soát tốt quá trình train bằng cách tạo các biểu đồ tương ứng, đồng thời tạo dựng kiến trúc CNN mới tốt hơn
Tạo kiến trúc CNN mới
Để tạo kiến trúc CNN mới tốt hơn kiến trúc CNN cũ ta cần tạo dựng CNN cũ và phân tích rõ thành phần cấu tạo bên trong kiến trúc CNN cũ.
model = Sequential()
model.add(Conv2D(8, kernel_size=(7, 7), # 8 chanel . 7*7 kích thước c ửa sổ để quét các object, tùy vào kích thước object để chọn kích thước cửa sổ
activation='relu', # bỏ giá trị âm
strides=(2, 2), # độ trượt input_shape= (400,200,3), # kích thước ảnh 60*200*3(RGB) padding='valid',)) model.add(Conv2D(16, kernel_size=(5, 5), activation='relu', strides=(2, 2), padding='valid',)) model.add(Conv2D(32, kernel_size=(5, 5), activation='relu', strides=(2, 2), padding='valid',)) model.add(Conv2D(64, kernel_size=(3, 3), activation='relu', strides=(1, 1), padding='valid',)) model.add(Conv2D(64, kernel_size=(3, 3), activation='relu', strides=(1, 1), padding='valid',))
model.add(Dense(number_class, activation='softmax'))
model.summary()
- Phân tích: số lượng tích chập
Lần tích chập đầu tiên là tích chập với filter lớn số lượng filter nhỏ mục đích là để lấy đặc điểm ảnh 1 cách cục bộ và giảm thiểu thời gian traning vì lượng ảnh cần training quá lớn 4000 đến 6000 ảnh cho một cung đường
Các lần tích chập lần sau thì số lượng filter và kích thước filter được giảm dần, từ ma trận được tích chập bởi các lần tích chập trước.
69 Hàm kích hoạt là relu và dùng solfmax để chuyển đổi ma trận thành các vecto xác suất.
Bảng 3.3. Phân tích số lượng tích chập
Số lần Số lượng ma trận
filter Kích thước filter Kích thước ma trận tổng hợp
1 8 7x7 2x2
2 16 5x5 2x2
3 32 5x5 2x2
4 64 3x3 1x1
5 64 3x3 1x1
Tạo dựng kiến trúc CNN mới: model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(5,5), activation='relu', input_s
hape=X_train.shape[1:]))
model.add(Conv2D(filters=32, kernel_size=(5,5), activation='relu')) model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(rate=0.25))
model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu')) model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu')) model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(rate=0.25)) model.add(Flatten())
model.add(Dense(256, activation='relu')) model.add(Dropout(rate=0.5))
model.add(Dense(43, activation='softmax'))
Điều khác biệt khi tạo dựng kiến trúc mới là sử dụng bộ filter nhỏ hơn so với bộ filter của kiến trúc CNN cũ đồng thời gia tăng số lượng filter lên gấp 4 lần. điều này giúp việc máy học được các đặc tính của ảnh một cách rõ ràng và chi tiết hơn đồng thời giảm số lần dùng ma trận tổng hợp nhằm giảm sự chuyển dịch giá trị đặc tính của ma trận.
70 Để kiểm soát và quan sát quá trình train, thì cách đơn giản và hiệu quả là chèn biểu đồ các giá trị accuracy và loss và thuật toán kiểm soát giá trị bằng biểu đồ được thiết kế như sau:
data = np.array(data) labels = np.array(labels)
print(data.shape, labels.shape)
#Splitting training and testing dataset
71 X_train, X_test, y_train, y_test = train_test_split(data, labels, test_siz e=0.2, random_state=42)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape) #Converting the labels into one hot encoding
y_train = to_categorical(y_train, 43) y_test = to_categorical(y_test, 43)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=[
'accuracy']) epochs = 15
history = model.fit(X_train, y_train, batch_size=32, epochs=epochs, valida
tion_data=(X_test, y_test))
model.save("D:\\kethuc\\filetrain\\my_model.h5") #plotting graphs for accuracy
plt.figure(0)
plt.plot(history.history['accuracy'], label='training accuracy') plt.plot(history.history['val_accuracy'], label='val accuracy') plt.title('Accuracy') plt.xlabel('epochs') plt.ylabel('accuracy') plt.legend() plt.show() plt.figure(1)
plt.plot(history.history['loss'], label='training loss') plt.plot(history.history['val_loss'], label='val loss') plt.title('Loss')
plt.xlabel('epochs') plt.ylabel('loss') plt.legend() plt.show()
Ở biểu đồ cho thấy độ chính xác của thuật toán là 98% giá trị bị mất là 5% một kết quả rất cao so với một số lần thực nghiệm khác chỉ có mức ở 90% tuy nhiên để đảm bảo giá trị này là giá trị thực bằng cách dùng một mô hình test được thiết lập sẵn, thuật toán khá đơn giản để kiểm tra.
#testing accuracy on test dataset
from sklearn.metrics import accuracy_score y_test = pd.read_csv('Test.csv')
labels = y_test["ClassId"].values imgs = y_test["Path"].values data=[]
72
for img in imgs:
image = Image.open(img) image = image.resize((30,30)) data.append(np.array(image)) X_test=np.array(data)
pred = model.predict_classes(X_test) #Accuracy with the test data
from sklearn.metrics import accuracy_score
print(accuracy_score(labels, pred))
Sau khi kiểm tra trên mô hình test thì ta tiến hành sử dụng file train thực nghiệm để kiểm tra độ chính xác và hiệu quả ở môi trường tự nhiên.
73
CHƯƠNG 4: THỰC NGHIỆM VÀ ĐÁNH GIÁ