import%20marimo%0A%0A__generated_with%20%3D%20%220.19.2%22%0Aapp%20%3D%20marimo.App()%0A%0Awith%20app.setup%3A%0A%20%20%20%20import%20copy%0A%20%20%20%20import%20os%0A%20%20%20%20import%20time%0A%20%20%20%20import%20zipfile%0A%20%20%20%20from%20importlib.metadata%20import%20version%0A%20%20%20%20from%20pathlib%20import%20Path%0A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20pandas%20as%20pd%0A%20%20%20%20import%20requests%0A%20%20%20%20import%20tiktoken%0A%20%20%20%20import%20torch%0A%20%20%20%20%23%20%E3%81%93%E3%82%8C%E3%81%BE%E3%81%A7%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%0A%20%20%20%20from%20ch04%20import%20GPTModel%2C%20generate_text_simple%0A%20%20%20%20from%20ch05%20import%20(load_weights_into_gpt%2C%20text_to_token_ids%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20token_ids_to_text%2C%20get_torch_device)%0A%20%20%20%20%23%20%E8%BF%BD%E5%8A%A0%E3%81%AE%E3%83%A6%E3%83%BC%E3%83%86%E3%82%A3%E3%83%AA%E3%83%86%E3%82%A3%0A%20%20%20%20from%20gpt_download%20import%20download_and_load_gpt2%0A%20%20%20%20from%20torch.utils.data%20import%20DataLoader%2C%20Dataset%0A%0A%20%20%20%20device%20%3D%20get_torch_device()%0A%20%20%20%20print(%22Device%3A%22%2C%20device)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20%E7%AC%AC6%E7%AB%A0%3A%20%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E5%88%86%E9%A1%9E%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%B3%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20_pkgs%20%3D%20%5B%22matplotlib%22%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%22numpy%22%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%22tiktoken%22%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%22torch%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22tensorflow%22%20%23%20OpenAI%20%E3%81%AE%E4%BA%8B%E5%89%8D%E5%AD%A6%E7%BF%92%E6%B8%88%E3%81%BF%E9%87%8D%E3%81%BF%E7%94%A8%0A%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20for%20_p%20in%20_pkgs%3A%0A%20%20%20%20%20%20%20%20print(f%22%7B_p%7D%20version%3A%20%7Bversion(_p)%7D%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%206.2%20%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%81%AE%E6%BA%96%E5%82%99%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%83%BB%E5%B1%95%E9%96%8B%E3%83%BB%E3%83%AA%E3%83%8D%E3%83%BC%E3%83%A0%E3%81%99%E3%82%8B%E9%96%A2%E6%95%B0%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20download_and_unzip_spam_data(url%2C%20zip_path%2C%20extracted_path%2C%20data_file_path)%3A%0A%20%20%20%20if%20data_file_path.exists()%3A%0A%20%20%20%20%20%20%20%20print(f%22File%20%7Bdata_file_path%7D%20already%20exists.%20Skipping%20download.%22)%0A%20%20%20%20%20%20%20%20return%0A%0A%20%20%20%20%23%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B%0A%20%20%20%20response%20%3D%20requests.get(url%2C%20stream%3DTrue%2C%20timeout%3D60)%0A%20%20%20%20response.raise_for_status()%0A%20%20%20%20with%20open(zip_path%2C%20%22wb%22)%20as%20out_file%3A%0A%20%20%20%20%20%20%20%20for%20chunk%20in%20response.iter_content(chunk_size%3D8192)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20chunk%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20out_file.write(chunk)%0A%0A%20%20%20%20%23%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%B1%95%E9%96%8B%E3%81%99%E3%82%8B%0A%20%20%20%20with%20zipfile.ZipFile(zip_path%2C%20%22r%22)%20as%20zip_ref%3A%0A%20%20%20%20%20%20%20%20zip_ref.extractall(extracted_path)%0A%20%20%20%20os.remove(zip_path)%20%23%20zip%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E7%89%87%E4%BB%98%E3%81%91%E3%82%8B%0A%0A%20%20%20%20%23%20.tsv%20%E6%8B%A1%E5%BC%B5%E5%AD%90%E3%82%92%E4%BB%98%E4%B8%8E%E3%81%99%E3%82%8B%0A%20%20%20%20original_file_path%20%3D%20Path(extracted_path)%20%2F%20%22SMSSpamCollection%22%0A%20%20%20%20os.rename(original_file_path%2C%20data_file_path)%0A%20%20%20%20print(f%22File%20downloaded%20and%20saved%20as%20%7Bdata_file_path%7D%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E7%94%A8%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E6%BA%96%E5%82%99%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20project_root%20%3D%20Path(__file__).parent.parent.parent%0A%20%20%20%20data_root%20%3D%20project_root%20%2F%20%22data%22%20%2F%20%22ch06%22%0A%20%20%20%20data_root.mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%20%20%20%20return%20data_root%2C%20project_root%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E4%B8%8A%E8%A8%98%E3%81%AE%E9%96%A2%E6%95%B0%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%82%92%E6%BA%96%E5%82%99%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(data_root)%3A%0A%20%20%20%20_zip_path%20%3D%20data_root%20%2F%20%22sms_spam_collection.zip%22%0A%20%20%20%20_extracted_path%20%3D%20data_root%20%2F%20%22sms_spam_collection%22%0A%20%20%20%20data_file_path%20%3D%20_extracted_path%20%2F%20%22SMSSpamCollection.tsv%22%0A%20%20%20%20print(f%22Downloading%20dataset%20to%20%7B_zip_path%7D...%22)%0A%0A%20%20%20%20_dataset_url%20%3D%20%22https%3A%2F%2Farchive.ics.uci.edu%2Fstatic%2Fpublic%2F228%2Fsms%2Bspam%2Bcollection.zip%22%0A%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20download_and_unzip_spam_data(_dataset_url%2C%20_zip_path%2C%20_extracted_path%2C%20data_file_path)%0A%20%20%20%20except%20(requests.exceptions.RequestException%2C%20TimeoutError)%20as%20e%3A%0A%20%20%20%20%20%20%20%20print(f%22Primary%20URL%20failed%3A%20%7Be%7D.%20Trying%20backup%20URL...%22)%0A%20%20%20%20%20%20%20%20_backup_url%20%3D%20%22https%3A%2F%2Ff001.backblazeb2.com%2Ffile%2FLLMs-from-scratch%2Fsms%252Bspam%252Bcollection.zip%22%0A%20%20%20%20%20%20%20%20download_and_unzip_spam_data(_backup_url%2C%20_zip_path%2C%20_extracted_path%2C%20data_file_path)%0A%20%20%20%20return%20(data_file_path%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%81%93%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%81%AF%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E3%81%AA%E3%81%97%E3%81%AE%E3%82%BF%E3%83%96%E5%8C%BA%E5%88%87%E3%82%8A%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E5%90%84%E8%A1%8C%E3%81%AF%20spam%2Fham%20%E3%81%AE%E3%83%A9%E3%83%99%E3%83%AB%E3%81%A8%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%EF%BC%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%EF%BC%89%E3%81%AE%E3%83%9A%E3%82%A2%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82ham%20%E3%81%AF%20spam%20%E3%81%A7%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8%E3%82%92%E6%84%8F%E5%91%B3%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(data_file_path)%3A%0A%20%20%20%20df%20%3D%20pd.read_csv(data_file_path%2C%20sep%3D%22%5Ct%22%2C%20header%3DNone%2C%20names%3D%5B%22Label%22%2C%20%22Text%22%5D)%0A%20%20%20%20print(f%22%7Bdf%3D%7D%22)%0A%20%20%20%20return%20(df%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E7%B5%B1%E8%A8%88%E9%87%8F%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%80%82%E3%82%B9%E3%83%91%E3%83%A0%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AF%E7%95%B0%E5%B8%B8%E3%81%A7%E3%81%82%E3%82%8A%E3%80%81%E3%81%9D%E3%81%AE%E6%95%B0%E3%81%AF%20ham%20%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%88%E3%82%8A%E3%81%AF%E3%82%8B%E3%81%8B%E3%81%AB%E5%B0%91%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(df)%3A%0A%20%20%20%20print(df%5B%22Label%22%5D.value_counts())%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20spam%20%E3%81%A8%20ham%20%E3%81%AE%E6%95%B0%E3%81%AE%E3%83%90%E3%83%A9%E3%83%B3%E3%82%B9%E3%82%92%E5%8F%96%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E3%82%A2%E3%83%B3%E3%83%80%E3%83%BC%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20create_balanced_dataset(df)%3A%0A%20%20%20%20%23%20%22spam%22%20%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E6%95%B0%E3%82%92%E6%95%B0%E3%81%88%E3%82%8B%0A%20%20%20%20num_spam%20%3D%20df%5Bdf%5B%22Label%22%5D%20%3D%3D%20%22spam%22%5D.shape%5B0%5D%0A%0A%20%20%20%20%23%20%22spam%22%20%E3%81%AE%E6%95%B0%E3%81%AB%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6%20%22ham%22%20%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%82%92%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%81%AB%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B%0A%20%20%20%20ham_subset%20%3D%20df%5Bdf%5B%22Label%22%5D%20%3D%3D%20%22ham%22%5D.sample(num_spam%2C%20random_state%3D123)%0A%0A%20%20%20%20%23%20ham%20%E3%81%AE%20%22subset%22%20%E3%81%A8%20%22spam%22%20%E3%82%92%E7%B5%90%E5%90%88%E3%81%99%E3%82%8B%0A%20%20%20%20balanced_df%20%3D%20pd.concat(%5Bham_subset%2C%20df%5Bdf%5B%22Label%22%5D%20%3D%3D%20%22spam%22%5D%5D)%0A%0A%20%20%20%20return%20balanced_df%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E7%B5%90%E6%9E%9C%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(df)%3A%0A%20%20%20%20balanced_df%20%3D%20create_balanced_dataset(df)%0A%20%20%20%20print(balanced_df%5B%22Label%22%5D.value_counts())%0A%20%20%20%20return%20(balanced_df%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E6%95%B0%E5%80%A4%E6%BC%94%E7%AE%97%E3%81%AE%E3%81%9F%E3%82%81%E3%80%81%60str%60%20%E3%82%92%20%60int%60%20%E3%81%B8%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(balanced_df)%3A%0A%20%20%20%20balanced_df%5B%22Label%22%5D%20%3D%20balanced_df%5B%22Label%22%5D.map(%7B%22ham%22%3A%200%2C%20%22spam%22%3A%201%7D)%20%20%20%20%0A%20%20%20%20balanced_df%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%AD%A6%E7%BF%92%E3%83%BB%E6%A4%9C%E8%A8%BC%E3%83%BB%E3%83%86%E3%82%B9%E3%83%88%E7%94%A8%E3%81%AE%E5%88%86%E5%89%B2%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%5Bpandas.DataFrame.sample%5D(https%3A%2F%2Fpandas.pydata.org%2Fdocs%2Freference%2Fapi%2Fpandas.DataFrame.sample.html)%20%E3%81%A7%E3%81%AF%E3%80%81%60frac%3D1%60%20%E3%81%AF100%25%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E6%84%8F%E5%91%B3%E3%81%97%E3%80%81%60.reset_index(drop%3DTrue)%60%20%E3%81%AF%E5%85%83%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%EF%BC%88%E8%A1%8C%E7%95%AA%E5%8F%B7%EF%BC%89%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E6%84%8F%E5%91%B3%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20random_split(df%2C%20train_frac%2C%20validation_frac)%3A%0A%20%20%20%20%22%22%22%0A%20%20%20%20DataFrame%20%E3%82%92%E5%AD%A6%E7%BF%92%E3%83%BB%E6%A4%9C%E8%A8%BC%E3%83%BB%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E5%90%84%E3%82%BB%E3%83%83%E3%83%88%E3%81%B8%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%81%AB%E5%88%86%E5%89%B2%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%3Aparam%20df%3A%20%E5%88%86%E5%89%B2%E5%AF%BE%E8%B1%A1%E3%81%AE%20DataFrame%E3%80%82%0A%20%20%20%20%3Aparam%20train_frac%3A%20%E5%AD%A6%E7%BF%92%E3%81%AB%E4%BD%BF%E3%81%86%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%89%B2%E5%90%88%20(0-1)%E3%80%82%0A%20%20%20%20%3Aparam%20validation_frac%3A%20%E6%A4%9C%E8%A8%BC%E3%81%AB%E4%BD%BF%E3%81%86%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%89%B2%E5%90%88%20(0-1)%E3%80%82%0A%20%20%20%20%3Areturn%3A%20(train_df%2C%20validation_df%2C%20test_df)%20%E3%81%AE%E3%82%BF%E3%83%97%E3%83%AB%E3%80%82%0A%20%20%20%20%22%22%22%0A%20%20%20%20%23%20DataFrame%20%E5%85%A8%E4%BD%93%E3%82%92%E3%82%B7%E3%83%A3%E3%83%83%E3%83%95%E3%83%AB%E3%81%99%E3%82%8B%0A%20%20%20%20df%20%3D%20df.sample(frac%3D1%2C%20random_state%3D123).reset_index(drop%3DTrue)%0A%0A%20%20%20%20%23%20%E5%88%86%E5%89%B2%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%0A%20%20%20%20train_end%20%3D%20int(len(df)%20*%20train_frac)%0A%20%20%20%20validation_end%20%3D%20train_end%20%2B%20int(len(df)%20*%20validation_frac)%0A%0A%20%20%20%20%23%20DataFrame%20%E3%82%92%E5%88%86%E5%89%B2%E3%81%99%E3%82%8B%0A%20%20%20%20train_df%20%3D%20df%5B%3Atrain_end%5D%0A%20%20%20%20validation_df%20%3D%20df%5Btrain_end%3Avalidation_end%5D%0A%20%20%20%20test_df%20%3D%20df%5Bvalidation_end%3A%5D%0A%0A%20%20%20%20return%20train_df%2C%20validation_df%2C%20test_df%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E6%AC%A1%E3%81%AE%E5%89%B2%E5%90%88%E3%81%A7%E5%88%86%E5%89%B2%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%80%81%0A%0A%20%20%20%20%5C%5B%0A%20%20%20%20%5Ctext%7Btrain%7D%20%3A%20%5Ctext%7Bvalid%7D%20%3A%20%5Ctext%7Btest%7D%20%3D%200.7%20%3A%200.1%20%3A%200.2%0A%20%20%20%20%5C%5D%0A%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%82%89%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%82%92%20CSV%20%E3%81%A8%E3%81%97%E3%81%A6%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(balanced_df%2C%20data_root)%3A%0A%20%20%20%20train_df%2C%20validation_df%2C%20test_df%20%3D%20random_split(balanced_df%2C%200.7%2C%200.1)%0A%20%20%20%20%23%20%E3%83%86%E3%82%B9%E3%83%88%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AF%E6%AE%8B%E3%82%8A%E3%81%A8%E3%81%97%E3%81%A6%200.2%20%E3%81%AB%E3%81%AA%E3%82%8B%0A%0A%20%20%20%20train_path%20%3D%20data_root%20%2F%20%22train.csv%22%0A%20%20%20%20valid_path%20%3D%20data_root%20%2F%20%22validation.csv%22%0A%20%20%20%20test_path%20%3D%20data_root%20%2F%20%22test.csv%22%0A%20%20%20%20train_df.to_csv(train_path%2C%20index%3DNone)%0A%20%20%20%20validation_df.to_csv(valid_path%2C%20index%3DNone)%0A%20%20%20%20test_df.to_csv(test_path%2C%20index%3DNone)%0A%20%20%20%20return%20test_path%2C%20train_path%2C%20valid_path%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%206.3%20%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%E3%81%AE%E4%BD%9C%E6%88%90%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20tiktoken%20%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%80%E3%83%BC%E3%81%A8%E3%80%81%E3%83%91%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3ID%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%BF%E3%81%86%20%60%3C%7Cendoftext%7C%3E%60%20%E3%81%AE%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3ID%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20tokenizer%20%3D%20tiktoken.get_encoding(%22gpt2%22)%0A%20%20%20%20_encoded_eof%20%3D%20tokenizer.encode(%22%3C%7Cendoftext%7C%3E%22%2C%20allowed_special%3D%7B%22%3C%7Cendoftext%7C%3E%22%7D)%0A%20%20%20%20print(_encoded_eof)%0A%20%20%20%20return%20(tokenizer%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20DataLoader%20%E3%81%A7%E4%BD%BF%E3%81%86%E3%81%9F%E3%82%81%E3%80%81%5BMap%20%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%5D(https%3A%2F%2Fdocs.pytorch.org%2Fdocs%2Fstable%2Fdata.html%23map-style-datasets)%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E7%B3%BB%E5%88%97%E3%81%AF%E3%80%81%E6%98%8E%E7%A4%BA%E7%9A%84%E3%81%AB%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E9%95%B7%E3%81%95%E3%80%81%E3%81%BE%E3%81%9F%E3%81%AF%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E5%86%85%E3%81%AE%E6%9C%80%E5%A4%A7%E7%B3%BB%E5%88%97%E9%95%B7%E3%81%AB%E3%80%81%E4%B8%80%E6%A7%98%E3%81%AA%E9%95%B7%E3%81%95%E3%81%B8%E3%83%91%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%95%E3%82%8C%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.class_definition%0Aclass%20SpamDataset(Dataset)%3A%0A%20%20%20%20def%20__init__(self%2C%20csv_file%2C%20tokenizer%2C%20max_length%3DNone%2C%20pad_token_id%3D50256)%3A%0A%20%20%20%20%20%20%20%20self.data%20%3D%20pd.read_csv(csv_file)%0A%0A%20%20%20%20%20%20%20%20%23%20%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E4%BA%8B%E5%89%8D%E3%81%AB%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E5%8C%96%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20self.encoded_texts%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20tokenizer.encode(text)%20for%20text%20in%20self.data%5B%22Text%22%5D%0A%20%20%20%20%20%20%20%20%5D%0A%0A%20%20%20%20%20%20%20%20%23%20%E3%83%91%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B%E7%B3%BB%E5%88%97%E9%95%B7%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20if%20max_length%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.max_length%20%3D%20self._longest_encoded_length()%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.max_length%20%3D%20max_length%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20max_length%20%E3%82%88%E3%82%8A%E9%95%B7%E3%81%84%E7%B3%BB%E5%88%97%E3%81%AF%E5%88%87%E3%82%8A%E8%A9%B0%E3%82%81%E3%82%8B%0A%20%20%20%20%20%20%20%20%20%20%20%20self.encoded_texts%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20encoded_text%5B%3Aself.max_length%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20encoded_text%20in%20self.encoded_texts%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%0A%20%20%20%20%20%20%20%20%23%20%E6%9C%80%E9%95%B7%E3%81%AE%E7%B3%BB%E5%88%97%E3%81%AB%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6%E7%B3%BB%E5%88%97%E3%82%92%E3%83%91%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20self.encoded_texts%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20encoded_text%20%2B%20%5Bpad_token_id%5D%20*%20(self.max_length%20-%20len(encoded_text))%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20encoded_text%20in%20self.encoded_texts%0A%20%20%20%20%20%20%20%20%5D%0A%0A%20%20%20%20def%20__getitem__(self%2C%20index)%3A%0A%20%20%20%20%20%20%20%20encoded%20%3D%20self.encoded_texts%5Bindex%5D%0A%20%20%20%20%20%20%20%20label%20%3D%20self.data.iloc%5Bindex%5D%5B%22Label%22%5D%0A%20%20%20%20%20%20%20%20%23%20torch.long%20%3D%3D%20torch.int64%0A%20%20%20%20%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20torch.tensor(encoded%2C%20dtype%3Dtorch.long)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20torch.tensor(label%2C%20dtype%3Dtorch.long)%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20def%20__len__(self)%3A%0A%20%20%20%20%20%20%20%20return%20len(self.data)%0A%0A%20%20%20%20def%20_longest_encoded_length(self)%3A%0A%20%20%20%20%20%20%20%20max_length%20%3D%200%0A%20%20%20%20%20%20%20%20for%20encoded_text%20in%20self.encoded_texts%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20encoded_length%20%3D%20len(encoded_text)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20encoded_length%20%3E%20max_length%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20max_length%20%3D%20encoded_length%0A%20%20%20%20%20%20%20%20return%20max_length%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%AD%A6%E7%BF%92%E7%94%A8%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B%E3%80%82%E3%81%9D%E3%82%8C%E3%82%92%E4%BF%9D%E8%A8%BC%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%60max_length%60%20%E3%82%92%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E9%95%B7%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82%0A%20%20%20%20%E4%BD%9C%E6%88%90%E5%BE%8C%E3%80%81%60max_length%60%20%E3%81%A8%E5%90%84%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%BD%A2%E7%8A%B6%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(tokenizer%2C%20train_path)%3A%0A%20%20%20%20train_dataset%20%3D%20SpamDataset(%0A%20%20%20%20%20%20%20%20csv_file%3Dtrain_path%2C%0A%20%20%20%20%20%20%20%20max_length%3DNone%2C%20%20%23%20%E5%AE%9F%E9%9A%9B%E3%81%AE%E7%B3%BB%E5%88%97%E3%81%AE%E6%9C%80%E5%A4%A7%E9%95%B7%E3%82%92%E4%BD%BF%E3%81%86%0A%20%20%20%20%20%20%20%20tokenizer%3Dtokenizer%0A%20%20%20%20)%0A%0A%20%20%20%20print(f%22%7Btrain_dataset.max_length%3D%7D%22)%0A%20%20%20%20%23%20%E7%B3%BB%E5%88%97%E3%81%A8%E3%81%9D%E3%81%AE%E3%83%A9%E3%83%99%E3%83%AB%E3%81%AE%E3%82%BF%E3%83%97%E3%83%AB%0A%20%20%20%20print(f%22%7Btrain_dataset%5B0%5D%3D%7D%22)%20%20%0A%20%20%20%20%23%20%E7%B3%BB%E5%88%97%E3%81%AE%E9%95%B7%E3%81%95%E3%81%AF%20max_length%20%E3%81%A8%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%0A%20%20%20%20print(f%22%7Btrain_dataset%5B0%5D%5B0%5D.shape%3D%7D%22)%0A%20%20%20%20return%20(train_dataset%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E6%A4%9C%E8%A8%BC%E7%94%A8%E3%81%A8%E3%83%86%E3%82%B9%E3%83%88%E7%94%A8%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%82%82%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%80%82%E5%90%8C%E3%81%98%E6%9D%A1%E4%BB%B6%E3%82%92%E4%BF%9D%E8%A8%BC%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E5%90%84%E6%A7%8B%E7%AF%89%E3%81%A7%20%60max_length%60%20%E3%82%92%E5%85%B1%E6%9C%89%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(test_path%2C%20tokenizer%2C%20train_dataset%2C%20valid_path)%3A%0A%20%20%20%20val_dataset%20%3D%20SpamDataset(%0A%20%20%20%20%20%20%20%20csv_file%3Dvalid_path%2C%0A%20%20%20%20%20%20%20%20max_length%3Dtrain_dataset.max_length%2C%0A%20%20%20%20%20%20%20%20tokenizer%3Dtokenizer%0A%20%20%20%20)%0A%20%20%20%20test_dataset%20%3D%20SpamDataset(%0A%20%20%20%20%20%20%20%20csv_file%3Dtest_path%2C%0A%20%20%20%20%20%20%20%20max_length%3Dtrain_dataset.max_length%2C%0A%20%20%20%20%20%20%20%20tokenizer%3Dtokenizer%0A%20%20%20%20)%0A%20%20%20%20return%20test_dataset%2C%20val_dataset%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%82%89%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%5B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%5D(https%3A%2F%2Fdocs.pytorch.org%2Fdocs%2Fstable%2Fdata.html%23torch.utils.data.DataLoader)%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(test_dataset%2C%20train_dataset%2C%20val_dataset)%3A%0A%20%20%20%20_num_workers%20%3D%200%20%20%23%20%E4%BA%92%E6%8F%9B%E6%80%A7%E3%82%92%E7%A2%BA%E4%BF%9D%E3%81%99%E3%82%8B%EF%BC%88%E5%85%A8%20CPU%20%E5%90%91%E3%81%91%EF%BC%89%0A%20%20%20%20_batch_size%20%3D%208%0A%20%20%20%20torch.manual_seed(123)%0A%0A%20%20%20%20train_loader%20%3D%20DataLoader(%0A%20%20%20%20%20%20%20%20dataset%3Dtrain_dataset%2C%0A%20%20%20%20%20%20%20%20batch_size%3D_batch_size%2C%0A%20%20%20%20%20%20%20%20shuffle%3DTrue%2C%20%20%23%20%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E5%8C%96%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20num_workers%3D_num_workers%2C%0A%20%20%20%20%20%20%20%20drop_last%3DTrue%2C%20%20%23%20%E4%B8%8D%E5%AE%8C%E5%85%A8%E3%81%AA%E3%83%90%E3%83%83%E3%83%81%E3%82%92%E7%84%A1%E8%A6%96%E3%81%99%E3%82%8B%0A%20%20%20%20)%0A%0A%20%20%20%20val_loader%20%3D%20DataLoader(%0A%20%20%20%20%20%20%20%20dataset%3Dval_dataset%2C%0A%20%20%20%20%20%20%20%20batch_size%3D_batch_size%2C%0A%20%20%20%20%20%20%20%20num_workers%3D_num_workers%2C%0A%20%20%20%20%20%20%20%20drop_last%3DFalse%2C%0A%20%20%20%20)%0A%0A%20%20%20%20test_loader%20%3D%20DataLoader(%0A%20%20%20%20%20%20%20%20dataset%3Dtest_dataset%2C%0A%20%20%20%20%20%20%20%20batch_size%3D_batch_size%2C%0A%20%20%20%20%20%20%20%20num_workers%3D_num_workers%2C%0A%20%20%20%20%20%20%20%20drop_last%3DFalse%2C%0A%20%20%20%20)%0A%20%20%20%20return%20test_loader%2C%20train_loader%2C%20val_loader%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%AD%A6%E7%BF%92%E7%94%A8%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%E3%82%92%E6%9C%80%E5%BE%8C%E3%81%BE%E3%81%A7%E5%8F%8D%E5%BE%A9%E3%81%97%E3%81%A6%E6%9C%80%E7%B5%82%E3%83%90%E3%83%83%E3%83%81%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%80%81%E3%81%9D%E3%81%AE%E5%BD%A2%E7%8A%B6%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%80%82%E6%9C%80%E7%B5%82%E3%83%90%E3%83%83%E3%83%81%E3%81%8C%E7%A2%BA%E3%81%8B%E3%81%AB%E5%AE%8C%E5%85%A8%E3%81%AA%E5%BD%A2%E7%8A%B6%E3%81%A7%E3%81%82%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E5%88%86%E3%81%8B%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(train_loader)%3A%0A%20%20%20%20%23%20%E4%BD%95%E3%82%82%E3%81%97%E3%81%AA%E3%81%84%E5%8F%8D%E5%BE%A9%0A%20%20%20%20for%20input_batch%2C%20target_batch%20in%20train_loader%3A%0A%20%20%20%20%20%20%20%20pass%0A%0A%20%20%20%20%23%20%E6%9C%80%E7%B5%82%E3%83%90%E3%83%83%E3%83%81%E3%81%A7%E3%82%821%E3%83%90%E3%83%83%E3%83%81%E3%81%AB8%E3%83%9A%E3%82%A2%E3%81%82%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E6%9C%9F%E5%BE%85%E3%81%99%E3%82%8B%0A%20%20%20%20print(%22Input%20batch%20dimensions%3A%22%2C%20input_batch.shape)%0A%20%20%20%20print(%22Label%20batch%20dimensions%22%2C%20target_batch.shape)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%90%84%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%E3%81%AE%E3%83%90%E3%83%83%E3%83%81%E6%95%B0%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(test_loader%2C%20train_loader%2C%20val_loader)%3A%0A%20%20%20%20_num_train%20%3D%20len(train_loader.dataset)%0A%20%20%20%20_num_val%20%3D%20len(val_loader.dataset)%0A%20%20%20%20_num_test%20%3D%20len(test_loader.dataset)%0A%20%20%20%20print(f%22%7B_num_train%7D%20training%20batches%22)%0A%20%20%20%20print(f%22%7B_num_val%7D%20validation%20batches%22)%0A%20%20%20%20print(f%22%7B_num_test%7D%20test%20batches%22)%0A%0A%20%20%20%20%23%20%E5%89%B2%E5%90%88%E3%81%8C%E6%9C%9F%E5%BE%85%E9%80%9A%E3%82%8A%E3%81%8B%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%0A%20%20%20%20_num_all%20%3D%20_num_train%20%2B%20_num_val%20%2B%20_num_test%0A%20%20%20%20_train_ratio%20%3D%20_num_train%20%2F%20_num_all%0A%20%20%20%20_val_ratio%20%3D%20_num_val%20%2F%20_num_all%0A%20%20%20%20_test_ratio%20%3D%20_num_test%20%2F%20_num_all%0A%20%20%20%20print(f%22Train%3AVal%3ATest%20%3D%20%7B_train_ratio%3A.2f%7D%3A%7B_val_ratio%3A.2f%7D%3A%7B_test_ratio%3A.2f%7D%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%206.4%20%E4%BA%8B%E5%89%8D%E5%AD%A6%E7%BF%92%E6%B8%88%E3%81%BF%E9%87%8D%E3%81%BF%E3%81%A7%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E5%88%9D%E6%9C%9F%E5%8C%96%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E4%BA%8B%E5%89%8D%E5%AD%A6%E7%BF%92%E3%81%A8%E5%90%8C%E3%81%98%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E4%BD%BF%E3%81%86%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(train_dataset)%3A%0A%20%20%20%20CHOOSE_MODEL%20%3D%20%22gpt2-small%20(124M)%22%0A%20%20%20%20INPUT_PROMPT%20%3D%20%22Every%20effort%20moves%22%0A%0A%20%20%20%20BASE_CONFIG%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22vocab_size%22%3A%2050257%2C%20%20%20%20%20%23%20%E8%AA%9E%E5%BD%99%E3%82%B5%E3%82%A4%E3%82%BA%0A%20%20%20%20%20%20%20%20%22context_length%22%3A%201024%2C%20%20%23%20%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E9%95%B7%0A%20%20%20%20%20%20%20%20%22drop_rate%22%3A%200.0%2C%20%20%20%20%20%20%20%20%23%20%E3%83%89%E3%83%AD%E3%83%83%E3%83%97%E3%82%A2%E3%82%A6%E3%83%88%E7%8E%87%0A%20%20%20%20%20%20%20%20%22qkv_bias%22%3A%20True%20%20%20%20%20%20%20%20%20%23%20Query-Key-Value%20%E3%81%AE%E3%83%90%E3%82%A4%E3%82%A2%E3%82%B9%0A%20%20%20%20%7D%0A%0A%20%20%20%20model_configs%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22gpt2-small%20(124M)%22%3A%20%7B%22emb_dim%22%3A%20768%2C%20%22n_layers%22%3A%2012%2C%20%22n_heads%22%3A%2012%7D%2C%0A%20%20%20%20%20%20%20%20%22gpt2-medium%20(355M)%22%3A%20%7B%22emb_dim%22%3A%201024%2C%20%22n_layers%22%3A%2024%2C%20%22n_heads%22%3A%2016%7D%2C%0A%20%20%20%20%20%20%20%20%22gpt2-large%20(774M)%22%3A%20%7B%22emb_dim%22%3A%201280%2C%20%22n_layers%22%3A%2036%2C%20%22n_heads%22%3A%2020%7D%2C%0A%20%20%20%20%20%20%20%20%22gpt2-xl%20(1558M)%22%3A%20%7B%22emb_dim%22%3A%201600%2C%20%22n_layers%22%3A%2048%2C%20%22n_heads%22%3A%2025%7D%2C%0A%20%20%20%20%7D%0A%0A%20%20%20%20BASE_CONFIG.update(model_configs%5BCHOOSE_MODEL%5D)%0A%0A%20%20%20%20assert%20train_dataset.max_length%20%3C%3D%20BASE_CONFIG%5B%22context_length%22%5D%2C%20(%0A%20%20%20%20%20%20%20%20f%22Dataset%20length%20%7Btrain_dataset.max_length%7D%20exceeds%20model's%20context%20%22%0A%20%20%20%20%20%20%20%20f%22length%20%7BBASE_CONFIG%5B'context_length'%5D%7D.%20Reinitialize%20data%20sets%20with%20%22%0A%20%20%20%20%20%20%20%20f%22%60max_length%3D%7BBASE_CONFIG%5B'context_length'%5D%7D%60%22%0A%20%20%20%20)%0A%20%20%20%20return%20BASE_CONFIG%2C%20CHOOSE_MODEL%0A%0A%0A%40app.cell%0Adef%20_(BASE_CONFIG%2C%20CHOOSE_MODEL%2C%20project_root)%3A%0A%20%20%20%20%23%20%E6%B3%A2%E6%8B%AC%E5%BC%A7%E3%81%AE%E4%B8%AD%E3%81%AE%20%60str%60%20%E3%82%92%E8%A7%A3%E6%9E%90%E3%81%99%E3%82%8B%E3%81%A0%E3%81%91%0A%20%20%20%20_model_size%20%3D%20CHOOSE_MODEL.split(%22%20%22)%5B-1%5D.lstrip(%22(%22).rstrip(%22)%22)%0A%0A%20%20%20%20models_dir%20%3D%20project_root%20%2F%20%22models%22%20%2F%20%22gpt2%22%0A%20%20%20%20models_dir.mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%0A%20%20%20%20settings%2C%20params%20%3D%20download_and_load_gpt2(model_size%3D_model_size%2C%20models_dir%3Dmodels_dir)%0A%0A%20%20%20%20pretrained_model%20%3D%20GPTModel(BASE_CONFIG)%0A%20%20%20%20load_weights_into_gpt(pretrained_model%2C%20params)%0A%0A%20%20%20%20%23%20%E3%81%93%E3%82%8C%E3%81%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%B3%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%95%E3%82%8C%E3%82%8B%0A%20%20%20%20model%20%3D%20copy.deepcopy(pretrained_model)%0A%20%20%20%20return%20model%2C%20pretrained_model%0A%0A%0A%40app.cell%0Adef%20_(model)%3A%0A%20%20%20%20model.eval()%3B%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E7%B0%A1%E5%8D%98%E3%81%AA%E7%B3%BB%E5%88%97%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%80%81%E3%83%A2%E3%83%87%E3%83%AB%E3%81%8C%E4%BA%8B%E5%89%8D%E5%AD%A6%E7%BF%92%E6%B8%88%E3%81%BF%E3%81%A7%E6%8E%A8%E8%AB%96%E3%81%8C%E9%81%A9%E5%88%87%E3%81%A7%E3%81%82%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(BASE_CONFIG%2C%20pretrained_model%2C%20tokenizer)%3A%0A%20%20%20%20_text_1%20%3D%20%22Every%20effort%20moves%20you%22%0A%0A%20%20%20%20_token_ids%20%3D%20generate_text_simple(%0A%20%20%20%20%20%20%20%20model%3Dpretrained_model%2C%0A%20%20%20%20%20%20%20%20idx%3Dtext_to_token_ids(_text_1%2C%20tokenizer)%2C%0A%20%20%20%20%20%20%20%20max_new_tokens%3D15%2C%0A%20%20%20%20%20%20%20%20context_size%3DBASE_CONFIG%5B%22context_length%22%5D%0A%20%20%20%20)%0A%20%20%20%20print(f%22%7B_token_ids%3D%7D%22)%0A%0A%20%20%20%20print(%22token_ids_to_text(_token_ids%2C%20tokenizer)%3D%22)%0A%20%20%20%20print(f%22%7Btoken_ids_to_text(_token_ids%2C%20tokenizer)%7D%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%B3%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E5%89%8D%E3%81%AE%E6%8C%AF%E3%82%8B%E8%88%9E%E3%81%84%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%80%82%E5%9B%9E%E7%AD%94%E3%81%AF%E6%9C%80%E5%88%9D%E3%81%AE%E6%8C%87%E7%A4%BA%E3%81%AB%E5%BE%93%E3%82%8F%E3%81%9A%E3%80%81yes%20%E3%81%8B%20no%20%E3%81%A7%E7%AD%94%E3%81%88%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(BASE_CONFIG%2C%20pretrained_model%2C%20tokenizer)%3A%0A%20%20%20%20_text_2%20%3D%20(%0A%20%20%20%20%20%20%20%20%22Is%20the%20following%20text%20'spam'%3F%20Answer%20with%20'yes'%20or%20'no'%3A%22%0A%20%20%20%20%20%20%20%20%22%20'You%20are%20a%20winner%20you%20have%20been%20specially%22%0A%20%20%20%20%20%20%20%20%22%20selected%20to%20receive%20%241000%20cash%20or%20a%20%242000%20award.'%22%0A%20%20%20%20)%0A%0A%20%20%20%20_token_ids%20%3D%20generate_text_simple(%0A%20%20%20%20%20%20%20%20model%3Dpretrained_model%2C%0A%20%20%20%20%20%20%20%20idx%3Dtext_to_token_ids(_text_2%2C%20tokenizer)%2C%0A%20%20%20%20%20%20%20%20max_new_tokens%3D23%2C%0A%20%20%20%20%20%20%20%20context_size%3DBASE_CONFIG%5B%22context_length%22%5D%0A%20%20%20%20)%0A%0A%20%20%20%20print(token_ids_to_text(_token_ids%2C%20tokenizer))%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%206.5%20%E5%88%86%E9%A1%9E%E3%83%98%E3%83%83%E3%83%89%E3%81%AE%E8%BF%BD%E5%8A%A0%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E9%87%8D%E3%81%BF%E3%81%AE%E5%A4%A7%E9%83%A8%E5%88%86%E3%82%92%E5%86%8D%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E3%81%BE%E3%81%9A%E5%85%A8%E3%81%A6%E3%81%AE%E5%B1%A4%E3%82%92%E5%87%8D%E7%B5%90%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(model)%3A%0A%20%20%20%20for%20_param%20in%20model.parameters()%3A%0A%20%20%20%20%20%20%20%20_param.requires_grad%20%3D%20False%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20spam%20%E3%81%8B%20ham%20%E3%82%92%E5%88%86%E9%A1%9E%E3%81%99%E3%82%8B%E6%96%B0%E3%81%97%E3%81%84%E7%B7%9A%E5%BD%A2%E5%B1%A4%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E3%80%81%E6%9C%9F%E5%BE%85%E3%81%99%E3%82%8B%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E7%8F%BE%E5%9C%A8%E3%81%AE%E6%9C%80%E7%B5%82%E5%B1%A4%E3%82%92%E3%80%81%E3%81%93%E3%81%AE%E6%96%B0%E3%81%97%E3%81%84%E7%B7%9A%E5%BD%A2%E5%B1%A4%E3%81%A7%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(BASE_CONFIG%2C%20model)%3A%0A%20%20%20%20torch.manual_seed(123)%0A%0A%20%20%20%20_num_classes%20%3D%202%0A%20%20%20%20model.out_head%20%3D%20torch.nn.Linear(in_features%3DBASE_CONFIG%5B%22emb_dim%22%5D%2C%20out_features%3D_num_classes)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%AD%A6%E7%BF%92%E3%81%AE%E3%81%9F%E3%82%81%E3%80%81%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B9%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%BC%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%A8%E6%9C%80%E5%BE%8C%E3%81%AE%20%60LayerNorm%60%20%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AE%E5%8B%BE%E9%85%8D%E8%A8%88%E7%AE%97%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(model)%3A%0A%20%20%20%20for%20_param%20in%20model.trf_blocks%5B-1%5D.parameters()%3A%0A%20%20%20%20%20%20%20%20_param.requires_grad%20%3D%20True%0A%0A%20%20%20%20for%20_param%20in%20model.final_norm.parameters()%3A%0A%20%20%20%20%20%20%20%20_param.requires_grad%20%3D%20True%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%B3%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E5%89%8D%E3%81%AB%E3%80%81%E6%AC%A1%E3%81%AE%E5%85%A5%E5%8A%9B%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%93%E3%81%AE%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%A7%E6%8E%A8%E8%AB%96%E3%82%92%E8%A9%A6%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(tokenizer)%3A%0A%20%20%20%20inputs%20%3D%20tokenizer.encode(%22Do%20you%20have%20time%22)%0A%20%20%20%20inputs%20%3D%20torch.tensor(inputs).unsqueeze(0)%0A%20%20%20%20print(%22Inputs%3A%22%2C%20inputs)%0A%20%20%20%20print(%22Inputs%20dimensions%3A%22%2C%20inputs.shape)%20%23%20%E5%BD%A2%E7%8A%B6%3A%20(batch_size%2C%20num_tokens)%0A%20%20%20%20return%20(inputs%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%87%BA%E5%8A%9B%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AF%20%24(%5Ctext%7Bbatch%20size%7D%2C%20%5Ctext%7Bnum%20tokens%7D%2C%20%5Ctext%7Bnum%20classes%7D)%24%20%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(inputs%2C%20model)%3A%0A%20%20%20%20model.to(%22cpu%22)%20%20%23%20%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%82%92%E4%B8%80%E8%87%B4%E3%81%95%E3%81%9B%E3%82%8B%0A%20%20%20%20with%20torch.no_grad()%3A%0A%20%20%20%20%20%20%20%20outputs%20%3D%20model(inputs)%0A%0A%20%20%20%20print(%22Outputs%3A%5Cn%22%2C%20outputs)%0A%20%20%20%20print(%22Outputs%20dimensions%3A%22%2C%20outputs.shape)%20%23%20%E5%BD%A2%E7%8A%B6%3A%20(batch_size%2C%20num_tokens%2C%20num_classes)%0A%20%20%20%20return%20(outputs%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%88%86%E9%A1%9E%E3%81%AB%E3%81%AF%E6%9C%80%E5%BE%8C%E3%81%AE%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%AE%E3%81%BF%E3%82%92%E4%BD%BF%E3%81%86%E3%80%82%E3%82%B3%E3%83%BC%E3%82%B6%E3%83%AB%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%9E%E3%82%B9%E3%82%AF%E3%81%AB%E3%82%88%E3%82%8A%E3%80%81%E5%85%A8%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%A8%E5%9B%A0%E6%9E%9C%E7%9A%84%E3%81%AA%E7%9B%B8%E9%96%A2%E3%82%92%E6%8C%81%E3%81%A6%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%93%E3%81%AE%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%A0%E3%81%91%E3%81%A0%E3%81%8B%E3%82%89%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(outputs)%3A%0A%20%20%20%20print(%22Last%20output%20token%3A%22%2C%20outputs%5B%3A%2C%20-1%2C%20%3A%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%206.6%20%E5%88%86%E9%A1%9E%E3%81%AE%E6%90%8D%E5%A4%B1%E3%81%A8%E6%AD%A3%E8%A7%A3%E7%8E%87%E3%81%AE%E8%A8%88%E7%AE%97%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%87%BA%E5%8A%9B%E3%82%92%E3%82%AF%E3%83%A9%E3%82%B9%E3%83%A9%E3%83%99%E3%83%AB%E3%81%B8%E5%86%99%E5%83%8F%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(outputs)%3A%0A%20%20%20%20_probas%20%3D%20torch.softmax(outputs%5B%3A%2C%20-1%2C%20%3A%5D%2C%20dim%3D-1)%0A%20%20%20%20_label%20%3D%20torch.argmax(_probas)%0A%20%20%20%20print(%22Class%20label%3A%22%2C%20_label.item())%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%60softmax%60%20%E3%81%AF%E5%8D%98%E8%AA%BF%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%60argmax%60%20%E3%82%92%E5%8F%96%E3%82%8B%E3%81%A0%E3%81%91%E3%81%A7%E5%90%8C%E3%81%98%E7%B5%90%E6%9E%9C%E3%81%8C%E5%BE%97%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(outputs)%3A%0A%20%20%20%20_logits%20%3D%20outputs%5B%3A%2C%20-1%2C%20%3A%5D%0A%20%20%20%20_label%20%3D%20torch.argmax(_logits)%0A%20%20%20%20print(%22Class%20label%3A%22%2C%20_label.item())%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E8%A9%95%E4%BE%A1%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%AD%A3%E8%A7%A3%E7%8E%87%E3%81%AE%E6%8C%87%E6%A8%99%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20calc_accuracy_loader(data_loader%2C%20model%2C%20device%2C%20num_batches%3DNone)%3A%0A%20%20%20%20model.eval()%0A%20%20%20%20correct_predictions%2C%20num_examples%20%3D%200%2C%200%0A%0A%20%20%20%20if%20num_batches%20is%20None%3A%0A%20%20%20%20%20%20%20%20num_batches%20%3D%20len(data_loader)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20num_batches%20%3D%20min(num_batches%2C%20len(data_loader))%0A%0A%20%20%20%20for%20i%2C%20(input_batch%2C%20target_batch)%20in%20enumerate(data_loader)%3A%0A%20%20%20%20%20%20%20%20if%20i%20%3C%20num_batches%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20input_batch%2C%20target_batch%20%3D%20input_batch.to(device)%2C%20target_batch.to(device)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20with%20torch.no_grad()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E6%9C%80%E5%BE%8C%E3%81%AE%E5%87%BA%E5%8A%9B%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E3%83%AD%E3%82%B8%E3%83%83%E3%83%88%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20(num_samples%2C%20num_tokens%2C%20num_logits)%20-%3E%20%20(num_samples%2C%20num_logits)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20logits%20%3D%20model(input_batch)%5B%3A%2C%20-1%2C%20%3A%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20predicted_labels%20%3D%20torch.argmax(logits%2C%20dim%3D-1)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20num_examples%20%2B%3D%20predicted_labels.shape%5B0%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20correct_predictions%20%2B%3D%20(predicted_labels%20%3D%3D%20target_batch).sum().item()%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20break%0A%0A%20%20%20%20return%20correct_predictions%20%2F%20num_examples%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%AD%A6%E7%BF%92%E5%89%8D%E3%81%AE%E5%88%9D%E6%9C%9F%E3%81%AE%E6%AD%A3%E8%A7%A3%E7%8E%87%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(model%2C%20test_loader%2C%20train_loader%2C%20val_loader)%3A%0A%20%20%20%20%23%20nn.Module%20%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A7%E3%81%AF%20model%20%3D%20model.to(device)%20%E3%81%AE%E4%BB%A3%E5%85%A5%E3%81%AF%E4%B8%8D%E8%A6%81%0A%20%20%20%20model.to(device)%0A%20%20%20%20%23%20%E5%AD%A6%E7%BF%92%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%E3%81%AE%E3%82%B7%E3%83%A3%E3%83%83%E3%83%95%E3%83%AB%E3%81%AB%E3%82%88%E3%82%8B%E5%86%8D%E7%8F%BE%E6%80%A7%E3%81%AE%E3%81%9F%E3%82%81%0A%20%20%20%20torch.manual_seed(123)%20%0A%0A%20%20%20%20_train_accuracy%20%3D%20calc_accuracy_loader(train_loader%2C%20model%2C%20device%2C%20num_batches%3D10)%0A%20%20%20%20_val_accuracy%20%3D%20calc_accuracy_loader(val_loader%2C%20model%2C%20device%2C%20num_batches%3D10)%0A%20%20%20%20_test_accuracy%20%3D%20calc_accuracy_loader(test_loader%2C%20model%2C%20device%2C%20num_batches%3D10)%0A%0A%20%20%20%20print(f%22Training%20accuracy%3A%20%7B_train_accuracy*100%3A.2f%7D%25%22)%0A%20%20%20%20print(f%22Validation%20accuracy%3A%20%7B_val_accuracy*100%3A.2f%7D%25%22)%0A%20%20%20%20print(f%22Test%20accuracy%3A%20%7B_test_accuracy*100%3A.2f%7D%25%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%BE%AE%E5%88%86%E5%8F%AF%E8%83%BD%E6%80%A7%E3%81%AE%E3%81%9F%E3%82%81%E3%80%81%E5%AD%A6%E7%BF%92%E3%81%AB%E3%81%AF%E6%AD%A3%E8%A7%A3%E7%8E%87%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E4%BA%A4%E5%B7%AE%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AD%E3%83%94%E3%83%BC%E6%90%8D%E5%A4%B1%E3%82%92%E4%BD%BF%E3%81%86%E3%80%82%E5%AE%9A%E7%BE%A9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AF%5B%E3%81%93%E3%81%A1%E3%82%89%5D(https%3A%2F%2Fdocs.pytorch.org%2Fdocs%2Fstable%2Fgenerated%2Ftorch.nn.CrossEntropyLoss.html%23torch.nn.CrossEntropyLoss)%E3%82%92%E5%8F%82%E7%85%A7%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20calc_loss_batch(input_batch%2C%20target_batch%2C%20model%2C%20device)%3A%0A%20%20%20%20input_batch%2C%20target_batch%20%3D%20input_batch.to(device)%2C%20target_batch.to(device)%0A%20%20%20%20logits%20%3D%20model(input_batch)%5B%3A%2C%20-1%2C%20%3A%5D%20%20%23%20%E6%9C%80%E5%BE%8C%E3%81%AE%E5%87%BA%E5%8A%9B%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E3%83%AD%E3%82%B8%E3%83%83%E3%83%88%0A%20%20%20%20loss%20%3D%20torch.nn.functional.cross_entropy(logits%2C%20target_batch)%0A%20%20%20%20return%20loss%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%90%84%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E5%B9%B3%E5%9D%87%E6%90%8D%E5%A4%B1%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0A%23%20%E7%AC%AC5%E7%AB%A0%E3%81%A8%E5%90%8C%E3%81%98%0Adef%20calc_loss_loader(data_loader%2C%20model%2C%20device%2C%20num_batches%3DNone)%3A%0A%20%20%20%20if%20len(data_loader)%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20return%20float(%22nan%22)%0A%20%20%20%20elif%20num_batches%20is%20None%3A%0A%20%20%20%20%20%20%20%20num_batches%20%3D%20len(data_loader)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%23%20num_batches%20%E3%81%8C%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%E3%81%AE%E3%83%90%E3%83%83%E3%83%81%E6%95%B0%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%81%0A%20%20%20%20%20%20%20%20%23%20%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%E3%81%AE%E7%B7%8F%E3%83%90%E3%83%83%E3%83%81%E6%95%B0%E3%81%AB%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6%E3%83%90%E3%83%83%E3%83%81%E6%95%B0%E3%82%92%E6%B8%9B%E3%82%89%E3%81%99%0A%20%20%20%20%20%20%20%20num_batches%20%3D%20min(num_batches%2C%20len(data_loader))%0A%0A%20%20%20%20total_loss%20%3D%200.%0A%20%20%20%20for%20i%2C%20(input_batch%2C%20target_batch)%20in%20enumerate(data_loader)%3A%0A%20%20%20%20%20%20%20%20if%20i%20%3C%20num_batches%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20loss%20%3D%20calc_loss_batch(input_batch%2C%20target_batch%2C%20model%2C%20device)%0A%20%20%20%20%20%20%20%20%20%20%20%20total_loss%20%2B%3D%20loss.item()%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20return%20total_loss%20%2F%20num_batches%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%AD%A6%E7%BF%92%E5%89%8D%E3%81%AE%E5%88%9D%E6%9C%9F%E3%81%AE%E6%90%8D%E5%A4%B1%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(model%2C%20test_loader%2C%20train_loader%2C%20val_loader)%3A%0A%20%20%20%20model.to(device)%0A%20%20%20%20with%20torch.no_grad()%3A%20%23%20%E3%81%BE%E3%81%A0%E5%AD%A6%E7%BF%92%E3%81%97%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%81%AE%E3%81%A7%E3%80%81%E5%8A%B9%E7%8E%87%E3%81%AE%E3%81%9F%E3%82%81%E5%8B%BE%E9%85%8D%E8%BF%BD%E8%B7%A1%E3%82%92%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20_train_loss%20%3D%20calc_loss_loader(train_loader%2C%20model%2C%20device%2C%20num_batches%3D5)%0A%20%20%20%20%20%20%20%20_val_loss%20%3D%20calc_loss_loader(val_loader%2C%20model%2C%20device%2C%20num_batches%3D5)%0A%20%20%20%20%20%20%20%20_test_loss%20%3D%20calc_loss_loader(test_loader%2C%20model%2C%20device%2C%20num_batches%3D5)%0A%0A%20%20%20%20print(f%22Training%20loss%3A%20%7B_train_loss%3A.3f%7D%22)%0A%20%20%20%20print(f%22Validation%20loss%3A%20%7B_val_loss%3A.3f%7D%22)%0A%20%20%20%20print(f%22Test%20loss%3A%20%7B_test_loss%3A.3f%7D%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%206.7%20%E6%95%99%E5%B8%AB%E3%81%82%E3%82%8A%E3%83%87%E3%83%BC%E3%82%BF%E3%81%A7%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%B3%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%90%84%E3%82%A8%E3%83%9D%E3%83%83%E3%82%AF%E3%81%AE%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%AB%E6%AD%A3%E8%A7%A3%E7%8E%87%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%E3%80%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%B3%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E7%94%A8%E3%81%AE%E3%83%88%E3%83%AC%E3%83%BC%E3%83%8A%E3%83%BC%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0A%23%20%E7%AC%AC5%E7%AB%A0%E3%81%AE%20%60train_model_simple%60%20%E3%81%A8%E3%81%BB%E3%81%BC%E5%90%8C%E3%81%98%0Adef%20train_classifier_simple(model%2C%20train_loader%2C%20val_loader%2C%20optimizer%2C%20device%2C%20num_epochs%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20eval_freq%2C%20eval_iter)%3A%0A%20%20%20%20%22%22%22%0A%20%20%20%20%E4%B8%8E%E3%81%88%E3%82%89%E3%82%8C%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%E3%81%A8%E3%82%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%9E%E3%82%A4%E3%82%B6%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E5%AD%A6%E7%BF%92%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%3Aparam%20model%3A%20%E5%AD%A6%E7%BF%92%E5%AF%BE%E8%B1%A1%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E3%80%82%0A%20%20%20%20%3Aparam%20train_loader%3A%20%E5%AD%A6%E7%BF%92%E3%83%87%E3%83%BC%E3%82%BF%E7%94%A8%E3%81%AE%20DataLoader%E3%80%82%0A%20%20%20%20%3Aparam%20val_loader%3A%20%E6%A4%9C%E8%A8%BC%E3%83%87%E3%83%BC%E3%82%BF%E7%94%A8%E3%81%AE%20DataLoader%E3%80%82%0A%20%20%20%20%3Aparam%20optimizer%3A%20%E3%83%A2%E3%83%87%E3%83%AB%E9%87%8D%E3%81%BF%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E3%82%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%9E%E3%82%A4%E3%82%B6%E3%80%82%0A%20%20%20%20%3Aparam%20device%3A%20%E5%AD%A6%E7%BF%92%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%EF%BC%88%E4%BE%8B%3A%20'cpu'%20%E3%82%84%20'cuda'%EF%BC%89%E3%80%82%0A%20%20%20%20%3Aparam%20num_epochs%3A%20%E5%AD%A6%E7%BF%92%E3%81%99%E3%82%8B%E3%82%A8%E3%83%9D%E3%83%83%E3%82%AF%E6%95%B0%E3%80%82%0A%20%20%20%20%3Aparam%20eval_freq%3A%20%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E8%A9%95%E4%BE%A1%E3%81%99%E3%82%8B%E9%A0%BB%E5%BA%A6%EF%BC%88%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E5%8D%98%E4%BD%8D%EF%BC%89%E3%80%82%0A%20%20%20%20%3Aparam%20eval_iter%3A%20%E8%A9%95%E4%BE%A1%E3%81%AB%E4%BD%BF%E3%81%86%E3%83%90%E3%83%83%E3%83%81%E6%95%B0%E3%80%82%0A%20%20%20%20%3Areturn%3A%20%E5%AD%A6%E7%BF%92%E6%90%8D%E5%A4%B1%E3%83%BB%E6%A4%9C%E8%A8%BC%E6%90%8D%E5%A4%B1%E3%83%BB%E5%AD%A6%E7%BF%92%E6%AD%A3%E8%A7%A3%E7%8E%87%E3%83%BB%E6%A4%9C%E8%A8%BC%E6%AD%A3%E8%A7%A3%E7%8E%87%E3%83%BB%E5%87%A6%E7%90%86%E6%B8%88%E3%81%BF%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E7%B7%8F%E6%95%B0%E3%81%AE%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%E3%83%AA%E3%82%B9%E3%83%88%E3%82%92%E5%90%AB%E3%82%80%E3%82%BF%E3%83%97%E3%83%AB%E3%80%82%0A%20%20%20%20%22%22%22%0A%20%20%20%20%23%20%E6%90%8D%E5%A4%B1%E3%81%A8%E5%87%A6%E7%90%86%E6%B8%88%E3%81%BF%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E6%95%B0%E3%82%92%E8%A8%98%E9%8C%B2%E3%81%99%E3%82%8B%E3%83%AA%E3%82%B9%E3%83%88%E3%82%92%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%99%E3%82%8B%0A%20%20%20%20train_losses%2C%20val_losses%2C%20train_accs%2C%20val_accs%20%3D%20%5B%5D%2C%20%5B%5D%2C%20%5B%5D%2C%20%5B%5D%0A%20%20%20%20examples_seen%2C%20global_step%20%3D%200%2C%20-1%0A%0A%20%20%20%20%23%20%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E5%AD%A6%E7%BF%92%E3%83%AB%E3%83%BC%E3%83%97%0A%20%20%20%20for%20epoch%20in%20range(num_epochs)%3A%0A%20%20%20%20%20%20%20%20model.train()%20%20%23%20%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E5%AD%A6%E7%BF%92%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AB%E3%81%99%E3%82%8B%0A%0A%20%20%20%20%20%20%20%20for%20input_batch%2C%20target_batch%20in%20train_loader%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20optimizer.zero_grad()%20%23%20%E5%89%8D%E3%81%AE%E3%83%90%E3%83%83%E3%83%81%E5%8F%8D%E5%BE%A9%E3%81%AE%E6%90%8D%E5%A4%B1%E5%8B%BE%E9%85%8D%E3%82%92%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20%20%20%20%20loss%20%3D%20calc_loss_batch(input_batch%2C%20target_batch%2C%20model%2C%20device)%0A%20%20%20%20%20%20%20%20%20%20%20%20loss.backward()%20%23%20%E6%90%8D%E5%A4%B1%E5%8B%BE%E9%85%8D%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20%20%20%20%20optimizer.step()%20%23%20%E6%90%8D%E5%A4%B1%E5%8B%BE%E9%85%8D%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%A2%E3%83%87%E3%83%AB%E9%87%8D%E3%81%BF%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20%20%20%20%20examples_seen%20%2B%3D%20input_batch.shape%5B0%5D%20%23%20%E6%96%B0%E8%A6%8F%3A%20%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E6%95%B0%E3%82%92%E8%A8%98%E9%8C%B2%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20%20%20%20%20global_step%20%2B%3D%201%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E4%BB%BB%E6%84%8F%E3%81%AE%E8%A9%95%E4%BE%A1%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20global_step%20%25%20eval_freq%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20train_loss%2C%20val_loss%20%3D%20evaluate_model(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20model%2C%20train_loader%2C%20val_loader%2C%20device%2C%20eval_iter)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20train_losses.append(train_loss)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20val_losses.append(val_loss)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22Ep%20%7Bepoch%2B1%7D%20(Step%20%7Bglobal_step%3A06d%7D)%3A%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22Train%20loss%20%7Btrain_loss%3A.3f%7D%2C%20Val%20loss%20%7Bval_loss%3A.3f%7D%22)%0A%0A%20%20%20%20%20%20%20%20%23%20%E5%90%84%E3%82%A8%E3%83%9D%E3%83%83%E3%82%AF%E3%81%AE%E5%BE%8C%E3%81%AB%E6%AD%A3%E8%A7%A3%E7%8E%87%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20train_accuracy%20%3D%20calc_accuracy_loader(train_loader%2C%20model%2C%20device%2C%20num_batches%3Deval_iter)%0A%20%20%20%20%20%20%20%20val_accuracy%20%3D%20calc_accuracy_loader(val_loader%2C%20model%2C%20device%2C%20num_batches%3Deval_iter)%0A%20%20%20%20%20%20%20%20print(f%22Training%20accuracy%3A%20%7Btrain_accuracy*100%3A.2f%7D%25%20%7C%20%22%2C%20end%3D%22%22)%0A%20%20%20%20%20%20%20%20print(f%22Validation%20accuracy%3A%20%7Bval_accuracy*100%3A.2f%7D%25%22)%0A%20%20%20%20%20%20%20%20train_accs.append(train_accuracy)%0A%20%20%20%20%20%20%20%20val_accs.append(val_accuracy)%0A%0A%20%20%20%20return%20train_losses%2C%20val_losses%2C%20train_accs%2C%20val_accs%2C%20examples_seen%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%B3%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E7%94%A8%E3%81%AE%E8%A9%95%E4%BE%A1%E9%96%A2%E6%95%B0%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0A%23%20%E7%AC%AC5%E7%AB%A0%E3%81%A8%E5%90%8C%E3%81%98%0Adef%20evaluate_model(model%2C%20train_loader%2C%20val_loader%2C%20device%2C%20eval_iter)%3A%0A%20%20%20%20model.eval()%0A%20%20%20%20with%20torch.no_grad()%3A%0A%20%20%20%20%20%20%20%20train_loss%20%3D%20calc_loss_loader(train_loader%2C%20model%2C%20device%2C%20num_batches%3Deval_iter)%0A%20%20%20%20%20%20%20%20val_loss%20%3D%20calc_loss_loader(val_loader%2C%20model%2C%20device%2C%20num_batches%3Deval_iter)%0A%0A%20%20%20%20model.train()%0A%20%20%20%20return%20train_loss%2C%20val_loss%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%205%E3%82%A8%E3%83%9D%E3%83%83%E3%82%AF%E3%81%A7%E5%AD%A6%E7%BF%92%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E6%AD%A3%E8%A7%A3%E7%8E%87%E3%81%AF90%25%E4%BB%A5%E4%B8%8A%E3%81%AB%E6%94%B9%E5%96%84%E3%81%99%E3%82%8B%E3%80%82RTX3070%20%E3%81%A7%E3%81%8A%E3%82%88%E3%81%9D3%E5%88%86%E3%81%8B%E3%81%8B%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(model%2C%20train_loader%2C%20val_loader)%3A%0A%20%20%20%20_start_time%20%3D%20time.time()%0A%0A%20%20%20%20model.to(device)%0A%20%20%20%20torch.manual_seed(123)%0A%20%20%20%20_optimizer%20%3D%20torch.optim.AdamW(model.parameters()%2C%20lr%3D5e-5%2C%20weight_decay%3D0.1)%0A%20%20%20%20num_epochs%20%3D%205%0A%0A%20%20%20%20train_losses%2C%20val_losses%2C%20train_accs%2C%20val_accs%2C%20examples_seen%20%3D%20train_classifier_simple(%0A%20%20%20%20%20%20%20%20model%2C%20train_loader%2C%20val_loader%2C%20_optimizer%2C%20device%2C%0A%20%20%20%20%20%20%20%20num_epochs%3Dnum_epochs%2C%20eval_freq%3D50%2C%20eval_iter%3D5%2C%0A%20%20%20%20)%0A%0A%20%20%20%20_end_time%20%3D%20time.time()%0A%20%20%20%20_execution_time_minutes%20%3D%20(_end_time%20-%20_start_time)%20%2F%2060%0A%20%20%20%20print(f%22Training%20completed%20in%20%7B_execution_time_minutes%3A.2f%7D%20minutes.%22)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20examples_seen%2C%0A%20%20%20%20%20%20%20%20num_epochs%2C%0A%20%20%20%20%20%20%20%20train_accs%2C%0A%20%20%20%20%20%20%20%20train_losses%2C%0A%20%20%20%20%20%20%20%20val_accs%2C%0A%20%20%20%20%20%20%20%20val_losses%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E6%90%8D%E5%A4%B1%E3%82%92%E3%83%97%E3%83%AD%E3%83%83%E3%83%88%E3%81%97%E3%80%81%E6%90%8D%E5%A4%B1%E3%81%8C%E6%80%A5%E9%80%9F%E3%81%AB%E6%B8%9B%E5%B0%91%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8B%E3%82%89%E3%81%86%E3%81%BE%E3%81%8F%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%80%82%E7%89%B9%E3%81%AB%E6%A4%9C%E8%A8%BC%E6%90%8D%E5%A4%B1%E3%81%AF%E5%AD%A6%E7%BF%92%E6%90%8D%E5%A4%B1%E3%81%A8%E4%BC%BC%E3%81%A6%E3%81%8A%E3%82%8A%E3%80%81%E5%AD%A6%E7%BF%92%E3%81%8C%E9%81%8E%E5%AD%A6%E7%BF%92%E3%82%92%E9%81%BF%E3%81%91%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E7%A4%BA%E3%81%99%E3%80%82%E3%81%93%E3%82%8C%E3%82%89%E3%81%AE%E4%BA%8B%E5%AE%9F%E3%81%8B%E3%82%89%E3%80%81%E3%81%93%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%B3%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AB%E3%81%AF5%E3%82%A8%E3%83%9D%E3%83%83%E3%82%AF%E3%81%A7%E5%8D%81%E5%88%86%E3%81%A0%E3%81%A8%E8%A8%80%E3%81%88%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(data_root)%3A%0A%20%20%20%20def%20plot_values(epochs_seen%2C%20examples_seen%2C%20train_values%2C%20val_values%2C%20label%3D%22loss%22)%3A%0A%20%20%20%20%20%20%20%20fig%2C%20ax1%20%3D%20plt.subplots(figsize%3D(5%2C%203))%0A%0A%20%20%20%20%20%20%20%20%23%20%E5%AD%A6%E7%BF%92%E6%90%8D%E5%A4%B1%E3%81%A8%E6%A4%9C%E8%A8%BC%E6%90%8D%E5%A4%B1%E3%82%92%E3%82%A8%E3%83%9D%E3%83%83%E3%82%AF%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E3%83%97%E3%83%AD%E3%83%83%E3%83%88%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20ax1.plot(epochs_seen%2C%20train_values%2C%20label%3Df%22Training%20%7Blabel%7D%22)%0A%20%20%20%20%20%20%20%20ax1.plot(epochs_seen%2C%20val_values%2C%20linestyle%3D%22-.%22%2C%20label%3Df%22Validation%20%7Blabel%7D%22)%0A%20%20%20%20%20%20%20%20ax1.set_xlabel(%22Epochs%22)%0A%20%20%20%20%20%20%20%20ax1.set_ylabel(label.capitalize())%0A%20%20%20%20%20%20%20%20ax1.legend()%0A%0A%20%20%20%20%20%20%20%20%23%20%E5%87%A6%E7%90%86%E6%B8%88%E3%81%BF%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E6%95%B0%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE2%E3%81%A4%E7%9B%AE%E3%81%AEx%E8%BB%B8%E3%82%92%E4%BD%9C%E3%82%8B%0A%20%20%20%20%20%20%20%20ax2%20%3D%20ax1.twiny()%20%20%23%20%E5%90%8C%E3%81%98y%E8%BB%B8%E3%82%92%E5%85%B1%E6%9C%89%E3%81%99%E3%82%8B2%E3%81%A4%E7%9B%AE%E3%81%AEx%E8%BB%B8%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20ax2.plot(examples_seen%2C%20train_values%2C%20alpha%3D0)%20%20%23%20%E7%9B%AE%E7%9B%9B%E3%82%8A%E3%82%92%E3%81%9D%E3%82%8D%E3%81%88%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E4%B8%8D%E5%8F%AF%E8%A6%96%E3%83%97%E3%83%AD%E3%83%83%E3%83%88%0A%20%20%20%20%20%20%20%20ax2.set_xlabel(%22Examples%20seen%22)%0A%0A%20%20%20%20%20%20%20%20fig.tight_layout()%20%20%23%20%E4%BD%99%E7%99%BD%E3%82%92%E7%A2%BA%E4%BF%9D%E3%81%99%E3%82%8B%E3%82%88%E3%81%86%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%E3%82%92%E8%AA%BF%E6%95%B4%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20plt.savefig(data_root%20%2F%20f%22%7Blabel%7D-plot.pdf%22)%0A%20%20%20%20%20%20%20%20plt.show()%0A%20%20%20%20return%20(plot_values%2C)%0A%0A%0A%40app.cell%0Adef%20_(examples_seen%2C%20num_epochs%2C%20plot_values%2C%20train_losses%2C%20val_losses)%3A%0A%20%20%20%20_epochs_tensor%20%3D%20torch.linspace(0%2C%20num_epochs%2C%20len(train_losses))%0A%20%20%20%20_examples_seen_tensor%20%3D%20torch.linspace(0%2C%20examples_seen%2C%20len(train_losses))%0A%0A%20%20%20%20plot_values(_epochs_tensor%2C%20_examples_seen_tensor%2C%20train_losses%2C%20val_losses)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E6%AD%A3%E8%A7%A3%E7%8E%87%E3%82%82%E3%83%97%E3%83%AD%E3%83%83%E3%83%88%E3%81%99%E3%82%8B%E3%80%82%E3%81%93%E3%82%8C%E3%82%89%E3%81%AE%E8%A9%95%E4%BE%A1%E3%81%AB%E3%81%AF5%E3%83%90%E3%83%83%E3%83%81%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%EF%BC%88%60eval_iter%60%20%E5%BC%95%E6%95%B0%E3%82%92%E5%8F%82%E7%85%A7%EF%BC%89%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(examples_seen%2C%20num_epochs%2C%20plot_values%2C%20train_accs%2C%20val_accs)%3A%0A%20%20%20%20_epochs_tensor%20%3D%20torch.linspace(0%2C%20num_epochs%2C%20len(train_accs))%0A%20%20%20%20_examples_seen_tensor%20%3D%20torch.linspace(0%2C%20examples_seen%2C%20len(train_accs))%0A%0A%20%20%20%20plot_values(_epochs_tensor%2C%20_examples_seen_tensor%2C%20train_accs%2C%20val_accs%2C%20label%3D%22accuracy%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E6%9C%80%E7%B5%82%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%E5%85%A8%E4%BD%93%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E7%B5%90%E6%9E%9C%E3%81%AF%E3%80%81%E6%AD%A3%E8%A7%A3%E7%8E%87%E3%81%8C90%25%E4%BB%A5%E4%B8%8A%E3%81%A7%E3%81%82%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E7%A4%BA%E3%81%99%E3%80%82%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E6%AD%A3%E8%A7%A3%E7%8E%87%E3%81%8C%E4%BB%96%E3%82%88%E3%82%8A%E4%BD%8E%E3%81%84%E3%81%AE%E3%81%AF%E3%80%81%E3%82%8F%E3%81%9A%E3%81%8B%E3%81%AA%E9%81%8E%E5%AD%A6%E7%BF%92%E3%82%92%E7%A4%BA%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%E3%81%93%E3%81%AE%E5%B7%AE%E3%81%AF%E3%80%81%60drop_rate%60%20%E3%82%84%20%60weight_decay%60%20%E3%81%AA%E3%81%A9%E3%81%AE%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E8%AA%BF%E6%95%B4%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E5%8F%96%E3%82%8A%E9%99%A4%E3%81%91%E3%82%8B%E5%8F%AF%E8%83%BD%E6%80%A7%E3%81%8C%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(model%2C%20test_loader%2C%20train_loader%2C%20val_loader)%3A%0A%20%20%20%20_train_accuracy%20%3D%20calc_accuracy_loader(train_loader%2C%20model%2C%20device)%0A%20%20%20%20_val_accuracy%20%3D%20calc_accuracy_loader(val_loader%2C%20model%2C%20device)%0A%20%20%20%20_test_accuracy%20%3D%20calc_accuracy_loader(test_loader%2C%20model%2C%20device)%0A%0A%20%20%20%20print(f%22Training%20accuracy%3A%20%7B_train_accuracy*100%3A.2f%7D%25%22)%0A%20%20%20%20print(f%22Validation%20accuracy%3A%20%7B_val_accuracy*100%3A.2f%7D%25%22)%0A%20%20%20%20print(f%22Test%20accuracy%3A%20%7B_test_accuracy*100%3A.2f%7D%25%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%206.8%20LLM%20%E3%82%92%E3%82%B9%E3%83%91%E3%83%A0%E5%88%86%E9%A1%9E%E5%99%A8%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%BF%E3%81%86%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%85%A5%E5%8A%9B%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%8C%20spam%20%E3%81%8B%20ham%20%E3%81%8B%E3%82%92%E5%88%A4%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E5%89%8D%E5%87%A6%E7%90%86%E3%83%BB%E6%8E%A8%E8%AB%96%E3%83%BB%E5%BE%8C%E5%87%A6%E7%90%86%E3%82%92%E8%A1%8C%E3%81%86%E9%96%A2%E6%95%B0%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20classify_review(text%2C%20model%2C%20tokenizer%2C%20device%2C%20max_length%3DNone%2C%20pad_token_id%3D50256)%3A%0A%20%20%20%20%22%22%22%0A%20%20%20%20%E4%B8%8E%E3%81%88%E3%82%89%E3%82%8C%E3%81%9F%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A8%E3%83%88%E3%83%BC%E3%82%AF%E3%83%8A%E3%82%A4%E3%82%B6%E3%83%BC%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%80%81%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%20%22spam%22%20%E3%81%8B%20%22not%20spam%22%20%E3%81%AB%E5%88%86%E9%A1%9E%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%3Aparam%20text%3A%20%E5%88%86%E9%A1%9E%E5%AF%BE%E8%B1%A1%E3%81%AE%E5%85%A5%E5%8A%9B%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%80%82%0A%20%20%20%20%3Aparam%20model%3A%20%E5%AD%A6%E7%BF%92%E6%B8%88%E3%81%BF%E3%81%AE%E5%88%86%E9%A1%9E%E3%83%A2%E3%83%87%E3%83%AB%E3%80%82%0A%20%20%20%20%3Aparam%20tokenizer%3A%20%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E3%83%88%E3%83%BC%E3%82%AF%E3%83%8A%E3%82%A4%E3%82%B6%E3%83%BC%E3%80%82%0A%20%20%20%20%3Aparam%20device%3A%20%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%EF%BC%88%E4%BE%8B%3A%20%22cpu%22%20%E3%82%84%20%22cuda%22%EF%BC%89%E3%80%82%0A%20%20%20%20%3Aparam%20max_length%3A%20%E5%85%A5%E5%8A%9B%E7%B3%BB%E5%88%97%E3%81%AE%E6%9C%80%E5%A4%A7%E9%95%B7%E3%80%82None%20%E3%81%AE%E5%A0%B4%E5%90%88%E3%81%AF%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E9%95%B7%E3%82%92%E4%BD%BF%E3%81%86%E3%80%82%0A%20%20%20%20%3Aparam%20pad_token_id%3A%20%E7%B3%BB%E5%88%97%E3%81%AE%E3%83%91%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AB%E4%BD%BF%E3%81%86%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3ID%E3%80%82%0A%20%20%20%20%3Areturn%3A%20%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%8C%20spam%20%E3%81%A8%E5%88%86%E9%A1%9E%E3%81%95%E3%82%8C%E3%82%8C%E3%81%B0%20%22spam%22%E3%80%81%E3%81%9D%E3%81%86%E3%81%A7%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%20%22not%20spam%22%E3%80%82%0A%20%20%20%20%22%22%22%0A%20%20%20%20model.eval()%0A%0A%20%20%20%20%23%20%E3%83%A2%E3%83%87%E3%83%AB%E3%81%B8%E3%81%AE%E5%85%A5%E5%8A%9B%E3%82%92%E6%BA%96%E5%82%99%E3%81%99%E3%82%8B%0A%20%20%20%20input_ids%20%3D%20tokenizer.encode(text)%0A%20%20%20%20supported_context_length%20%3D%20model.pos_emb.weight.shape%5B0%5D%0A%20%20%20%20%23%20%E6%B3%A8%E6%84%8F%3A%20%E6%9C%AC%E6%9B%B8%E3%81%A7%E3%81%AF%E5%85%83%E3%80%85%E3%80%81%E8%AA%A4%E3%81%A3%E3%81%A6%20pos_emb.weight.shape%5B1%5D%20%E3%81%A8%E6%9B%B8%E3%81%8B%E3%82%8C%E3%81%A6%E3%81%84%E3%81%9F%0A%20%20%20%20%23%20%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E5%A3%8A%E3%82%8C%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%8C%E3%80%81%E4%B8%8D%E8%A6%81%E3%81%AA%E5%88%87%E3%82%8A%E8%A9%B0%E3%82%81%EF%BC%881024%20%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%20768%20%E3%81%B8%EF%BC%89%E3%81%8C%E8%B5%B7%E3%81%8D%E3%81%A6%E3%81%84%E3%81%9F%0A%0A%20%20%20%20%23%20%E7%B3%BB%E5%88%97%E3%81%8C%E9%95%B7%E3%81%99%E3%81%8E%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%E5%88%87%E3%82%8A%E8%A9%B0%E3%82%81%E3%82%8B%0A%20%20%20%20input_ids%20%3D%20input_ids%5B%3Amin(max_length%2C%20supported_context_length)%5D%0A%20%20%20%20assert%20max_length%20is%20not%20None%2C%20(%0A%20%20%20%20%20%20%20%20%22max_length%20must%20be%20specified.%20If%20you%20want%20to%20use%20the%20full%20model%20context%2C%20%22%0A%20%20%20%20%20%20%20%20%22pass%20max_length%3Dmodel.pos_emb.weight.shape%5B0%5D.%22%0A%20%20%20%20)%0A%20%20%20%20assert%20max_length%20%3C%3D%20supported_context_length%2C%20(%0A%20%20%20%20%20%20%20%20f%22max_length%20(%7Bmax_length%7D)%20exceeds%20model's%20supported%20context%20length%20(%7Bsupported_context_length%7D).%22%0A%20%20%20%20)%20%20%20%20%0A%20%20%20%20%23%20%E3%81%82%E3%82%8B%E3%81%84%E3%81%AF%E3%80%81%E3%82%88%E3%82%8A%E9%A0%91%E5%81%A5%E3%81%AA%E7%89%88%E3%81%AF%E6%AC%A1%E3%81%AE%E9%80%9A%E3%82%8A%E3%81%A7%E3%80%81max_length%3DNone%20%E3%81%AE%E5%A0%B4%E5%90%88%E3%82%92%E3%82%88%E3%82%8A%E3%81%86%E3%81%BE%E3%81%8F%E6%89%B1%E3%81%88%E3%82%8B%0A%20%20%20%20%23%20max_len%20%3D%20min(max_length%2Csupported_context_length)%20if%20max_length%20else%20supported_context_length%0A%20%20%20%20%23%20input_ids%20%3D%20input_ids%5B%3Amax_len%5D%0A%0A%20%20%20%20%23%20%E6%9C%80%E9%95%B7%E3%81%AE%E7%B3%BB%E5%88%97%E3%81%AB%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6%E7%B3%BB%E5%88%97%E3%82%92%E3%83%91%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B%0A%20%20%20%20input_ids%20%2B%3D%20%5Bpad_token_id%5D%20*%20(max_length%20-%20len(input_ids))%0A%20%20%20%20input_tensor%20%3D%20torch.tensor(input_ids%2C%20device%3Ddevice).unsqueeze(0)%20%23%20%E3%83%90%E3%83%83%E3%83%81%E6%AC%A1%E5%85%83%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%0A%0A%20%20%20%20%23%20%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E6%8E%A8%E8%AB%96%0A%20%20%20%20with%20torch.no_grad()%3A%0A%20%20%20%20%20%20%20%20logits%20%3D%20model(input_tensor)%5B%3A%2C%20-1%2C%20%3A%5D%20%20%23%20%E6%9C%80%E5%BE%8C%E3%81%AE%E5%87%BA%E5%8A%9B%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E3%83%AD%E3%82%B8%E3%83%83%E3%83%88%0A%20%20%20%20predicted_label%20%3D%20torch.argmax(logits%2C%20dim%3D-1).item()%0A%0A%20%20%20%20%23%20%E5%88%86%E9%A1%9E%E7%B5%90%E6%9E%9C%E3%82%92%E8%BF%94%E3%81%99%0A%20%20%20%20return%20%22spam%22%20if%20predicted_label%20%3D%3D%201%20else%20%22not%20spam%22%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%81%AF%20spam%20%E3%81%AE%E4%BE%8B%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(model%2C%20tokenizer%2C%20train_dataset)%3A%0A%20%20%20%20_text_1%20%3D%20(%0A%20%20%20%20%20%20%20%20%22You%20are%20a%20winner%20you%20have%20been%20specially%22%0A%20%20%20%20%20%20%20%20%22%20selected%20to%20receive%20%241000%20cash%20or%20a%20%242000%20award.%22%0A%20%20%20%20)%0A%0A%20%20%20%20print(classify_review(%0A%20%20%20%20%20%20%20%20_text_1%2C%20model%2C%20tokenizer%2C%20device%2C%20max_length%3Dtrain_dataset.max_length%0A%20%20%20%20))%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%81%AF%20ham%20%E3%81%AE%E4%BE%8B%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(model%2C%20tokenizer%2C%20train_dataset)%3A%0A%20%20%20%20_text_2%20%3D%20(%0A%20%20%20%20%20%20%20%20%22Hey%2C%20just%20wanted%20to%20check%20if%20we're%20still%20on%22%0A%20%20%20%20%20%20%20%20%22%20for%20dinner%20tonight%3F%20Let%20me%20know!%22%0A%20%20%20%20)%0A%0A%20%20%20%20print(classify_review(%0A%20%20%20%20%20%20%20%20_text_2%2C%20model%2C%20tokenizer%2C%20device%2C%20max_length%3Dtrain_dataset.max_length%0A%20%20%20%20))%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%B3%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%AF%E3%80%81%E3%81%93%E3%82%8C%E3%81%A7%E4%BF%9D%E5%AD%98%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(model%2C%20project_root)%3A%0A%20%20%20%20fine_model_path%20%3D%20project_root%20%2F%20%22models%22%20%2F%20%22ch06%22%0A%20%20%20%20fine_model_path.mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%20%20%20%20torch.save(model.state_dict()%2C%20fine_model_path%20%2F%20%22review_classifier.pth%22)%0A%20%20%20%20return%20(fine_model_path%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%81%9D%E3%81%97%E3%81%A6%E3%80%81%E3%81%93%E3%82%8C%E3%81%A7%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%81%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(fine_model_path%2C%20model)%3A%0A%20%20%20%20_model_state_dict%20%3D%20torch.load(fine_model_path%20%2F%20%22review_classifier.pth%22%2C%20map_location%3Ddevice%2C%20weights_only%3DTrue)%0A%20%20%20%20model.load_state_dict(_model_state_dict)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
30b33b54ac0f2756c38a8425196a2be6