1. 程式人生 > 程式設計 >解決keras使用cov1D函式的輸入問題

解決keras使用cov1D函式的輸入問題

解決了以下錯誤:

1.ValueError: Input 0 is incompatible with layer conv1d_1: expected ndim=3,found ndim=4

2.ValueError: Error when checking target: expected dense_3 to have 3 dimensions,but got array with …

1.ValueError: Input 0 is incompatible with layer conv1d_1: expected ndim=3,found ndim=4

錯誤程式碼:

model.add(Conv1D(8,kernel_size=3,strides=1,padding='same',input_shape=(x_train.shape))

或者

model.add(Conv1D(8,input_shape=(x_train.shape[1:])))

這是因為模型輸入的維數有誤,在使用基於tensorflow的keras中,cov1d的input_shape是二維的,應該:

1、reshape x_train的形狀

x_train=x_train.reshape((x_train.shape[0],x_train.shape[1],1))
x_test = x_test.reshape((x_test.shape[0],x_test.shape[1],1))

2、改變input_shape

model = Sequential()

model.add(Conv1D(8,input_shape=(x_train.shape[1],1)))

大神原文:

The input shape is wrong,it should be input_shape = (1,3253) for Theano or (3253,1) for TensorFlow. The input shape doesn't include the number of samples.

Then you need to reshape your data to include the channels axis:

x_train = x_train.reshape((500000,1,3253))

Or move the channels dimension to the end if you use TensorFlow. After these changes it should work.

2.ValueError: Error when checking target: expected dense_3 to have 3 dimensions,but got array with …

出現此問題是因為ylabel的維數與x_train x_test不符,既然將x_train x_test都reshape了,那麼也需要對y進行reshape。

解決辦法:

同時對照x_train改變ylabel的形狀

t_train=t_train.reshape((t_train.shape[0],1))
t_test = t_test.reshape((t_test.shape[0],1))

附:

修改完的程式碼:

import warnings
warnings.filterwarnings("ignore")
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"

import pandas as pd
import numpy as np
import matplotlib
# matplotlib.use('Agg')
import matplotlib.pyplot as plt

from sklearn.model_selection import train_test_split
from sklearn import preprocessing

from keras.models import Sequential
from keras.layers import Dense,Dropout,BatchNormalization,Activation,Flatten,Conv1D
from keras.callbacks import LearningRateScheduler,EarlyStopping,ModelCheckpoint,ReduceLROnPlateau
from keras import optimizers
from keras.regularizers import l2
from keras.models import load_model
df_train = pd.read_csv('./input/train_V2.csv')
df_test = pd.read_csv('./input/test_V2.csv')
df_train.drop(df_train.index[[2744604]],inplace=True)#去掉nan值
df_train["distance"] = df_train["rideDistance"]+df_train["walkDistance"]+df_train["swimDistance"]
# df_train["healthpack"] = df_train["boosts"] + df_train["heals"]
df_train["skill"] = df_train["headshotKills"]+df_train["roadKills"]
df_test["distance"] = df_test["rideDistance"]+df_test["walkDistance"]+df_test["swimDistance"]
# df_test["healthpack"] = df_test["boosts"] + df_test["heals"]
df_test["skill"] = df_test["headshotKills"]+df_test["roadKills"]

df_train_size = df_train.groupby(['matchId','groupId']).size().reset_index(name='group_size')
df_test_size = df_test.groupby(['matchId','groupId']).size().reset_index(name='group_size')

df_train_mean = df_train.groupby(['matchId','groupId']).mean().reset_index()
df_test_mean = df_test.groupby(['matchId','groupId']).mean().reset_index()

df_train = pd.merge(df_train,df_train_mean,suffixes=["","_mean"],how='left',on=['matchId','groupId'])
df_test = pd.merge(df_test,df_test_mean,'groupId'])
del df_train_mean
del df_test_mean

df_train = pd.merge(df_train,df_train_size,df_test_size,'groupId'])
del df_train_size
del df_test_size

target = 'winPlacePerc'
train_columns = list(df_test.columns)
""" remove some columns """
train_columns.remove("Id")
train_columns.remove("matchId")
train_columns.remove("groupId")
train_columns_new = []
for name in train_columns:
  if '_' in name:
    train_columns_new.append(name)
train_columns = train_columns_new
# print(train_columns)

X = df_train[train_columns]
Y = df_test[train_columns]
T = df_train[target]

del df_train
x_train,x_test,t_train,t_test = train_test_split(X,T,test_size = 0.2,random_state = 1234)

# scaler = preprocessing.MinMaxScaler(feature_range=(-1,1)).fit(x_train)
scaler = preprocessing.QuantileTransformer().fit(x_train)

x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)
Y = scaler.transform(Y)
x_train=x_train.reshape((x_train.shape[0],1))
x_test = x_test.reshape((x_test.shape[0],1))
t_train=t_train.reshape((t_train.shape[0],1))
t_test = t_test.reshape((t_test.shape[0],1))

model = Sequential()
model.add(Conv1D(8,1)))
model.add(BatchNormalization())
model.add(Conv1D(8,padding='same'))
model.add(Conv1D(16,padding='valid'))
model.add(BatchNormalization())
model.add(Conv1D(16,padding='same'))
model.add(Conv1D(32,padding='valid'))
model.add(BatchNormalization())
model.add(Conv1D(32,padding='same'))
model.add(Conv1D(64,padding='same'))
model.add(Activation('tanh'))
model.add(Flatten())
model.add(Dropout(0.5))
# model.add(Dropout(0.25))
model.add(Dense(512,kernel_initializer='he_normal',activation='relu',W_regularizer=l2(0.01)))
model.add(Dense(128,W_regularizer=l2(0.01)))
model.add(Dense(1,kernel_initializer='normal',activation='sigmoid'))

optimizers.Adam(lr=0.01,epsilon=1e-8,decay=1e-4)

model.compile(optimizer=optimizer,loss='mse',metrics=['mae'])
model.summary()

ng = EarlyStopping(monitor='val_mean_absolute_error',mode='min',patience=4,verbose=1)
# model_checkpoint = ModelCheckpoint(filepath='best_model.h5',monitor='val_mean_absolute_error',mode = 'min',save_best_only=True,verbose=1)
# reduce_lr = ReduceLROnPlateau(monitor='val_mean_absolute_error',factor=0.5,patience=3,min_lr=0.0001,verbose=1)
history = model.fit(x_train,validation_data=(x_test,t_test),epochs=30,batch_size=32768,callbacks=[early_stopping],verbose=1)predict(Y)
pred = pred.ravel()

補充知識:Keras Conv1d 引數及輸入輸出詳解

Conv1d(in_channels,out_channels,kernel_size,stride=1,padding=0,dilation=1,groups=1,bias=True)

filters:卷積核的數目(即輸出的維度)

kernel_size: 整數或由單個整數構成的list/tuple,卷積核的空域或時域窗長度

strides: 整數或由單個整數構成的list/tuple,為卷積的步長。任何不為1的strides均為任何不為1的dilation_rata均不相容

padding: 補0策略,為”valid”,”same”或”casual”,”casual”將產生因果(膨脹的)卷積,即output[t]不依賴於input[t+1:]。當對不能違反事件順序的時序訊號建模時有用。“valid”代表只進行有效的卷積,即對邊界資料不處理。“same”代表保留邊界處的卷積結果,通常會導致輸出shape與輸入shape相同。

activation:啟用函式,為預定義的啟用函式名,或逐元素的Theano函式。如果不指定該函式,將不會使用任何啟用函式(即使用線性啟用函式:a(x)=x)

model.add(Conv1D(filters=nn_params["input_filters"],kernel_size=nn_params["filter_length"],padding='valid',activation=nn_params["activation"],kernel_regularizer=l2(nn_params["reg"])))

例:輸入維度為(None,1000,4)

第一維度:None

第二維度:output_length = int((input_length - nn_params["filter_length"] + 1))

在此情況下為:output_length = (1000 + 2*padding - filters +1)/ strides = (1000 + 2*0 -32 +1)/1 = 969

第三維度:filters

以上這篇解決keras使用cov1D函式的輸入問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。