변수 : 변경이 가능한 수
상수 : 값을 바꾸지 못하는 수
텐서의 타입이 다르면 연산이 안된다.
astypes을 사용해서 타입을 맞쳐주고 연산하기
단어 하나당 1차원
문장 2차원
문장들이 모인 데이터셋 3차원
흑백이미지 2차원
컬러이미지 3차원
그러면 데이터셋은 여기서 +1차원
데이터 자체가 4차원 5차원 일 수도 있다
Rank는 텐서의 차원 수를 나타낸다
0부터 시작
Rank는 텐서의 중첩된 깊이를 나타내며
각 차원마다 하나의 축(axis)이 있다
Shape는 텐서의 각 차원의 크기를 나타낸다
각 차원마다 포함된 요소의 수를 나열한 튜플 형태로 표현
ex) 2D 행렬의 Shape는 (행 수, 열 수)로 표현
상수는 값을 한 번 할당하면 그 값을 변경할 수 없는 데이터
프로그램에서 변하지 않아야 하는 값들을 나타내는 데 사용
변수는 값을 할당하고 나중에 그 값을 변경할 수 있는 데이터
프로그램에서 데이터를 저장하고 조작하는 데 사용
print(tf.add(a, b)) # +
print(tf.subtract(a, b)) # -
print(tf.divide(a, b)) # /
print(tf.multiply(a, b)) # * --> 내적X, element-wise product
텐서의 차원을 축소하고 요약하는 연산
주어진 축(axis)을 텐서의 값을 합치거나
평균내는 등의 연산을 수행
대표적인 reduce 연산
import tensorflow as tf
# 2D 텐서
matrix = tf.constant([[1, 2, 3], [4, 5, 6]])
# 열(axis=1)을 따라 합산
sum_result = tf.reduce_sum(matrix, axis=1) # 결과: [6, 15]
import tensorflow as tf
# 균일 분포로부터 무작위 텐서 생성
random_tensor =
tf.random.uniform(shape=(3, 3), minval=0, maxval=1)
# 0에서 1 사이의 난수 텐서 생성
# 데이터 무작위 섞기
data = tf.constant([1, 2, 3, 4, 5])
shuffled_data = tf.random.shuffle(data) # 데이터를 무작위로 섞음
옵티마이저를 사용해서 최적의 weight값을 찾음
지도학습 비지도학습은 opt.minimize를 사용하지만
강화학습은 opt.maximize를 사용한다
지도,비지도학습은 감점제이고
강화학습은 +를 해주고 끝이 없다
seq 함수를 사용 <-- 제일 쉬운 방법
함수 API <-- 약간 더 복잡한
class 객체를 만들기 <-- 일반적으로 모델을 만드는 방법
장점 : 단순하게 층을 쌓는 방식으로 쉽고 사용하기가 간단하다
단점 : 복잡한 모델에는 사용하기 어렵다
장점
Sequential 로는 구현하기 어려운 복잡한 모델들을 구현 가능하다
단점 : 어렵다.. 연습 필요...
입력의 크기(shape)를 명시한 입력층(Input layer)을
모델의 앞단에 정의해주어야 한다
장점 : 아주 복잡한 모델들 조차 구현이 가능하다
단점 : 객체 지향 프로그래밍(Object-oriented programming)에
익숙해야 하므로 코드 사용이 가장 까다롭다
optimizer = 'adam'
loss = 'binary_crossentropy' ( 이진 분류 )
metrics = 'acc'
# 방법 1
model.compile(
optimizer = 'adam',
loss = 'sparse_categorical_crossentropy',
metrics = 'acc'
)
# 방법 2
model.compile(optimizer=Adam(learning_rate=0.001),
loss='binary_crossentropy', metrics=['accuracy'])