1次元のCNNとAutoencoderの勉強をしております。エンコーダーとデコーダーの設定の時点でエラーが出てしまいます。
以下試しに作成しているプログラムです。
python
1import numpy as np 2import matplotlib.pyplot as plt 3import pandas as pd 4import seaborn as sns 5import keras 6from keras.models import Sequential,Model 7from keras.layers import GRU,LSTM, Dense, Activation,Dropout,Conv1D,Conv2D,MaxPooling1D,Flatten 8from keras.layers import UpSampling1D 9from keras.layers import Conv2D,MaxPooling2D 10from keras.optimizers import Adagrad 11from keras.layers import LeakyReLU 12from keras import regularizers 13from keras.layers.convolutional_recurrent import ConvLSTM2D 14from keras.layers.convolutional import Conv3D 15%matplotlib inline 16from keras import layers 17from keras.layers import normalization 18 19 20#encoder,decoderのdefを設定する。 21def encoder(input_data): 22 #encoder 23 #input_dataのshapeを定義する。 24 conv1=Conv1D(32,3,activation="relu",padding="same")(input_data) 25 conv1=normalization.BatchNormalization()(conv1) 26 conv1=Conv1D(32,3,activation="relu",padding="same")(conv1) 27 #pooling 28 pooling1=MaxPooling1D(3,padding='same')(conv1) 29 conv2=Conv1D(64,3,activation="relu",padding="same")(pooling1) 30 conv2=normalization.BatchNormalization()(conv2) 31 conv2=Conv1D(64,activation="relu",padding="same")(conv2) 32 return conv2 33 34def decoder(conv2): 35 conv3=Conv1D(64,3,activation="relu",padding="same")(conv2) 36 conv3=BatchNormalization()(conv3) 37 conv3=Conv1D(64,3,activation="relu",padding="same")(conv3) 38 #upsampling 1 39 up1=UpSampling1D(3,padding="same")(conv3) 40 conv4=Conv1D(32,3,activation="relu",padding="same")(up1) 41 conv4=BatchNormalization()(conv4) 42 conv4=Conv1D(32,3,activation="relu",padding="same")(conv4) 43 #upsampling 2 44 up2=UpSampling1D(3,padding="same")(conv4) 45 decoded=Conv1D(1,3,activation="sigmoid",padding="same")(up2) 46 return decoded 47 48#上記でencoderとdecoderを定義しました。 49#あまり以下の方法は望ましいかはわかりませんが、とりあえず動作するために、特徴量と教師データを乱数で設定して、model.sumaryを出すために乱数を設定しています。 50 51# 試しのランダムデータを生成 52#conv1dは(サンプル数、特徴量数、特徴量の次元数)となっているはずなので,reshape 53otameshi_data=np.random.randn(8000).reshape(100,20,4) 54otameshi_data=np.array(otameshi_data) 55print(otameshi_data.shape) 56#とりあえずCNN1Dに合わせて次元数をあわせる 57X=otameshi_data 58 59otameshi_target=np.random.randint(0,10,100) 60print(otameshi_target.shape) 61y=otameshi_target 62 63#train,testデータに分類を行う。 64 65from sklearn.model_selection import train_test_split 66 67(train_X, test_X, train_y, test_y) = train_test_split(X, y,test_size=0.2,shuffle=True) 68 69train_X = np.array(train_X) 70train_y =np.array(train_y) 71test_X=np.array(test_X) 72test_y=np.array(test_y) 73 74from keras.utils import np_utils 75#one-hot表現に変更 76train_y=np_utils.to_categorical(train_y) 77test_y=np_utils.to_categorical(test_y) 78print(train_y.shape) 79print(test_y.shape) 80 81autoencoder=Model(input_data,decoder(encoder(input_data=otameshi_data))) 82autoencoder.compile(loss="mean_squared_error",optimizer="RMSprop") 83autoencoder.summary() 84#model.fitを行う前にsummaryの点でerrorが出てしまいます。 85コード
上記で設定して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にしているのですが、パラメータ何度か変更してもエラーですすみません。
どこが間違っているかアドバイスを頂けますと幸いです。
あなたの回答
tips
プレビュー