🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Spyder

Spyderとは、Pythonで分析するために作られたIDEです。プログラムの編集・実行・入力補完・デバッグなどの基本的なIDE機能の他、科学用途の計算をするために要するライブラリも装備。公式・サードパーティ製のプラグインもあり、機能を拡張することもできます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

6925閲覧

invalid index to scalar variable.の解決

nazuna00

総合スコア1

Spyder

Spyderとは、Pythonで分析するために作られたIDEです。プログラムの編集・実行・入力補完・デバッグなどの基本的なIDE機能の他、科学用途の計算をするために要するライブラリも装備。公式・サードパーティ製のプラグインもあり、機能を拡張することもできます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/12/19 03:41

編集2020/12/19 08:00

欠損画像を作りたいのですがエラーが生じてしまいます…

#該当コード
from keras import layers
from keras import models
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
import numpy as np

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255

test_images_noisy = test_images[:, 13:15, 13:15, 0]=0
test_images_noisy =test_images_noisy.astype('float32') / 255

#エラー
File "C:\Users\user.spyder-py3\untitled6.py", line 27, in <module>
test_images_noisy =test_images_noisy.astype('float32') / 255

AttributeError: 'int' object has no attribute 'astype'

最後の行でエラーが出ているのですが解決方法がわかりません。
どなたかわかるかたいらっしゃったらお願いします。

#追記
(題名変えました)
前半に続くコードです。

def create_model():
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), padding='same', activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2), padding='same'))
model.add(layers.Conv2D(16, (3, 3), padding='same', activation='relu'))
model.add(layers.MaxPooling2D((2, 2), padding='same'))
model.add(layers.Conv2D(8, (3, 3), padding='same', activation='relu'))
model.add(layers.MaxPooling2D((2, 2), padding='same'))

model.add(layers.Conv2D(8, (3, 3), padding='same', activation='relu')) model.add(layers.UpSampling2D((2, 2))) model.add(layers.Conv2D(16, (3, 3), padding='same', activation='relu')) model.add(layers.UpSampling2D((2, 2))) model.add(layers.Conv2D(32, (3, 3), activation='relu')) model.add(layers.UpSampling2D((2, 2))) model.add(layers.Conv2D(1, (3, 3), padding='same', activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='sgd') return model

model = create_model()

def show_result(j):
results = model.predict(test_images_noisy_2[j:j+10])

fig = plt.figure(figsize=(16, 2.7)) for i in range(10): subplot = fig.add_subplot(3, 10, i+1) subplot.set_xticks([]) subplot.set_yticks([]) subplot.imshow(test_images_noisy_2[j+i, :, :, 0], vmin=0, vmax=1, cmap=plt.cm.gray_r) subplot = fig.add_subplot(3, 10, i+11) subplot.set_xticks([]) subplot.set_yticks([]) subplot.imshow(results[i, :, :, 0], vmin=0, vmax=1, cmap=plt.cm.gray_r) subplot = fig.add_subplot(3, 10, i+21) subplot.set_xticks([]) subplot.set_yticks([]) subplot.imshow(np.abs(test_images_noisy_2[j+i, :, :, 0]-results[i, :, :, 0]), vmin=0, vmax=1, cmap=plt.cm.gray_r)

train_num = 10

learn = model.fit(train_images[:30000], train_images[:30000], batch_size=16, epochs=1)

model.save('cnn_auto_model_noisy.h5')

#実行結果
ここでshow_result(0)で実行すると

runfile('C:/Users/user/.spyder-py3/untitled6.py', wdir='C:/Users/user/.spyder-py3')
Epoch 1/1
30000/30000 [==============================] - 71s 2ms/step - loss: 0.2707

show_result(0)
Traceback (most recent call last):

File "<ipython-input-100-84299c05f901>", line 1, in <module>
show_result(0)

File "C:\Users\user.spyder-py3\untitled6.py", line 60, in show_result

IndexError: invalid index to scalar variable.

がでてしまいます。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2020/12/19 05:57

エラーが出た後に下記を実行してみて、その結果を見て考えてみてください type(test_images) type(test_images_noisy) print(test_images_noisy)
nazuna00

2020/12/19 07:30

type(test_images) Out[84]: numpy.ndarray type(test_images_noisy) Out[85]: int print(test_images_noisy) 0 ご指摘通り実行したら以上の結果が出ました。 intからnumpy.ndarrayの形に変えようとして test_images_noisy = np.array(test_images[:, 13:15, 13:15, 0]=0,dtype='int32') としてみたのですが SyntaxError: keyword can't be an expression のエラーが出てしまいました…
nazuna00

2020/12/19 07:54

重ね重ねすみません test_images_noisy = test_images[:, 13:15, 13:15, 0]=0 test_images_noisy = np.array(test_images_noisy,dtype='int32') test_images_noisy_2 =test_images_noisy.astype('float32') / 255 にすると type(test_images_noisy) Out[101]: numpy.ndarray type(test_images_noisy_2) Out[102]: numpy.float64 となりました。 その先でまたエラーが起きてしまったので質問欄のほうで追記させていただきます。
jbpb0

2020/12/19 08:24

> print(test_images_noisy) > 0 0という値が一個だけですけど、作りたいものはそれで合ってますか? 配列を作りたいのではないのですか?
nazuna00

2020/12/19 09:19

作りたいのは配列です。 画像データを一部、白く塗りつぶしたいのですがうまくいかないです。
jbpb0

2020/12/19 09:28

それは、 test_images_noisy = test_images[:, 13:15, 13:15, 0]=0 が間違っているからです そこを直さずに、その後に小細工しても、直りません
nazuna00

2020/12/19 09:46

すぐに返答をくださってありがとうございます。 そこの文が駄目なんですね… もうちょっと考えてみます。
nazuna00

2020/12/20 06:38

結局、よくわからなかったので再度質問を上げなおそうかと思います。 ありがとうございました。
jbpb0

2020/12/20 13:27 編集

その行でやろうとしている処理を、二つに分けて考えてみてください 一つ目は、test_images_noisyにtest_imagesをコピーする コピーですから、データは全部同じになるので、配列ができます 二つ目は、test_images_noisyの一部に白を代入する 二つをいっぺんにやろうとしないで、一つずつやる(行も分ける)
jbpb0

2020/12/20 09:18 編集

あと、0を代入したら黒になります 白は255です(8bit画像の場合) 【追記】訂正します test_imagesは既に.astype('float32') / 255によって、値の範囲が0~255から0.0~1.0に変わっています それをコピーしたtest_images_noisyも値の範囲は0.0~1.0なので、白は255ではなく1.0です
nazuna00

2020/12/20 07:38 編集

test_images_noisy = np.copy(test_images) test_images_noisy = test_images_noisy[:, 13:15, 13:15, 255] test_images_noisy = test_images_noisy.astype('float32') / 255 こんなかんじでしょうか?
nazuna00

2020/12/20 07:41

show_result(0) で too many indices for array: array is 3-dimensional, but 4 were indexed のエラーがでてしまいます…
jbpb0

2020/12/20 09:49 編集

二つ目は間違ってます 下記は左上の3x3画素を白くする例です 一つ目の直後に下記3行を追加して実行してみて、その結果表示を見て確認してください print(test_images_noisy[0:3, 0:5, 0:5, 0]) # 元々は左上は黒(0.0)であることを確認 test_images_noisy[:, 0:3, 0:3, 0] = 1.0 # 左上3x3画素に白(1.0)を代入 print(test_images_noisy[0:3, 0:5, 0:5, 0]) # 白が代入されたことを確認 なお、上のコメントの追記にも書きましたが、白は255ではなく1.0です (失礼しました) 三つめは不要です やはり上のコメントの追記に書いたように、test_imagesをコピーしてtest_images_noisyを作った時点で、既に値の範囲が0.0~1.0だからです
jbpb0

2020/12/20 09:58

あと、質問にpythonのコードを貼る場合は、pythonのコードの一番最初の行のすぐ上に ```python だけの行を追加してください また、pythonのコードの一番最後の行のすぐ下に ``` だけの行を追加してください そうすれば、コードのインデントが残った状態で表示されるので、コードが読みやすくなります 現状は、インデントが全部消えているため、とても読み辛いです
nazuna00

2020/12/20 10:02

できました! 丁寧に教えてくださってありがとうございました また、根気強く教えてくださってありがとうございました
guest

回答2

0

python

1print(test_images_noisy)

をエラーが出た後に実行したらわかるように、0という値が一個だけですけど、作りたいものはそれで合ってますか?
配列を作りたいのではないのですか?

python

1test_images_noisy = test_images[:, 13:15, 13:15, 0]=0

が間違ってます
その行でやろうとしている処理を、二つに分けて考えてみてください
二つをいっぺんにやろうとしないで、一つずつやる(行も分ける)

一つ目は、test_images_noisyにtest_imagesをコピーする
コピーですから、データは全部同じになるので、配列ができます

二つ目は、test_images_noisyの一部に白を代入する
下記は左上の3x3画素を白くする例です

python

1print(test_images_noisy[0:3, 0:5, 0:5, 0]) # 元々は左上は黒(0.0)であることを確認 2test_images_noisy[:, 0:3, 0:3, 0] = 1.0 # 左上3x3画素に白(1.0)を代入 3print(test_images_noisy[0:3, 0:5, 0:5, 0]) # 白が代入されたことを確認

0を代入したら黒になります
白は1.0です
test_imagesをコピーしてtest_images_noisyを作った時点で、既に値の範囲が0.0~1.0だからです

投稿2020/12/31 07:52

jbpb0

総合スコア7653

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

intオブジェクトにはastype属性がありません。すなわち、astypeなんて関数定義されてないから当然使えませんってことです。astype関数を定義するか、それに代わる関数を使ってください。

投稿2020/12/19 04:46

rtgsdfsdg

総合スコア174

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問