• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    해결됨

Mnist 에 keras를 통해 softmax를 활용한 regerssion error 발생

24.04.14 21:48 작성 조회수 78

0

안녕하세요.

 

windows 환경에서 코드를 실행시키고 있는데 error가 발생해서 문의 드립니다.

 

코드는 제가 전혀 손대지 않아서 강사님이 공유해 주신 그대로의 코드 입니다.

 

[mnist_classification_using_softmax_regression_v2_keras.py 코드]

# -*- coding: utf-8 -*-

import tensorflow as tf

# MNIST 데이터를 다운로드 합니다.
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
# 이미지들을 float32 데이터 타입으로 변경합니다.
x_train, x_test = x_train.astype('float32'), x_test.astype('float32')
# 28*28 형태의 이미지를 784차원으로 flattening 합니다.
x_train, x_test = x_train.reshape([-1, 784]), x_test.reshape([-1, 784])
# [0, 255] 사이의 값을 [0, 1]사이의 값으로 Normalize합니다.
x_train, x_test = x_train / 255., x_test / 255.
# 레이블 데이터에 one-hot encoding을 적용합니다.
y_train, y_test = tf.one_hot(y_train, depth=10), tf.one_hot(y_test, depth=10)

# tf.data API를 이용해서 데이터를 섞고 batch 형태로 가져옵니다.
train_data = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_data = train_data.repeat().shuffle(60000).batch(100)
train_data_iter = iter(train_data)

# tf.keras.Model을 이용해서 Softmax Regression 모델을 정의합니다.
class SoftmaxRegression(tf.keras.Model):
  def __init__(self):
    super(SoftmaxRegression, self).__init__()
    self.softmax_layer = tf.keras.layers.Dense(10,
                                               activation=None,
                                               kernel_initializer='zeros',
                                               bias_initializer='zeros')

  def call(self, x):
    logits = self.softmax_layer(x)

    return tf.nn.softmax(logits)

# cross-entropy 손실 함수를 정의합니다.
@tf.function
def cross_entropy_loss(y_pred, y):
  return tf.reduce_mean(-tf.reduce_sum(y * tf.math.log(y_pred), axis=[1]))
  #return tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logtis, labels=y)) # tf.nn.softmax_cross_entropy_with_logits API를 이용한 구현

# 최적화를 위한 그라디언트 디센트 옵티마이저를 정의합니다.
optimizer = tf.optimizers.SGD(0.5)

# 최적화를 위한 function을 정의합니다.
@tf.function
def train_step(model, x, y):
  with tf.GradientTape() as tape:
    y_pred = model(x)
    loss = cross_entropy_loss(y_pred, y)
  gradients = tape.gradient(loss, model.trainable_variables)
  optimizer.apply_gradients(zip(gradients, model.trainable_variables))

# 모델의 정확도를 출력하는 함수를 정의합니다.
@tf.function
def compute_accuracy(y_pred, y):
  correct_prediction = tf.equal(tf.argmax(y_pred,1), tf.argmax(y,1))
  accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

  return accuracy

# SoftmaxRegression 모델을 선언합니다.
SoftmaxRegression_model = SoftmaxRegression()

# 1000번 반복을 수행하면서 최적화를 수행합니다.
for i in range(1000):
  batch_xs, batch_ys = next(train_data_iter)
  train_step(SoftmaxRegression_model, batch_xs, batch_ys)

# 학습이 끝나면 학습된 모델의 정확도를 출력합니다.
print("정확도(Accuracy): %f" % compute_accuracy(SoftmaxRegression_model(x_test), y_test)) # 정확도 : 약 91%

 

그리고 해당 코드가 있는 곳에 python으로 실행을 시키면 아래와 같은 결과가 나옵니다.

질문이미지-1(keras).png...(중략)...

질문이미지-2(keras).png

--> TypeError: unhashable type: 'list' 라는 에러가 발생하고 있습니다.

--> 여러 사이트 검색과 코드 변경으로 문제 해결을 시도 하였으나 해결이 되지 않아서 어떻게 해결해야 하는지 가르쳐 주시면 감사하겠습니다.

 

[에러 화면 전체 이미지]

20240414_214353.png

답변 2

·

답변을 작성해보세요.

1

안녕하세요~. 반갑습니다.

 

해당 에러 내용을 확인해보면

import tensorflow as tf 부분에서 tensorflow 라이브러리를 import 하는 과정에서 에러가 발생한 것으로 확인됩니다.

 

즉, 로컬 환경에 tensorlfow 라이브러리가 제대로 설치되지 않은 상황으로 판단됩니다.

 

아래 colab 링크를 이용해서 colab 환경에서 실습을 진행해보시기 바랍니다.

https://colab.research.google.com/drive/1ekrOwpXy2y5sY0L1A_AoZo9Az0ZD8epV?usp=sharing

 

아니면 로컬 환경에서 설치된 python 버전과 tensorflow 버전이 호환되는 버전인지 확인해보시기 바랍니다.

python 버전별 호환되는 tensorflow 버전은 아래 문서를 참조하세요.

https://www.tensorflow.org/install/source_windows?hl=ko#cpu

 

좋은 하루되세요.

감사합니다.

고광우님의 프로필

고광우

질문자

2024.04.17

정말 감사합니다. 강사님
질문 올린지 하루만에 답변을 주셨으며, 다행이 문제 상황이 잘 해결 되었습니다.

 

제가 교대 근무를 하는 상황이라서 답변 내용 바로 확인이 어려웠습니다.

 

[colab 환경을 통한 코드 실행]

image--> 정확도도 잘 보여 줍니다.

다만, 제 local 환경은 python 버전은 3.9.1 이며, tensorflow도 2.16.1 버전으로 이미 잘 설치 된것으로 확인 되는데

[local환경 python 버전]

image

[local환경 tensorflow버전]

image--> tensorflow 2.16.1을 설치하려고 하면 Requirement already satisfied 임을 알 수 있습니다.

 

그러나 tensorflow를 실행시키면 여전이 동일한 list 에러가 발생합니다.

 

일단은 colab 환경에서 tensorflow를 실행할 수 있도록 노력해 보겠습니다.

 

빠르고 정확한 답변 감사드립니다.

저는 앞으로 AIschool님의 다양한 강의 구매와 좋은 수강평으로 보답하겠습니다.

 

안녕하세요~. 반갑습니다.

colab 환경에서 잘 해결되셨다니 다행이네요^^.

 

로컬환경에서의 에러 같은 경우 번거로우시겠지만 최신 tensorflow가 아닌 버전들로 downgrade해서 다시 설치해서 테스트해보시면 좋을 것 같습니다. (예를 들어, 2.5.0 버전)

아래 페이지에서 비슷한 에러에 대해서 tensorflow를 2.15.0 버전에서 2.5.0 버전으로 downgrade 한뒤에 해결됬다는 내용이 있는 것 같습니다.

https://github.com/tensorflow/models/issues/11161

 

좋은 하루되세요.

감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.04.14

안녕하세요, 인프런 AI 인턴입니다. 고광우님의 질문과 관련하여 몇 가지 유사한 문제 해결 링크들을 소개해 드리겠습니다.

고광우님의 경우 TypeError: unhashable type: 'list'라는 에러를 겪고 계심을 확인했습니다. 이는 종종 데이터를 처리하거나 모델을 구성하는 과정에서 리스트나 변경이 가능한 데이터 타입을 키로 사용하려 할 때 발생할 수 있습니다. TensorFlow와 Keras를 활용한 딥러닝 모델에서 이러한 타입 에러가 발생하는 경우는 드물지만, 특정 함수 호출이나 데이터 전처리 과정에서 예상치 못하게 발생할 수 있습니다.

관련하여 제가 찾아낸 링크는 다음과 같습니다:

  1. “TensorFlow로 구현된 코드 관련 문의 사항입니다.”에서 dhleegarret님도 TensorFlow를 사용하면서 비슷한 문제에 대해 질문을 하셨습니다. 이 경우, 질문은 tf.keras.Model과 output layer의 처리 등에 관련된 내용이었지만, 지식공유자께서는 TensorFlow 모델 구성과 관련된 일반적인 지침 및 디버깅 팁을 제공했습니다.

  2. “ANN으로 Mnist 숫자분류기 코드질문”에서는 subclassing과 관련된 오류를 겪고 있었습니다. 이 케이스는 또한 모델 정의 과정에서 일반적인 실수를 지적하며 해결 방법을 제안합니다.

  3. “tf.nn.softmax_cross_entropy_with_logits 질문..”에서는 cross_entropy 계산 과정 중에 발생하는 문제에 대해 논의합니다. 이는 손실 함수와 그 구현에 초점을 맞춥니다.

해당 링크들은 직접적으로 TypeError: unhashable type: 'list' 오류를 해결하는 데 필요한 정보를 제공하지는 않습니다. 에러 메시지를 바탕으로 추정컨대, 배치 처리나 데이터 로딩 과정에서 리스트가 기대치 않게 사용되었을 가능성이 있습니다. 고광우님의 문제는 데이터 전처리 단계나 모델의 입력 처리 방식과 관련 있을 수 있으므로, 입력 데이터 형태나 모델 call 함수 내의 데이터 처리 과정을 재검토 해보시는 것이 좋을 것 같습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.