묻고 답해요
129만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
S3에 업로드까지는 성공했는데 사진이 나오지 않습니다.
작성한 코드https://github.com/Parkdev/myfirstnest 업로드 완료 후 결과 링크https://devpark-awsnestcat.s3.ap-southeast-2.amazonaws.com/cat/1713862948347_1.jpeg 업로드 완료까지는 성공하였으나, 업로드 한 사진이 파일이 깨져서 올라가고 있습니다. 어디가 잘못되었는지 잘모르겠네요. 도와주세요.
-
미해결파이썬을 활용한 머신러닝 딥러닝 입문
Feature Scaling
feature scaling에서 X_test는 fit_transform이 아니라 transform만 해야한다고 하셨는데요! (logistic regression 실습 18분 부근) 어차피 X_train과 평균과 표준편차가 동일할 거라는 건 이해가 되지만, 미래 값인 X_test의 평균/표준편차를 구할 순 없다는 말씀은 이해가 잘 되지 않습니다 ㅠㅠ, 그리고 어차피 동일하다면 X_test에 fit_transform을 해도 같은 결과가 나와야 하는 거 아닌가요? 늘 감사합니다!
-
미해결따라하며 배우는 리액트 테스트 [2023.11 업데이트]
ERROR
App.js파일을 refresh 하면 이렇게 error가 뜨네요 ㅜㅜ 해결책을 아무리 찾아봐도 나오질 않습니다 . .
-
해결됨프로젝트로 배우는 Python 챗봇 만들기 - LangChain, Gradio 활용
10강 패키지 설치 시 에러가 나네요.
(오늘은 뭔가 할때마다 오류가 나네요. ㅡㅡ;;)pdf-bot 프로젝트 만들고 패키지를 설치하려고 하니 오류가 나네요... Could not find a matching version of package lanchain뭐를 확인해 보면 될까요?강의에서 하라는대로 하긴 했는데..
-
미해결[2024] [DevOps] 빠르고 안전한 어플리케이션 배포 파이프라인(CI/CD) 만들기
강의 교안
강의 교안은 없는 건가요? 못잧겠어요. 어느경로에 있나요 ?
-
미해결외워서 끝내는 네트워크 핵심이론 - 기초
게이트웨이와 라우터
게이트웨이 가 L2 -> L3 라우터 link up 해주는 라우터로 이해를 했는데 다른건가요?서브넷 마스크 할당이 최대 254개라 하셨는데, 게이트웨이 하나당 연결되는 컴퓨터는 L2 엑세스 스위치, L2 분배 스위치 포함해서 254개를 하위로 할당되는건가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
매핑이 잘 안되는거 같아요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.영학님이 주신 걸로 하면 버전이 안맞아서 커뮤니티 글에 있는 17버전을 새로 만들어서 영학님이 주신 form에 내용을 main하고 resources를 바꿔서 실행 하는데 서버도 열리고 잘 되는데 이상하게 이런 현상이 떠서 질문을 드립니다이렇게 뜨고 상품관리 를 누루면이렇게 뜨는데 위에 basic을 form으로 바꾸면 잘 뜨고 다른 기능도 잘 됩니다.그런데 할때 마다 계속 바꿔야 하니 문제를 찾아 보고 있는데 resources에 index.html도 확인 했는데 basic이 쓰인 곳도 없고 FormController 부분에도 basic을 반환 하는 부분도 없는데 프로그램 코드안 에서도 basic을 반환 하는 부분이 어디에도 없는데 뭐 때문에 그런지 잘 모르겠습니다. 재가 미숙해서 잘 못 찾는것도 있지만.. 배운다는 생각으로 충고 주시면 잘 배우겠습니다
-
해결됨Flutter로 SNS 앱 만들기
섹션 7에서 게시글 이미지 슬라이드 기능 추가를 보고있어요
섹션 7에서 게시글 이미지 슬라이드 기능 추가를 보고있어요이미지 말고 동영상을 넣고 싶은데 그거는 어떻게 하면 됩니다.
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
11. 임시반장 정하기
59 8 7 6 55 6 7 8 91 2 3 7 84 5 3 4 26 2 8 4 2 이예제의 답이 왜 3번학생인가요 4번학생이이 제일 많이 겹치는거 아닌가요?
-
미해결외워서 끝내는 네트워크 핵심이론 - 기초
DHCP 주소와 서브넷마스크
제가 컴퓨터를 켰을때 NIC 카드가 물린 LAN 영역에 브로드 캐스트로 DHCP 서버를 찾으면 (공유기), 공유기에서 제 IP 주소, 서브넷 마스크주소, 게이트웨이주소, DNS 주소를 할당해준다. 이 개념이 맞을까요? 여러 궁금한 점이 있는데요서브넷 마스크의 역할은 1111~ 로 and 연산을해서 내 네트워크가 맞는지 체크를 하는 역할이라 했는데, 서브넷 마스크 주소는 항상 255.255.255.0 이 되는거 아닌가요? 왜 할당을 해주는건가요?게이트 웨이 주소는 해당 DHCP 서버가 연결된 L3 라우터 주소를 말하는게 맞나요?DNS 주소는 DHCP 가 전달해준 IP 주소의 도메인 네임 서버인가요? 아니면 DNS 쿼리를 날려주는 루트 DNS (13개있는?) 주소인가요?
-
해결됨김영한의 실전 자바 - 중급 1편
객체의 참조값 직접 출력
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]toString()이 오버라이딩 된 경우 객체의 참조값을 출력할 수 없기 때문에 System.identityHashCode()와 Integer.toHexString()를 사용하여 출력할 수 있다고 하셨는데요,System.identityHashCode()을 통해 정수로 출력한 참조값을 Integer.toHexString() 16진수 문자열로 굳이 변환하는 이유가 단순히 가독성을 올리기 위한 작업이라고 보면 될까요?
-
미해결[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
nodemon refresh
터미널에 yarn start:dev 를 입력하면 에러가 나와고 있어요. 어떻게 해결할까요? node:internal/modules/cjs/loader:1147 throw err; ^Error: Cannot find module '/Users/navruzbekabdullajonov/Desktop/codecamp-backend-mento/class/section03/index.js' at Module._resolveFilename (node:internal/modules/cjs/loader:1144:15) at Module._load (node:internal/modules/cjs/loader:985:27) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:135:12) at node:internal/main/run_main_module:28:49 { code: 'MODULE_NOT_FOUND', requireStack: []}Node.js v20.11.1[nodemon] app crashed - waiting for file changes before starting...^[[A
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
포인터 관련
인터넷을 찾았을 때 굉장히 헷갈리는 부분이 있는데예시로 int* a = &b;에서포인터 a는 b의 주소를 가리킨다라는 설명도 있고포인터 a는 b를 가리킨다라는 설명도 있는데둘 중에 어떤 것이 맞는 설명인가요?
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
화면에 googleMap띄우기에서요 에러나네요
Error: The plugin "google_maps_flutter_ios" requires a higher minimum iOS deployment version than your application is targeting. To build, increase your application's deployment target to at least 14.0 as described at https://docs.flutter.dev/deployment/ios Error running pod install Error launching application on iPhone 15 Pro. \IOS에뮬 띄우는데 위와같은 에러나와요.. 구글링해봐도 뭔가 xcode에서 셋팅을하라하는거같은데 엑스코드가 익숙치않아서 힘드네요 혹시 방법이 있을까요?
-
미해결초보를 위한 쿠버네티스 안내서
kubectl apply 적용 시 status "imagepullbackoff, errimagepull" 상태
안녕하세요 kubectl apply -f wordpress-k8s.yml 적용시 이미지들이 제대로 불러와지지 않습니다.확인 부탁드립니다 감사합니다 (__ ) kubectl get all 사진과 아래 kubectl describe pod 명령어 출력 내용 전달 드립니다. Name: wordpress-746bd6d54b-glpjqNamespace: defaultPriority: 0Service Account: defaultNode: minikube/172.22.59.104Start Time: Tue, 23 Apr 2024 15:41:01 +0900Labels: app=wordpress pod-template-hash=746bd6d54b tier=frontendAnnotations: <none>Status: PendingIP: 10.244.0.10IPs: IP: 10.244.0.10Controlled By: ReplicaSet/wordpress-746bd6d54bContainers: wordpress: Container ID: Image: wordpress:5.9.1-php8.1-apache Image ID: Port: 80/TCP Host Port: 0/TCP State: Waiting Reason: ImagePullBackOff Ready: False Restart Count: 0 Environment: WORDPRESS_DB_HOST: wordpress-mysql WORDPRESS_DB_NAME: wordpress WORDPRESS_DB_USER: root WORDPRESS_DB_PASSWORD: password Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-v6cfh (ro)Conditions: Type Status Initialized True Ready False ContainersReady False PodScheduled True Volumes: kube-api-access-v6cfh: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: <nil> DownwardAPI: trueQoS Class: BestEffortNode-Selectors: <none>Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300sEvents: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 7m50s default-scheduler Successfully assigned default/wordpress-746bd6d54b-glpjq to minikube Warning Failed 7m9s kubelet Failed to pull image "wordpress:5.9.1-php8.1-apache": Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 172.22.48.1:53: read udp 172.22.59.104:33889->172.22.48.1:53: i/o timeout Warning Failed 6m29s kubelet Failed to pull image "wordpress:5.9.1-php8.1-apache": Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 172.22.48.1:53: read udp 172.22.59.104:46061->172.22.48.1:53: i/o timeout Warning Failed 5m46s kubelet Failed to pull image "wordpress:5.9.1-php8.1-apache": Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 172.22.48.1:53: read udp 172.22.59.104:39787->172.22.48.1:53: i/o timeout Normal Pulling 4m58s (x4 over 7m49s) kubelet Pulling image "wordpress:5.9.1-php8.1-apache" Warning Failed 4m35s (x4 over 7m9s) kubelet Error: ErrImagePull Warning Failed 4m35s kubelet Failed to pull image "wordpress:5.9.1-php8.1-apache": Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 172.22.48.1:53: read udp 172.22.59.104:39383->172.22.48.1:53: i/o timeout Warning Failed 4m23s (x6 over 7m9s) kubelet Error: ImagePullBackOff Normal BackOff 4m9s (x7 over 7m9s) kubelet Back-off pulling image "wordpress:5.9.1-php8.1-apache" Warning Failed 2m40s kubelet Failed to pull image "wordpress:5.9.1-php8.1-apache": Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 172.22.48.1:53: read udp 172.22.59.104:45684->172.22.48.1:53: i/o timeoutName: wordpress-mysql-78488dd7d5-t9mz5Namespace: defaultPriority: 0Service Account: defaultNode: minikube/172.22.59.104Start Time: Tue, 23 Apr 2024 15:41:01 +0900Labels: app=wordpress pod-template-hash=78488dd7d5 tier=mysqlAnnotations: <none>Status: PendingIP: 10.244.0.9IPs: IP: 10.244.0.9Controlled By: ReplicaSet/wordpress-mysql-78488dd7d5Containers: mysql: Container ID: Image: mariadb:10.7 Image ID: Port: 3306/TCP Host Port: 0/TCP State: Waiting Reason: ImagePullBackOff Ready: False Restart Count: 0 Environment: MYSQL_DATABASE: wordpress MYSQL_ROOT_PASSWORD: password Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-7hxcx (ro)Conditions: Type Status Initialized True Ready False ContainersReady False PodScheduled True Volumes: kube-api-access-7hxcx: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: <nil> DownwardAPI: trueQoS Class: BestEffortNode-Selectors: <none>Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300sEvents: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 7m50s default-scheduler Successfully assigned default/wordpress-mysql-78488dd7d5-t9mz5 to minikube Warning Failed 7m29s kubelet Failed to pull image "mariadb:10.7": Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 172.22.48.1:53: read udp 172.22.59.104:50523->172.22.48.1:53: i/o timeout Warning Failed 6m49s kubelet Failed to pull image "mariadb:10.7": Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 172.22.48.1:53: read udp 172.22.59.104:42046->172.22.48.1:53: i/o timeout Warning Failed 6m7s kubelet Failed to pull image "mariadb:10.7": Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 172.22.48.1:53: read udp 172.22.59.104:51638->172.22.48.1:53: i/o timeout Normal Pulling 5m15s (x4 over 7m49s) kubelet Pulling image "mariadb:10.7" Warning Failed 4m55s (x4 over 7m29s) kubelet Error: ErrImagePull Warning Failed 4m55s kubelet Failed to pull image "mariadb:10.7": Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 172.22.48.1:53: read udp 172.22.59.104:42815->172.22.48.1:53: i/o timeout Warning Failed 4m40s (x6 over 7m29s) kubelet Error: ImagePullBackOff Normal BackOff 2m47s (x12 over 7m29s) kubelet Back-off pulling image "mariadb:10.7"
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
같은 강의가 들어있는 것 같아요!
onSaved()와 validate() 강의가 같은데, 후자의 강의를 업로드 해주시면 될 것 같아요! 감사합니다.
-
미해결빅데이터 파이프라인 마스터; 성공을 위한 도구와 기술
jar input output_notice 문의
강사님.. 스스로 문제 해결해가며 여기까지 왔는데.. 여기는 해결이 안되 문의 드립니다..ㅠ 6:24초 영상 처럼 output_notice 디렉토리에 [실습2]에서 했던 input 파일을 맵 리듀스가 되어야 하는데 저 화면에서 30분동안 멈춰 있다 겨우 동작 됐는데 정상 동작 되지 않은거 같습니다 bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar wordcount input output_notice bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar wordcount input output_notice 24/04/23 14:31:51 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032 24/04/23 14:31:52 INFO input.FileInputFormat: Total input paths to process : 1 24/04/23 14:31:52 INFO mapreduce.JobSubmitter: number of splits:1 24/04/23 14:31:52 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1713835952413_0002 24/04/23 14:31:52 INFO impl.YarnClientImpl: Submitted application application_1713835952413_0002 24/04/23 14:31:52 INFO mapreduce.Job: The url to track the job: http://ubuntu-virtual-machine:8088/proxy/application_1713835952413_0002/ 24/04/23 14:31:52 INFO mapreduce.Job: Running job: job_1713835952413_0002 24/04/23 14:31:57 INFO mapreduce.Job: Job job_1713835952413_0002 running in uber mode : false 24/04/23 14:31:57 INFO mapreduce.Job: map 0% reduce 0% 24/04/23 14:32:01 INFO mapreduce.Job: map 100% reduce 0%bin/hadoop fs -ls output_notice Found 1 items drwxr-xr-x - ubuntu supergroup 0 2024-04-23 14:31 output_notice/_temporary etc/hadoop/yarn-site.xml <configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> </configuration> etc/hadoop/mapred-site.xml <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
RequestMapping 이후 GetMapping
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]이렇게 RequestMapping으로 /template으로 시작하는 url을 mapping하고, /fragment로 오는 get을 template()에서 처리합니다. 그런데 이런 컨트롤러 클래스 내부의 메소드를 public으로 하는 이유가 있을까요? 예외없이 private으로 해야하는 것 아닌가요? 다른곳에서 TemplateController 인스턴스를 만들어서 template() 함수를 쓰려고 해도, templateController가 @Controller니까 의미 없지 않나요? 즉,spring 차원에서 public을 막고 private으로만 메소드를 만들게 할 수 도 있는데, 그렇게 않한 이유가 알고 싶습니다.
-
해결됨프로젝트로 배우는 Python 챗봇 만들기 - LangChain, Gradio 활용
10강에서 poetry 프로젝트 생성시 오류가 납니다.
어제는 정상적으로 프로젝트 만들고 강의하면서 따라 했는데 오늘은 파워쉘에서 만들려고 하니 아래와 같은 오류가 납니다. 왜 그럴까요? ㅡㅡ;poetry를 뭔가 실행해야 되나요?
-
미해결딥러닝을 활용한 자연어 처리 (NLP) 과정 (기초부터 ChatGPT/생성 모델까지)
Transformer 번역기 부분에 대해 질문 있습니다.
아래 사이트는 Encoder / Decoder를 하나의 Class로 만들었는데요..강사님도 해당 예제는 많이 보셨을거 같습니다.https://keras.io/examples/nlp/neural_machine_translation_with_transformer/ 아래와 같이 Encoder / Decoder Class를 선언하고..추가로 shape들을 찍어 보았습니다.(참고로 get_config 함수는 지면상 뺐습니다.)class TransformerEncoder(keras.layers.Layer): def init(self, num_heads, embed_dim, dense_dim, **kwargs): super().__init__(**kwargs) self.num_heads = num_heads self.embed_dim = embed_dim self.dense_dim = dense_dim self.class_name = 'TransformerEncoder' self.attention = keras.layers.MultiHeadAttention(self.num_heads, key_dim=self.embed_dim, value_dim=self.embed_dim) self.dense = keras.models.Sequential([keras.layers.Dense(self.dense_dim, activation='relu'), keras.layers.Dense(self.embed_dim)]) self.layer1 = keras.layers.LayerNormalization() self.layer2 = keras.layers.LayerNormalization() self.support_mask = True def call(self, inputs, mask=None): tf.print('ClassName=TransformerEncoder-------------------------------------------------------') if mask is not None: #print('ClassName={}, mask.shape={}'.format(self.class_name, mask.shape)) padding_mask = mask[:, tf.newaxis, :] tf.print('mask.shape=', padding_mask.shape) else: padding_mask = None tf.print('mask=None') attention_out = self.attention(query=inputs, key=inputs, value=inputs, attention_mask=padding_mask) tf.print('input.shape=', inputs.shape) tf.print('attention_out.shape=', attention_out.shape) layer1_out = self.layer1(inputs+attention_out) #print('ClassName={}, layer1_out.shape={}'.format(self.class_name, layer1_out.shape)) dense_out = self.dense(layer1_out) tf.print('dense_out.shape=', dense_out.shape) return self.layer2(layer1_out+dense_out) class TransformerDecoder(keras.layers.Layer): def init(self, num_heads, embed_dim, latent_dim, **kwargs): super().__init__(**kwargs) self.num_heads = num_heads self.embed_dim = embed_dim self.latent_dim = latent_dim self.class_name = 'Decoder' self.attention_1 = keras.layers.MultiHeadAttention(num_heads=self.num_heads, key_dim=self.embed_dim) self.attention_2 = keras.layers.MultiHeadAttention(num_heads=self.num_heads, key_dim=self.embed_dim) self.layer_1 = keras.layers.LayerNormalization() self.layer_2 = keras.layers.LayerNormalization() self.layer_3 = keras.layers.LayerNormalization() self.dense = keras.models.Sequential([keras.layers.Dense(self.latent_dim, activation='relu'), keras.layers.Dense(self.embed_dim)]) self.supports_masking=True def call(self, inputs, encoder_outputs, mask=None): tf.print('ClassName=TransformerDecoder-------------------------------------------------------') #inputs.shape=(None, 35, 32), encoder_outputs.shape=(None, 35, 32) #tf.print('aaaaaaaaa=', inputs.shape) casual_mask = self.get_casual_attention_mask(inputs) tf.print('inputs.shape=', inputs.shape) tf.print('casual_mask.shape=', casual_mask.shape) if mask is not None: padding_mask = tf.cast(mask[:, None, :], dtype='int32') padding_mask = tf.minimum(padding_mask, casual_mask) tf.print('padding_mask.shape=', padding_mask.shape) else: padding_mask = None tf.print('padding_mask = None') attention_1_out = self.attention_1(query=inputs, key=inputs, value=inputs, attention_mask=casual_mask) tf.print('attention_1_out.shape=', attention_1_out.shape) layer_1_out = self.layer_1(inputs+attention_1_out) attention_2_out = self.attention_2(query=layer_1_out, key=encoder_outputs, value=encoder_outputs, attention_mask=padding_mask) layer_2_out = self.layer_2(layer_1_out + attention_2_out) dense_out = self.dense(layer_2_out) tf.print('dense_out.shape=', dense_out.shape) return self.layer_3(layer_2_out + dense_out) def get_casual_attention_mask(self, inputs): #input_shape=(2, 35, 32) =(BatchSize, Sequence_len, Embed_Len) input_shape = tf.shape(inputs) batch_size, sequence_length = input_shape[0], input_shape[1] #i=(35, 1), j=(35,) #i=[[0], [1], [2], ... [35]], j=[0 1 2 ... 34] i = tf.range(start=0, limit=sequence_length)[:, tf.newaxis] j = tf.range(start=0, limit=sequence_length) # tf.cast 함수는 보통 조건에 따른 True, False 의 판단 기준에 따라 True 면 1, False 면 0을 반환한다. # mask.shape=(1, 35, 35), mask=[[[1 0 0 .. 0], [1 1 0 0 ...0], [1 1 1 1 ...1 0], [1 1 1 1 ... 1 1]]] mask = tf.cast(i>=j, dtype='int32') mask = tf.reshape(mask, (1, input_shape[1], input_shape[1])) # mult = (2, 1, 1), (BatchSize, 1, 1) mult = tf.concat([tf.expand_dims(batch_size, -1), tf.convert_to_tensor([1,1])], axis=0) return tf.tile(mask, mult) MAX_EMBED=32 MAX_VOCAB=5000 MAX_SEQ = 35 MAX_DENSE=1024 MAX_HEAD=1 encoder_inputs = keras.layers.Input(shape=(MAX_SEQ,), dtype='int64', name='encoder_inputs') encoder_embed_outs = PositionalEmbedding(MAX_SEQ, MAX_VOCAB, MAX_EMBED)(encoder_inputs) encoder_transformer_outs = TransformerEncoder(num_heads=1, embed_dim=MAX_EMBED, dense_dim=MAX_DENSE)(encoder_embed_outs) #encoder_transformer_outs == (None, 80, 256) decoder_inputs = keras.layers.Input(shape=(MAX_SEQ,), dtype='int64', name='decoder_inputs') decoder_embed_outs = PositionalEmbedding(MAX_SEQ, MAX_VOCAB, MAX_EMBED)(decoder_inputs) #decoder_embed_outs == (None, 80, 256) decoder_transformer_outs = TransformerDecoder(1, MAX_EMBED, MAX_DENSE)(decoder_embed_outs, encoder_transformer_outs) decoder_dropout_outs = keras.layers.Dropout(0.5)(decoder_transformer_outs) decoder_outputs = keras.layers.Dense(MAX_VOCAB, activation='softmax')(decoder_dropout_outs) model = keras.Model(inputs=[encoder_inputs, decoder_inputs], outputs=decoder_outputs) model.summary() 호출(호출은 Log만 찍어보게 BatchSize를 줄였습니다.)q_train_seqs = q_seqs[:2] a_train_seqs = a_seqs[:2] print(q_train_seqs.shape, a_train_seqs.shape) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) history = model.fit([q_train_seqs, a_train_seqs[:, :-1]], a_train_seqs[:, 1:], epochs=1) 이렇게 해서 돌리면 결과가 아래와 같이 찍힙니다.ClassName=TransformerEncoder------------------------------------------------------- mask=None input.shape= TensorShape([None, 35, 32]) attention_out.shape= TensorShape([None, 35, 32]) dense_out.shape= TensorShape([None, 35, 32]) ClassName=TransformerDecoder------------------------------------------------------- inputs.shape= TensorShape([None, 35, 32]) casual_mask.shape= TensorShape([None, 35, 35]) padding_mask = None attention_1_out.shape= TensorShape([None, 35, 32]) dense_out.shape= TensorShape([None, 35, 32]) 1/1 [==============================] - 4s 4s/step - loss: 8.2735 - accuracy: 0.0000e+00 질문은 아래와 같습니다.Encoder 파트에서 mask=None 으로 Mask가 들어있지 않습니다. 그럼 굳이 mask는 구현할 필요가 없는건지? Decoder 파트에서는 첫번째 Self-Attention 부분에서만 제대로된 마스킹 값이 들어가고 Encoder의 Key와 매핑 시키는 부분에서는 마찬가지로 padding_mask가 None 입니다. 이 부분에 대해 조금 더 자세한 설명을 해 주시면 감사하겠습니다. 다시 한번 설명 드리면class TransformerEncoder(keras.layers.Layer): ... def call(self, inputs, mask=None): tf.print('ClassName=TransformerEncoder-------------------------------------------------------') if mask is not None: #print('ClassName={}, mask.shape={}'.format(self.class_name, mask.shape)) padding_mask = mask[:, tf.newaxis, :] tf.print('mask.shape=', padding_mask.shape) else: padding_mask = None tf.print('mask=None') #Encoder 에서 padding_mask는 None으로 찍힘 attention_out = self.attention(query=inputs, key=inputs, value=inputs, attention_mask=padding_mask) class TransformerDecoder(keras.layers.Layer): def call(self, inputs, encoder_outputs, mask=None): casual_mask = self.get_casual_attention_mask(inputs) #mask는 None 으로 들어옴 if mask is not None: padding_mask = tf.cast(mask[:, None, :], dtype='int32') padding_mask = tf.minimum(padding_mask, casual_mask) else: padding_mask = None # casual_mask는 현재 위치 이후는 0 으로 패딩 된 것 확인 attention_1_out = self.attention_1(query=inputs, key=inputs, value=inputs, attention_mask=casual_mask) layer_1_out = self.layer_1(inputs+attention_1_out) # 하지만 padding_mask는 None 임 attention_2_out = self.attention_2(query=layer_1_out, key=encoder_outputs, value=encoder_outputs, attention_mask=padding_mask) layer_2_out = self.layer_2(layer_1_out + attention_2_out)