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

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

ただいまの
回答率

90.38%

  • Python

    12839questions

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

kerasを用いたAutoencoderの設定の際のプログラムエラーについて

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 506

yohehe

score 38

1次元のCNNとAutoencoderの勉強をしております。エンコーダーとデコーダーの設定の時点でエラーが出てしまいます。
以下試しに作成しているプログラムです。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import keras
from keras.models import Sequential,Model
from keras.layers import GRU,LSTM, Dense, Activation,Dropout,Conv1D,Conv2D,MaxPooling1D,Flatten
from keras.layers import UpSampling1D
from keras.layers import Conv2D,MaxPooling2D
from keras.optimizers import Adagrad
from keras.layers import LeakyReLU
from keras import regularizers
from keras.layers.convolutional_recurrent import ConvLSTM2D
from keras.layers.convolutional import Conv3D
%matplotlib inline
from keras import layers
from keras.layers import normalization


#encoder,decoderのdefを設定する。
def encoder(input_data):
    #encoder 
    #input_dataのshapeを定義する。
    conv1=Conv1D(32,3,activation="relu",padding="same")(input_data)
    conv1=normalization.BatchNormalization()(conv1)
    conv1=Conv1D(32,3,activation="relu",padding="same")(conv1)
    #pooling
    pooling1=MaxPooling1D(3,padding='same')(conv1)
    conv2=Conv1D(64,3,activation="relu",padding="same")(pooling1)
    conv2=normalization.BatchNormalization()(conv2)
    conv2=Conv1D(64,activation="relu",padding="same")(conv2)
    return conv2

def decoder(conv2):
    conv3=Conv1D(64,3,activation="relu",padding="same")(conv2)
    conv3=BatchNormalization()(conv3)
    conv3=Conv1D(64,3,activation="relu",padding="same")(conv3)
    #upsampling 1
    up1=UpSampling1D(3,padding="same")(conv3)
    conv4=Conv1D(32,3,activation="relu",padding="same")(up1)
    conv4=BatchNormalization()(conv4)
    conv4=Conv1D(32,3,activation="relu",padding="same")(conv4)
    #upsampling 2
    up2=UpSampling1D(3,padding="same")(conv4)
    decoded=Conv1D(1,3,activation="sigmoid",padding="same")(up2)
    return decoded

#上記でencoderとdecoderを定義しました。
#あまり以下の方法は望ましいかはわかりませんが、とりあえず動作するために、特徴量と教師データを乱数で設定して、model.sumaryを出すために乱数を設定しています。

# 試しのランダムデータを生成
#conv1dは(サンプル数、特徴量数、特徴量の次元数)となっているはずなので,reshape
otameshi_data=np.random.randn(8000).reshape(100,20,4)
otameshi_data=np.array(otameshi_data)
print(otameshi_data.shape)
#とりあえずCNN1Dに合わせて次元数をあわせる
X=otameshi_data

otameshi_target=np.random.randint(0,10,100)
print(otameshi_target.shape)
y=otameshi_target

#train,testデータに分類を行う。

from sklearn.model_selection import train_test_split

(train_X, test_X, train_y, test_y) = train_test_split(X, y,test_size=0.2,shuffle=True)

train_X = np.array(train_X)
train_y =np.array(train_y)
test_X=np.array(test_X)
test_y=np.array(test_y)

from keras.utils import np_utils
#one-hot表現に変更
train_y=np_utils.to_categorical(train_y)
test_y=np_utils.to_categorical(test_y)
print(train_y.shape)
print(test_y.shape)

autoencoder=Model(input_data,decoder(encoder(input_data=otameshi_data)))
autoencoder.compile(loss="mean_squared_error",optimizer="RMSprop")
autoencoder.summary()
#model.fitを行う前にsummaryの点でerrorが出てしまいます。
コード


上記で設定してmodelsummaryを出力してパラメーターを表示しようとすると、以下のエラーが出ます。

ValueError                                Traceback (most recent call last)
~\Anaconda3\envs\py36\lib\site-packages\keras\engine\base_layer.py in assert_input_compatibility(self, inputs)
278             try:
--> 279                 K.is_keras_tensor(x)
280             except ValueError:

~\Anaconda3\envs\py36\lib\site-packages\keras\backend\tensorflow_backend.py in is_keras_tensor(x)
473         raise ValueError('Unexpectedly found an instance of type ' + --> 474                          str(type(x)) + '. '
475                          'Expected a symbolic tensor instance.')

ValueError: Unexpectedly found an instance of type <class 'numpy.ndarray'>. Expected a symbolic tensor instance.

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-98-d8750ea44a19> in <module>
----> 1 autoencoder=Model(input_data,decoder(encoder(input_data=input_data)))
2 autoencoder.compile(loss="mean_squared_error",optimizer="RMSprop")
3 autoencoder.summary()

<ipython-input-86-75e0757ed926> in encoder(input_data)
7     #encoder
8     #input_dataのshapeを定義する。
----> 9     conv1=Conv1D(32,3,activation="relu",padding="same")(input_data)
10     conv1=normalization.BatchNormalization()(conv1)
11     conv1=Conv1D(32,3,activation="relu",padding="same")(conv1)

~\Anaconda3\envs\py36\lib\site-packages\keras\engine\base_layer.py in call(self, inputs, **kwargs)
412                 # Raise exceptions in case the input is not compatible
413                 # with the input_spec specified in the layer constructor.
--> 414                 self.assert_input_compatibility(inputs)
415 
416                 # Collect input shapes to build layer.

~\Anaconda3\envs\py36\lib\site-packages\keras\engine\base_layer.py in assert_input_compatibility(self, inputs)
283                                  'Received type: ' +
284                                  str(type(x)) + '. Full input: ' +
--> 285                                  str(inputs) + '. All inputs to the layer '
286                                  'should be tensors.')
287 

ValueError: Layer conv1d_7 was called with an input that isn't a symbolic tensor. Received type: <class 'numpy.ndarray'>

上記がエラーの内容です。
畳み込み内のpaddingはすべてsameにしているのですが、パラメータ何度か変更してもエラーですすみません。

どこが間違っているかアドバイスを頂けますと幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

まだ回答がついていません

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

  • ただいまの回答率 90.38%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • Python

    12839questions

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