質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Python 3.x

    9857questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Chainer

    208questions

    Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

Pythonのlist.sort()でエラー

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 749

lefirea

score 10

 前提・実現したいこと

技術評論社の「はじめての深層学習プログラミング」に沿って深層学習を勉強中です。
同本の80ページにあるサンプルプログラムをそのまま書き写しています。

 発生している問題・エラーメッセージ

発生している問題は2つあります。
一つは書いている途中で下記コードの48行目で次のようなエラーが出ます。

undefined name 'cmp'

また、それを無視して実行すると、次のようなエラーが出ました。

Traceback (most recent call last):

  File "<ipython-input-1-4ff9c2ad1dbb>", line 1, in <module>
    runfile('C:/Python_Programs/Deep_Learning/de_le1.py', wdir='C:/Python_Programs/Deep_Learning')

  File "C:\Users\user\Anaconda3\envs\myTensorFlow\lib\site-packages\spyder\utils\site\sitecustomize.py", line 710, in runfile
    execfile(filename, namespace)

  File "C:\Users\user\Anaconda3\envs\myTensorFlow\lib\site-packages\spyder\utils\site\sitecustomize.py", line 101, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Python_Programs/Deep_Learning/de_le1.py", line 10, in <module>
    import cPickle as pickle

ModuleNotFoundError: No module named 'cPickle'

 該当のソースコード

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

import numpy as np
import chainer
import chainer.functions as cFunc
import chainer.links as cLink
import argparse
import sys
from PIL import Image
import cPickle as pickle
import math
from chainer import serializers

parser=argparse.ArgumentParser(description='Image inspection using chainer')
parser.add_argument('image',help='Path to inspection image file')
parser.add_argument('--model',default='model.h5',help='Path of the mean file (computed by compue_mean.py)')
parser.add_argument('--mean',default='mean.npy',help='Path of the mean file (computed by compue_mean.py)')
args=parser.parse_args()

def read_image(path):
    image=np.asarray(Image.open(path)).transpose(2,0,1)
    top=left=cropwidth/2
    bottom=model.insize+top
    right=model.insize+left
    image=image[:,top:bottom,left:right].astype(np.float32)
    image-=mean_image[:,top:bottom,left:right]
    image/=255
    return image

import network

mean_image=pickle.load(open(args.mean,'rb'))

model=network.Network()
serializers.load_hdf5(args.model,model)
cropwidth=256-model.insize
model.to_cpu()
model.train=False

img=read_image(args.image)

score=model.predict(np.array([img]))

categories=np.loadtxt("labels.txt",str,delimiter="/t")

top_k=20
prediction=zip(score.data[0].tolist(),categories)
prediction.sort(cmp=lambda x,y:cmp(x[0],y[0]),reverse=True) #ここでcmpのエラー発生

for rank,(score,name) in enumerate(prediction[:top_k],start=1):
    print('#%d | %s | %4.1f%%' % (rank,name,score*100))

 試したこと

この本はところどころ情報が古かったので、今回もそれの可能性があった。
で、調べてみたが特にそういった記述は見つからなかった。
入力ミスも考えたが、特に見つけられなかった。

 補足情報(FW/ツールのバージョンなど)

使用した環境はWindows10、Anaconda3.6

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

Python3からsortのインターフェースが変わりました。
cmp(比較方法)ではなくkey(比較対象)を指定する必要があります。

次のように指定すればよいかと。

from operator import itemgetter

...

prediction.sort(key=itemgetter(0), reverse=True)

itemgetterを利用しているのは、処理を効率化するためです。
次のように書いてもかまいません。

prediction.sort(key=lambda x: x[0], reverse=True)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/15 00:26

    回答ありがとうございました。
    教えていただいた方法でうまく動きました。

    キャンセル

0

zip の戻り値は Python3 で list からイテレータに変更されました。
sort() は list のメソッドなので list() で括って list 化してみたらどうでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/14 19:30

    こうすれば良いのですか?
    prediction=list(zip(score.data[0].tolist(),categories))

    キャンセル

0

  • zipの結果をlist化
  • list.sort()をscoreを使ってソート
    だと理解しました。次のようにためしてみてください。cmpはたぶんかなり古く、私は使い方を知らないので、結果が狙い通りになっているかちょっと自信がないです。
prediction=list(zip(score.data[0].tolist(),categories))
prediction.sort(key=lambda x:x[0],reverse=True) #ここでcmpのエラー発生

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/15 00:26

    回答ありがとうございました。
    教えていただいた方法でうまく動きましたが、今回は時間差でBAの人を決めさせてもらいました。

    キャンセル

同じタグがついた質問を見る

  • Python 3.x

    9857questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Chainer

    208questions

    Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。