반응형
Class
void main()
{
  // constructor
  Idol blackPink = const Idol(
    name:'블랙핑크',
    members:['지수', '제니', '리사', '로제']);
  
  blackPink.sayHello();
  blackPink.introduce();
  
  // named constructor
  Idol blackPink2 = Idol.fromList([
    ['지수', '제니', '리사', '로제'],
    '블랙핑크'
    ]);
  
  blackPink2.sayHello();
  blackPink2.introduce();
  
}
 
class Idol
{
  final String name;
  final List<String> members;
  
  // constructor
  const Idol({
    required this.name, 
    required this.members});
  
  // named constructor
  Idol.fromList(List values)
    : this.members = values[0], 
      this.name= values[1];
  
  // function
  void sayHello() {print('안녕하세요. ${this.name}입니다.');}
  
  void introduce() {print('저희 멤버는 ${this.members}가 있습니다.');}
  
  // getter, setter 굳이 사용 X, 기능적 차이 없음
}

클래스는 java와 똑같다.

  • 다만 클래스의 접근자가 private, public만 있다. 굉장히 마음에 든다.
  • private은 변수 앞에 (_)를 붙이면 된다. public은 안붙여도 됨.
  • getter, setter 굳이 사용해도 되지 않을 것 같다.

void main()
{
  Idol apink = Idol(name:'에이핑크', membersCount:5);
  
  apink.sayName();
  apink.sayMembersCount();
  
  print("--------------");
  
  BoyGroup bts = BoyGroup('BTS', 7);
  
  bts.sayMembersCount();
  bts.sayName();
}

class Idol{
  String name;
  int membersCount;
  
  Idol(
    {
      required this.name,
      required this.membersCount
    });
  
  void sayName() { print('저는 ${this.name}입니다.'); }
  
  void sayMembersCount()
  { print('${this.name}은 ${this.membersCount}명의 멤버가 있습니다.');}
}

class BoyGroup extends Idol
{
  BoyGroup(
    String name,
    int membersCount
  ) 
  : super(name:name, 
          membersCount:membersCount);
  
}

상속도 java와 똑같다. override, implement도 똑같으니 굳이 안따라해보고 넘어 간다.

void main()
{
  Idol apink = Idol(name:'에이핑크', membersCount:5);
  
  apink.sayName();
  apink.sayMembersCount();
  
  print("--------------");
  
  BoyGroup bts = BoyGroup('BTS', 7);
  
  bts.sayMembersCount();
  bts.sayName();
}

class Idol{
  String name;
  int membersCount;
  
  Idol(
    {
      required this.name,
      required this.membersCount
    });
  
  void sayName() { print('저는 ${this.name}입니다.'); }
  
  void sayMembersCount()
  { print('${this.name}은 ${this.membersCount}명의 멤버가 있습니다.');}
}

class BoyGroup extends Idol
{
  BoyGroup(
    String name,
    int membersCount
  ) 
  : super(name:name, 
          membersCount:membersCount);
  
}

 

Static

Class 귀속, Instance 귀속.

void main()
{
  Employee seulgi = Employee('슬기');
  Employee chorong = Employee('초롱');
  
  // instance 귀속
  seulgi.printNameAndBuilding();
  chorong.printNameAndBuilding();
  print("--------------------------");
  // class 귀속 : static
  Employee.building = '모르는';
  seulgi.printNameAndBuilding();
  chorong.printNameAndBuilding();
  Employee.printBuilding();
}

class Employee
{
  static String? building;
  final String name; 
  
  Employee(this.name);
  
  void printNameAndBuilding()
  {
    print('제 이름은 $name입니다. $building 건물에서 근무하고 있습니다.');
  }
  
  static void printBuilding()
  {
    print('저는 $building 건물에서 근무 중입니다.'); 
  }
}

 

Generic

외부에서 타입을 받아서 사용할 수 있음.

void main()
{
  Lecture<String> lecture1 = Lecture('123', 'lecture1');
  lecture1.printIdType();
  
  Lecture<int> lecture2 = Lecture(123, 'lecture1');
  lecture2.printIdType();
  
}


class Lecture<T>
{
  final T id;
  final String name;
  
  Lecture(this.id, this.name);
  
  void printIdType() {print(id.runtimeType);}
}
 

 

728x90
반응형

'Flutter > Dart' 카테고리의 다른 글

Dart Study #1 기본 문법  (0) 2022.08.04
Dart Study #3 futures, async, await  (0) 2022.07.23
반응형

네트워크를 통한 데이터를 가져오기, DB 쓰기 및 읽기, 파일 데이터 읽기 및 쓰기 등과 같은 경우 비동기 작업이 필요하다.

Future 란?
Future 클래스의 인스턴스이고, 비동기 작업의 결과를 나타내며 Uncompleted 또는 Completed의 두 가지 상태를 가질 수 있다.

Completed 상태는 작업이 완료된 상태이다. Uncompleted 상태는 작업이 완료되지 못한 상태이며, 완료할 작업은 event queue에 적재한다. 

Future는 보통 async, await와 함께 사용되며, 아래와 같이 사용한다.

  • async 함수를 정의하려면 함수 본문 앞에 async를 추가한다.
  • await 키워드는 비동기 함수에서만 작동한다.

1. Future, async, await
Future<void> printOrderMessage() async {
  print('Awaiting user order...');
  var order = await fetchUserOrder();
  print('Your order is: $order');
}

Future<String> fetchUserOrder() {
  // Imagine that this function is more complex and slow.
  return Future.delayed(const Duration(seconds: 4), () => 'Large Latte');
}

void main() async {
  countSeconds(4);
  await printOrderMessage();
}

void countSeconds(int s) {
  for (var i = 1; i <= s; i++) {
    Future.delayed(Duration(seconds: i), () => print(i));
  }
}
// Awaiting user order...
// 1
// 2
// 3
// 4
// Your order is: Large Latte
2. Error 다루기

비동기 함수에서 오류를 처리하려면 try-catch를 사용한다.

Future<void> printOrderMessage() async {
  try {
    print('Awaiting user order...');
    var order = await fetchUserOrder();
    print(order);
  } catch (err) {
    print('Caught error: $err');
  }
}

Future<String> fetchUserOrder() {
  // Imagine that this function is more complex.
  var str = Future.delayed(
      const Duration(seconds: 4),
      () => throw 'Cannot locate user order');
  return str;
}

void main() async {
  await printOrderMessage();
}
728x90
반응형

'Flutter > Dart' 카테고리의 다른 글

Dart Study #2 클래스, 상속  (0) 2022.08.04
Dart Study #1 기본 문법  (0) 2022.08.04
반응형

안녕하세요. 

 

Deep Learning은 대표적으로 분류 문제가 있으며, CNN의 튜토리얼은 MNIST, CIFAR10 분류로 가장 많이 소개됩니다. 

이진 분류는 Sigmoid를, 그 이상의 다중 분류는 Softmax를 사용하며, Softmax를 사용하기 위해 One-hot encoding을 해야 합니다. 

Sotfmax의 가장 중요한 점은 각 Class 간의 Probabilities(확률)의 합이 '1'입니다. 정답 Class가 1에 가까워지면, 자연스럽게 오답인 Class의 Probabilities는 0에 가까워지게 됩니다. 

One-hot encoding
Softmax

하지만 Pytorch는 One-hot encoding을 하지 않습니다. Pytorch 개발자들이 최대한 사람 친화적으로 개발을 할 수 있게끔 배려를 한 것 같습니다. 

One-hot encoding

그렇다면, Target n is out of bounds. 에러문은 왜 뜨는 것일까요?

 

이유는 간단합니다. 인덱스 오류랑 원리가 같습니다.

 

대게 class가 0부터 시작하지 않고, 1부터 시작해서 

Class가 20개라면, 0~19...

Class가 15개라면, 0~14...

 

만약, Class 5개에서, 1~5라면, 해결방법도 간단합니다. 

 

Data Type이 Numpy나 Tensor라면, y_data = y_data - 1을 해주면 쉽게 해결됩니다.

728x90
반응형

+ Recent posts