keras

时间:2016-12-25 12:04:37

标签: tensorflow deep-learning theano keras

我想在keras中使用Convul​​ation1D对数据集进行分类。

数据集说明

训练数据集大小= [340,30];样本数= 340,样本维数= 30

测试数据集大小= [230,30];样本数= 230,样本维数= 30

标签尺寸= 2

拳头我使用来自keras网站https://keras.io/layers/convolutional/

的信息尝试使用以下代码
batch_size=1
nb_epoch = 10
sizeX=340
sizeY=30
model = Sequential()
model.add(Convolution1D(64, 3, border_mode='same', input_shape=(sizeX,sizeY)))
model.add(Convolution1D(32, 3, border_mode='same'))
model.add(Convolution1D(16, 3, border_mode='same'))
model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

print('Train...')
model.fit(X_train_transformed, y_train, batch_size=batch_size, nb_epoch=nb_epoch,
          validation_data=(X_test, y_test))
score, acc = model.evaluate(X_test_transformed, y_test, batch_size=batch_size)
print('Test score:', score)
print('Test accuracy:', acc)

它给出以下错误, ValueError:检查模型输入时出错:预期卷积1d_input_1有3个维度,但得到的数组有形状(340,30)

然后我使用以下代码将Train和Test数据从2维转换为3维

X_train = np.reshape(X_train_transformed, (X_train_transformed.shape[0], X_train_transformed.shape[1], 1))
X_test = np.reshape(X_test_transformed, (X_test_transformed.shape[0], X_test_transformed.shape[1], 1))

然后我运行修改后的代码

batch_size=1
nb_epoch = 10
sizeX=340
sizeY=30

model = Sequential()
model.add(Convolution1D(64, 3, border_mode='same', input_shape=(sizeX,sizeY)))
model.add(Convolution1D(32, 3, border_mode='same'))
model.add(Convolution1D(16, 3, border_mode='same'))
model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

print('Train...')
model.fit(X_train, y_train, batch_size=batch_size, nb_epoch=nb_epoch,
          validation_data=(X_test, y_test))
score, acc = model.evaluate(X_test, y_test, batch_size=batch_size)
print('Test score:', score)
print('Test accuracy:', acc)

但它显示错误, ValueError:检查模型输入时出错:预期卷积1d_input_1具有形状(无,340,30)但是具有形状的阵列(340,30,1)

我无法在此处找到尺寸不匹配错误。

2 个答案:

答案 0 :(得分:1)

随着TF 2.0和tf.keras的发布,您可以相当轻松地更新模型以与这些新版本一起使用。可以使用以下代码完成此操作:

# import tensorflow 2.0
# keras doesn't need to be imported because it is built into tensorflow
from __future__ import absolute_import, division, print_function, unicode_literals

try:
  %tensorflow_version 2.x
except Exception:
  pass

import tensorflow as tf


batch_size = 1
nb_epoch = 10
# the model only needs the size of the sample as input, explained further below
size = 30

# reshape as you had before
X_train = np.reshape(X_train_transformed, (X_train_transformed.shape[0],                        
    X_train_transformed.shape[1], 1))
X_test = np.reshape(X_test_transformed, (X_test_transformed.shape[0], 
    X_test_transformed.shape[1], 1))

# define the sequential model using tf.keras
model = tf.keras.Sequential([

      # the 1d convolution layers can be defined as shown with the same
      # number of filters and kernel size
      # instead of border_mode, the parameter is padding
      # the input_shape is (the size of each sample, 1), explained below
      tf.keras.layers.Conv1D(64, 3, padding='same', input_shape=(size, 1)),
      tf.keras.layers.Conv1D(32, 3, padding='same'),
      tf.keras.layers.Conv1D(16, 3, padding='same'),

      # Dense and Activation can be combined into one layer
      # where the dense layer has 1 neuron and a sigmoid activation
      tf.keras.layers.Dense(1, activation='sigmoid')
])

# the model can be compiled, fit, and evaluated in the same way
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

print('Train...')
model.fit(X_train, y_train, batch_size=batch_size, nb_epoch=nb_epoch,
          validation_data=(X_test, y_test))

score, acc = model.evaluate(X_test, y_test, batch_size=batch_size)
print('Test score:', score)
print('Test accuracy:', acc)

您遇到的问题来自模型的输入形状。根据{{​​3}},模型的输入形状必须为(批,步,通道)。这意味着第一个维度是您拥有的实例数。第二维是每个样本的大小。第三维是通道数,在您的情况下只能是一个。总体而言,您的输入形状为(340,30,1)。在模型中实际定义输入形状时,只需指定第二和第三个尺寸,这意味着您的输入形状将为(size,1)。该模型已经将第一个维度(即您拥有的实例数)作为输入,因此您无需指定该维度。

答案 1 :(得分:0)

你能试试吗?

X_train = np.reshape(X_train_transformed, (1, X_train_transformed.shape[0], X_train_transformed.shape[1]))
X_test = np.reshape(X_test_transformed, (1, X_test_transformed.shape[0], X_test_transformed.shape[1]))