PyTorch 설치 및 Jupyter 등록

  • 환경은 Windows 10, Anaconda를 사용하고 있습니다.

  • conda create -y -n pytorch ipykernel

  • activate pytorch

  • PyTorch 링크를 보고 자신한테 맞는 환경을 골라 명령어를 입력한다.

  • conda install pytorch cuda90 -c pytorch

  • pip install torchvision

  • 설치가 완료되면 예제 코드를 다운받아 실행 시킨다.

  • python tensor_tutorial.py

  • 제대로 실행되면 pytorch 설치가 완료된 것이다.

  • 주피터에 등록을 하기 위해선 다음 명령을 입력한다.

    • python -m ipykernel install --user --name pytorch --display-name "PyTorch"

tensor_tutorial.py

# -*- coding: utf-8 -*-
"""
What is PyTorch?
================

It’s a Python-based scientific computing package targeted at two sets of
audiences:

-  A replacement for NumPy to use the power of GPUs
-  a deep learning research platform that provides maximum flexibility
   and speed

Getting Started
---------------

Tensors
^^^^^^^

Tensors are similar to NumPy’s ndarrays, with the addition being that
Tensors can also be used on a GPU to accelerate computing.
"""

from __future__ import print_function
import torch

###############################################################
# Construct a 5x3 matrix, uninitialized:

x = torch.empty(5, 3)
print(x)

###############################################################
# Construct a randomly initialized matrix:

x = torch.rand(5, 3)
print(x)

###############################################################
# Construct a matrix filled zeros and of dtype long:

x = torch.zeros(5, 3, dtype=torch.long)
print(x)

###############################################################
# Construct a tensor directly from data:

x = torch.tensor([5.5, 3])
print(x)

###############################################################
# or create a tensor based on an existing tensor. These methods
# will reuse properties of the input tensor, e.g. dtype, unless
# new values are provided by user

x = x.new_ones(5, 3, dtype=torch.double)      # new_* methods take in sizes
print(x)

x = torch.randn_like(x, dtype=torch.float)    # override dtype!
print(x)                                      # result has the same size

###############################################################
# Get its size:

print(x.size())

###############################################################
# .. note::
#     ``torch.Size`` is in fact a tuple, so it supports all tuple operations.
#
# Operations
# ^^^^^^^^^^
# There are multiple syntaxes for operations. In the following
# example, we will take a look at the addition operation.
#
# Addition: syntax 1
y = torch.rand(5, 3)
print(x + y)

###############################################################
# Addition: syntax 2

print(torch.add(x, y))

###############################################################
# Addition: providing an output tensor as argument
result = torch.empty(5, 3)
torch.add(x, y, out=result)
print(result)

###############################################################
# Addition: in-place

# adds x to y
y.add_(x)
print(y)

###############################################################
# .. note::
#     Any operation that mutates a tensor in-place is post-fixed with an ``_``.
#     For example: ``x.copy_(y)``, ``x.t_()``, will change ``x``.
#
# You can use standard NumPy-like indexing with all bells and whistles!

print(x[:, 1])

###############################################################
# Resizing: If you want to resize/reshape tensor, you can use ``torch.view``:
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)  # the size -1 is inferred from other dimensions
print(x.size(), y.size(), z.size())

###############################################################
# If you have a one element tensor, use ``.item()`` to get the value as a
# Python number
x = torch.randn(1)
print(x)
print(x.item())

###############################################################
# **Read later:**
#
#
#   100+ Tensor operations, including transposing, indexing, slicing,
#   mathematical operations, linear algebra, random numbers, etc.,
#   are described
#   `here <http://pytorch.org/docs/torch>`_.
#
# NumPy Bridge
# ------------
#
# Converting a Torch Tensor to a NumPy array and vice versa is a breeze.
#
# The Torch Tensor and NumPy array will share their underlying memory
# locations, and changing one will change the other.
#
# Converting a Torch Tensor to a NumPy Array
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

a = torch.ones(5)
print(a)

###############################################################
#

b = a.numpy()
print(b)

###############################################################
# See how the numpy array changed in value.

a.add_(1)
print(a)
print(b)

###############################################################
# Converting NumPy Array to Torch Tensor
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# See how changing the np array changed the Torch Tensor automatically

import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a)
print(b)

###############################################################
# All the Tensors on the CPU except a CharTensor support converting to
# NumPy and back.
#
# CUDA Tensors
# ------------
#
# Tensors can be moved onto any device using the ``.to`` method.

# let us run this cell only if CUDA is available
# We will use ``torch.device`` objects to move tensors in and out of GPU
if torch.cuda.is_available():
    device = torch.device("cuda")          # a CUDA device object
    y = torch.ones_like(x, device=device)  # directly create a tensor on GPU
    x = x.to(device)                       # or just use strings ``.to("cuda")``
    z = x + y
    print(z)
    print(z.to("cpu", torch.double))       # ``.to`` can also change dtype together!

이 페이지를 번역했습니다.

당신도 개발의 희생자가 될 수 있다.

by Jon Evans

개발자들에게:

3가지 기기 제품군에서 사용되는 8가지 프로그래밍 언어에만 능숙해서 불안한가요?
또 다른 JavaScript framework에 대한 노출이 당신을 두렵게 만드나요?
어떤 클라우드 플랫폼이 적절할지 몰라서 pet project를 연기 해본적이 있나요?

당신은 또한 Developaralysis로 고통받을 것입니다.

Be afraid. There is no cure.

오늘날 개발자들이 이용할 수 있는 선택사항들은 터무니없다. We're choking on a cornucopia. 지난 몇년동안 저는 다양한 SQL / key-value / document datastores (MySQL, PostgreSQL, MongoDB, BigTable, Redis, Memcached, etc.)를 기반으로 Java, Objective-C, C, C++, Python, Ruby, JavaScript, PHP를 작성해서 돈을 받았다. 하지만 저는 만족하지 않습니다. 저는 Erlang, Clojure, Rust, Go, C#, Scala, Haskell, Julia, Scheme, Swift 또는 OCaml으로 아무것도 하지 않은 것에 대해 죄책감을 느낍니다.

저는 Developaralysis의 희생자입니다. (Developaralysis: 소프트웨어 산업이 너무 빨리 발전해서 아무도 따라갈 수 없다는 암울한 느낌)

거의 모든 언어를 사용하고 다양한 framework와 toolkit 및 library를 사용할 수 있도록 해야합니다. 머리가 터질 정도로. 오늘날 JavaScript framework와 library 확장에 대한 제대로된 평가를 완료하는데 몇달이 걸 릴 것입니다. 당신은 Ruby gem이 얼마나 있는지 압니까? 아니면 iOS framework는요? NewSQL / NoSQL datastores는요? 그리고 심지어 Hadoop vs Spark vs Google Dataflow 또는 Avro vs Thrift vs protocol buffer ... 도 있다.

적어도 모바일에서는 Andorid, iOS로 축소되었지만, Xamarin 또는 PhoneGap, Sencha와 같은 식으로 크로스 플랫폼 HTML과 같은 crossover 대안을 숨기지만, 백엔드를 배치하는 위치와 방법을 파악해야한다. Heroku, Amazon Web Services, Google App Engine, Google Compute Engine 및 Parse에 배포된 시스템에서 작업했다. 실제로 OpenStack, Force.com, Azure, AppFog, 실제로 제가 사용해본적 없는 수많은 AWS 서비스에 대해 거의 알지 못한다고 느끼게한다.

오늘날 개발자들은 사용 가능한 옵션이 너무 많아서, Tool의 목록을 관리하기 위해서 Bundler, Bower, CocoaPods, Pip 등과 같은 다른 Tools를 사용하고 있다. 그런 다음 다른 Tools를 사용하기 시작한다.

슬픈 사실은 오늘날 개발자들이 사용할 수 있는 언어, Tools, framework 및 플랫폼이 엄청난게 많다는 것이다. 물론 아무도 이것을 인정하고 싶어하지만 진실은 우리 모두가 Developaralysis에 고통받고 있다는 것이다.

정보에 입각한 결정을 내리는데 필요한 정보를 모으는 것 조차도 비생산적이다. 프로젝트에 착수하기 전에 실제로 모든 가능성을 분석하고 그 결과로 얻은 학습 곡선을 올린다면 PHP와 Swift를 사용하여 10대 청소년이 시장에 맞을 수 있게 된다.

하지만 다른 한편으로는 Swift와 PHP에 정착하면 Paul Graham이 Lisp에서 했던 방식으로 당신은 어떤 닌자 C# / Haskell 프로그래머가 주위에 링을 돌고 있는 공포에 떨 수 있습니다.

기술은 선택할때, 당신은 다른 사람이 했던 것을 무시해야합니다. 가장 일을 잘 수행할 것을 고려해야합니다. 사실 우리는 비밀스런 무기를 가지고 있었습니다. 우리는 누군가가 생각한 것보다 빠르게 소프트웨어를 개발할 수 있었습니다. 우리는 이상한 AI 언어로 우리의 소프트웨어를 괄호로 가득 찬 기괴한 구문으로 작성했습니다.

따라서, Developaralysis. 학습 곡선을 포기하지 않고 지금 이동할 수 있기 때문에 우리가 이미 알고 있는 것을 선택합니까? 누군가의 다른 사람이 그것을 더 잘, 더 빨리 다룬다는 공포에 살고 있다. 우리의 기술이 내년에 쓸모 없어지고 경쟁력이 떨어집니까? 우리가 배우는 것을 좋아하고 더 나은 도구가 더 재미있고 큰 경쟁 우위를 가지고 있기 때문에 상당한 시간, 노력을 희생해서 지식을 늘립니까?

BOJ 16397번 탈출 문제

2018 홍익대학교 컴퓨터공학과 코딩대회 D번 문제이다.

또 문제를 잘 못 봤다. 제일 높은 자리수 1을 빼는게 각 자리를 비교해서 가장 큰 수를 뺴는 걸로 생각했다.

왜 더 어렵게 생각해서 구현도 복잡하고 시간도 더 낭비했는지..

이런 것도 다 실력이니 이런 실수를 줄이는 노력을 해야겠다.

문제는 BFS로 풀면 된다.

16397.cpp

#include <bits/stdc++.h>
using namespace std;
bool visited[100000];
int po(int n) {
    int nn = 1;
    for (int i = 0; i < n; i++) {
        nn *= 10;
    }
    return nn;
}
int B(int i) {
    if (i == 0) {
        return i;
    }
    int originI = i * 2;
    i = originI;
    int t = 0;
    while (i > 0) {
        t++;
        i /= 10;
    }
    originI -= po(t - 1);
    return originI;
}

int main() {
    int n, t, g;
    cin >> n >> t >> g;
    queue<pair<int, int> > q;
    visited[n] = true;
    q.push({n, 0});

    while (!q.empty()) {
        int now = q.front().first;
        int cnt = q.front().second;
        q.pop();

        if (cnt > t) {
            cout << "ANG";
            return 0;
        }
        if (now == g) {
            cout << cnt;
            return 0;
        }

        if ((now + 1 <= 99999) && !visited[now + 1]) {
            q.push({now + 1, cnt + 1});
            visited[now + 1] = true;
        }
        int next = B(now);
        if ((now * 2 <= 99999) && !visited[next]) {
            q.push({next, cnt + 1});
            visited[next] = true;
        }
    }
    cout << "ANG";
}

BOJ 16396번 선 그리기 문제

2018 홍익대학교 컴퓨터공학과 코딩대회 C번 문제이다.

분명 간단하게 풀 수 있는데, 선분의 길이가 아니라 거치는 정점의 개수로 생각해서 2번이나 틀렸다.

왜 그렇게 생각했는지 모르겠는데, 1~9가 들어오면 9에도 true값을 했다.

16396.cpp

#include <bits/stdc++.h>
using namespace std;
bool l[100001];
int main() {
    int n;
    cin >> n;
    while (n--) {
        int a, b;
        cin >> a >> b;
        for (int i = a; i < b; i++) {
            l[i] = true;
        }
    }
    int c = 0;
    for (int i = 1; i <= 100000; i++) {
        if (l[i]) {
            c++;
        }
    }
    cout << c;
}

BOJ 16395번 파스칼의 삼각형 문제

2018 홍익대학교 컴퓨터공학과 코딩대회 B번 문제이다.

간단한 DP 문제였다.

DP로 풀면 되는 걸 알고 있어서 어렵지 않게 풀 수 있었다.

16395.cpp

#include <bits/stdc++.h>
using namespace std;
int d[31][31];
int main() {
    for (int i = 0; i < 31; i++) {
        d[i][0] = 1;
    }
    for (int i = 1; i < 31; i++) {
        for (int j = 1; j <= i; j++) {
            d[i][j] = d[i - 1][j - 1] + d[i - 1][j];
        }
    }
    int a, b;
    cin >> a >> b;
    cout << d[a - 1][b - 1] << '\n';
}

+ Recent posts