반응형

Hugging Face Datasets 라이브러리를 사용해 보자.

 

import datasets

dataset = datasets.load_dataset("jaehy12/news3")
print(dataset)

 

처음 실행하면 데이터셋을 다운로드한다. C:\Users\Sean\.cache\huggingface\hub\datasets--msarmi9--korean-english-multitarget-ted-talks-task

 

import datasets

dataset = datasets.load_dataset("msarmi9/korean-english-multitarget-ted-talks-task")
print(dataset["train"])
print(dataset["train"].features)
print(dataset["train"][0])
print("-"*50)
print(dataset["validation"])
print(dataset["validation"].features)
print(dataset["validation"][0])

 

 

import datasets

# train, valudation, test 데이터셋 직접 만들기
data_dict = {
	"train": [
		{"text": "I love programming.", "label": 1},
		{"text": "Python is my favorite language.", "label": 1},
		{"text": "I hate bugs in my code.", "label": 0},
		{"text": "Debugging is a frustrating process.", "label": 0},
		{"text": "I enjoy solving complex problems.", "label": 1},
		{"text": "I dislike syntax errors.", "label": 0},
		{"text": "I find coding to be a rewarding experience.", "label": 1},
		{"text": "I get frustrated when my code doesn't work.", "label": 0},
		{"text": "I love learning new programming languages.", "label": 1},
		{"text": "I find it challenging to debug my code.", "label": 0}
	],
	"validation": [
		{"text": "I enjoy writing clean and efficient code.", "label": 1},
		{"text": "I find it difficult to understand complex algorithms.", "label": 0},
		{"text": "I love collaborating with other developers.", "label": 1},
		{"text": "I get frustrated when I encounter unexpected errors.", "label": 0},
		{"text": "I enjoy learning new programming paradigms.", "label": 1}
	],
	"test": [
		{"text": "I find it rewarding to solve challenging coding problems.", "label": 1},
		{"text": "I dislike spending hours debugging my code.", "label": 0},
		{"text": "I love exploring new programming frameworks.", "label": 1},
		{"text": "I get frustrated when I can't find a solution to a coding problem.", "label": 0},
		{"text": "I enjoy optimizing my code for better performance.", "label": 1}
	]
}

# 데이터셋을 Hugging Face Datasets 라이브러리의 DatasetDict로 변환
dataset = datasets.DatasetDict({
	"train": datasets.Dataset.from_list(data_dict["train"]),
	"validation": datasets.Dataset.from_list(data_dict["validation"]),
	"test": datasets.Dataset.from_list(data_dict["test"])
})

# 데이터셋 확인
print(dataset)
print(dataset["train"].features)
print(dataset["train"][0])

# 파일로 저장
dataset.save_to_disk("my_dataset")

 

 

프로젝트 폴더\my_dataset

 

import datasets

# train, valudation, test 데이터셋 직접 만들기
data_dict = {
	"text": [
		"I love programming.",
		"Python is my favorite language.",
		"I hate bugs in my code.",
		"Debugging is a frustrating process.",
		"I enjoy solving complex problems.",
		"I dislike syntax errors.",
		"I find coding to be a rewarding experience.",
		"I get frustrated when my code doesn't work.",
		"I love learning new programming languages.",
		"I find it challenging to debug my code.",
		"I enjoy writing clean and efficient code.",
		"I find it difficult to understand complex algorithms.",
		"I love collaborating with other developers.",
		"I get frustrated when I encounter unexpected errors.",
		"I enjoy learning new programming paradigms.",
		"I find it rewarding to solve challenging coding problems.",
		"I dislike spending hours debugging my code.",
		"I love exploring new programming frameworks.",
		"I get frustrated when I can't find a solution to a coding problem.",
		"I enjoy optimizing my code for better performance."
	],
	"label": [1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1]
}

# 데이터를 Hugging Face Datasets 형식으로 변환
dataset = datasets.Dataset.from_dict(data_dict)
# 데이터셋 확인
print(dataset)
print(dataset[0])  # 첫 번째 데이터 확인
print("-"*50)

# 데이터셋을 train, test로 분리
split_dataset = dataset.train_test_split(test_size=0.2)
train_dataset = split_dataset["train"]
test_dataset = split_dataset["test"]

# 데이터셋 확인
print(train_dataset)
print(train_dataset[0])  # 첫 번째 train 데이터 확인
print("-"*50)
print(test_dataset)
print(test_dataset[0])  # 첫 번째 test 데이터 확인

 

 

 

 

 

 

 

※ 참고

Datasets

 

반응형
Posted by J-sean
:
반응형

Keras mnist 데이터세트의 이미지는 보통 matplotlib.pyplot으로 표시한다.

데이터 타입을 확인하고 OpenCV로 표시해 보자.

 

import numpy as np
import matplotlib.pyplot as plt
import cv2
import keras

(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()

print(train_input.shape) # (60000, 28, 28)
print(train_input[0].shape) # (28, 28)
print(type(train_input[0])) # <class 'numpy.ndarray'>

# 첫 번째 이미지 데이터 출력
np.set_printoptions(linewidth=115, threshold=np.inf) # threshold: 출력 생략 임계값. 내용이 많아도 출력이 생략되지 않는다.
print(train_input[0])

# 첫 번째 ~ 열 번째 이미지 출력(pyplot)
fig, axs = plt.subplots(1, 10, figsize=(10, 10))
for i in range(10):
	axs[i].imshow(train_input[i], cmap='gray')
	axs[i].axis('off')
plt.show()

# 첫 번째 이미지 출력(OpenCV)
image = cv2.resize(src=train_input[0], dsize=(0, 0), fx=10, fy=10) # 10배로 확대
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

Gray 스케일 이미지의 데이터가 출력되었다. 데이터 모양만으로도 대략적인 모양을 알 수 있다.

 

matplotlib.pyplot으로 첫 10개의 이미지를 출력했다.

 

28X28 사이즈의 이미지라 너무 작아 10배 확대하고 OpenCV로 출력했다.

Keras에서 사용하는 이미지 데이터 타입도 numpy.ndarray이고, OpenCV에서 사용하는 이미지 데이터 타입도 numpy.ndarray이기 때문에 서로 호환된다.

 

 

LeNet-5 모델을 만들고 OpenCV로 로드한 이미지를 이용해 결과를 예측해 보자.

 

import numpy as np
import cv2
import keras
from keras import layers
from sklearn.model_selection import train_test_split

# LeNet-5 정의
lenet5 = keras.Sequential()
lenet5.add(layers.Input(shape=(28, 28, 1)))
lenet5.add(layers.Conv2D(filters=6, kernel_size=5, activation='sigmoid', padding='same'))
lenet5.add(layers.AveragePooling2D(pool_size=2))
lenet5.add(layers.Conv2D(filters=16, kernel_size=5, activation='sigmoid'))
lenet5.add(layers.AveragePooling2D(pool_size=2))
lenet5.add(layers.Flatten())
lenet5.add(layers.Dense(120, activation='sigmoid'))
lenet5.add(layers.Dense(84, activation='sigmoid'))
lenet5.add(layers.Dense(10, activation='softmax'))
lenet5.summary()

# 훈련 데이터 로드
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()
train_input = train_input.reshape(-1, 28, 28, 1) / 255.0
train_scaled, val_scaled, train_target, val_target = train_test_split(train_input, train_target, test_size=0.2, random_state=42)

# 콜백 함수 정의
checkpoint_cb = keras.callbacks.ModelCheckpoint('lenet5-model.keras', save_best_only=True)
early_stopping_cb = keras.callbacks.EarlyStopping(patience=2, restore_best_weights=True)

# LeNet-5 훈련
lenet5.compile(loss='sparse_categorical_crossentropy', metrics=['accuracy'])
hist = lenet5.fit(train_scaled, train_target, epochs=20, validation_data=(val_scaled, val_target), callbacks=[checkpoint_cb, early_stopping_cb])

# 예측 이미지 준비
image = cv2.imread('shoes.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = cv2.resize(image, (28, 28))
image = cv2.bitwise_not(image) # 이미지 반전

# Fashion MNIST 클래스 정의
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

# 예측
prediction = lenet5.predict(image.reshape(-1, 28, 28, 1) / 255.0)
print(prediction)

# 출력
max_index = np.argmax(prediction)
print('Max index: ', max_index, ', Probability: ', prediction[0][max_index] * 100)
print('Name: ', class_names[max_index])

 

shoes.jpg
0.26MB
tshirt.jpg
0.56MB

 

약 94%의 확률로 신발을 정확히 예측했다.

 

아래는 shoes.jpg, tshirt.jpg 그레이스케일 이미지를 (28X28) 사이즈로 변환 전 반전한 이미지다. 

 

 

 

 

이번엔 훈련 없이 위에서 저장한 가중치(lenet5-model.keras)를 로드하고 예측해 보자.

 

import numpy as np
import cv2
import keras
from keras import layers
from sklearn.model_selection import train_test_split

# Lenet5 정의 (로드할 가중치와 동일한 모델을 만들어야 한다)
lenet5 = keras.Sequential()
lenet5.add(layers.Input(shape=(28, 28, 1)))
lenet5.add(layers.Conv2D(filters=6, kernel_size=5, activation='sigmoid', padding='same'))
lenet5.add(layers.AveragePooling2D(pool_size=2))
lenet5.add(layers.Conv2D(filters=16, kernel_size=5, activation='sigmoid'))
lenet5.add(layers.AveragePooling2D(pool_size=2))
lenet5.add(layers.Flatten())
lenet5.add(layers.Dense(120, activation='sigmoid'))
lenet5.add(layers.Dense(84, activation='sigmoid'))
lenet5.add(layers.Dense(10, activation='softmax'))
#lenet5.summary()

# 저장한 가중치 로드
lenet5.load_weights('lenet5-model.keras')

# 예측 이미지 준비
image = cv2.imread('tshirt.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = cv2.resize(image, (28, 28))
image = cv2.bitwise_not(image) # 이미지 반전

# Fashion MNIST 클래스 정의
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

# 예측
prediction = lenet5.predict(image.reshape(-1, 28, 28, 1) / 255.0)
print(prediction)

# 출력
max_index = np.argmax(prediction)
print('Max index: ', max_index, ', Probability: ', prediction[0][max_index] * 100)
print('Name: ', class_names[max_index])

 

약 53%의 확률로 셔츠를 예측했다. 0번 인덱스의 T-shirt/top은 약 44%의 확률을 갖는다.

 

반응형
Posted by J-sean
:
반응형

DataGridView에 출력한 내용을 수정하고 XML로 저장해 보자.

 

WinForm에 DataGridView, Button을 적당히 배치한다.

 

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        DataTable dataTable;
        string selectedCellString;
 
        public Form1()
        {
            InitializeComponent();
 
            try
            {
                dataTable = new DataTable("game");
                dataTable.ReadXmlSchema("gamelist.xml");
                dataTable.ReadXml("gamelist.xml");
                dataGridView1.DataSource = dataTable;
 
                // 데이터 테이블 내용 변경 후 콜백함수 지정.
                dataTable.RowChanged += DataTable_RowChanged;
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
            }
        }
 
        private void DataTable_RowChanged(object sender, DataRowChangeEventArgs e)
        {
            // 변경된 내용 표시
            MessageBox.Show(selectedCellString + " => " +
                e.Row[dataGridView1.SelectedCells[0].ColumnIndex].ToString(), "변경");
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            // 저장
            dataTable.WriteXml("gamelist.xml");
        }
 
        private void dataGridView1_SelectionChanged(object sender, EventArgs e)
        {
            // 프로그램 시작 시 인덱스 에러 방지
            if (dataGridView1.SelectedCells.Count < 1)
                return;
 
            selectedCellString = dataGridView1.SelectedCells[0].Value.ToString();
        }
    }
}
 

 

소스를 입력하고 빌드한다.

 

실행하면 'gamelist.xml' 의 내용이 표시된다.

 

원하는 셀을 수정하고 저장 버튼을 클릭한다.

 

 

원본 'gamelist.xml'

 

수정된 'gamelist.xml'

DataGridView에서 수정한 내용과 함께 <gameList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 태그도 <DocumentElement>로 변경되었다.

 

반응형
Posted by J-sean
:
반응형

DataTable 이나 DataSet 클래스를 이용해 XML 파일을 생성하고 읽어올 수 있다. 이 두 클래스로 생성한 XML 파일이 아닌 임의의 XML 파일을 읽어서 DataGridView에 표시해 보자.

 

WinForm에 DataGridView를 적당히 배치한다.

 

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            try
            {
                DataTable dataTable = new DataTable("game");
                dataTable.ReadXmlSchema("gamelist.xml");
                // 'gamelist.xml'은 인터넷에서 주워온 파일이다.
                // DataTable.WriteXml()에 XmlWriteMode.WriteSchema
                // 옵션을 줘서 만든 XML 파일이 아니면 DataTable 클래스
                // 생성시 테이블 이름("game")을 정확히 지정해 주고
                // Schema를 읽어와야 한다.                
                dataTable.ReadXml("gamelist.xml");
                dataGridView1.DataSource = dataTable;
 
                /* DataSet 클래스 사용 예. 더 간단하다.
                DataSet dataSet = new DataSet();
                dataSet.ReadXml("gamelist.xml");
                dataGridView1.DataSource = dataSet.Tables["game"];
                //dataGridView1.DataSource = dataSet.Tables[0];
                */
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
            }
        }
    }
}
 

 

소스를 입력하고 빌드한다.

 

'gamelist.xml' 파일의 구성

 

gamelist.xml
5.73MB

 

실행하면 gamelist.xml의 내용이 표시된다.

 

반응형
Posted by J-sean
: