虽然通常人们倾向于在训练CNN时简单地将任何图像调整为正方形(例如,resnet采用224x224方形图像),这对我来说看起来很难看,特别是当纵横比不是1时.
(事实上,这可能会改变基本事实,例如专家可能给出扭曲图像的标签可能与原始图像不同).
所以现在我将图像调整为224x160,保持原始比例,然后用0填充图像(将其粘贴到完全黑色的224x224图像中的随机位置).
我的方法对我来说似乎并不原创,但我找不到任何有关我的方法与"通常"方法的信息.时髦!
那么,哪种方法更好?为什么?(如果答案是数据相关的,请分享你的想法,如果一个优先于另一个.)
image machine-learning computer-vision neural-network conv-neural-network
我正在尝试使用Keras生成CNN,并编写以下代码:
batch_size = 64
epochs = 20
num_classes = 5
cnn_model = Sequential()
cnn_model.add(Conv2D(32, kernel_size=(3, 3), activation='linear',
input_shape=(380, 380, 1), padding='same'))
cnn_model.add(Activation('relu'))
cnn_model.add(MaxPooling2D((2, 2), padding='same'))
cnn_model.add(Conv2D(64, (3, 3), activation='linear', padding='same'))
cnn_model.add(Activation('relu'))
cnn_model.add(MaxPooling2D(pool_size=(2, 2), padding='same'))
cnn_model.add(Conv2D(128, (3, 3), activation='linear', padding='same'))
cnn_model.add(Activation('relu'))
cnn_model.add(MaxPooling2D(pool_size=(2, 2), padding='same'))
cnn_model.add(Flatten())
cnn_model.add(Dense(128, activation='linear'))
cnn_model.add(Activation('relu'))
cnn_model.add(Dense(num_classes, activation='softmax'))
cnn_model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adam(), metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)
我想使用Keras的LeakyReLU激活层而不是使用Activation('relu').但是,我尝试使用LeakyReLU(alpha=0.1)到位,但这是Keras中的激活层,我收到有关使用激活层而不是激活函数的错误.
在这个例子中如何使用LeakyReLU?
python machine-learning neural-network conv-neural-network keras
是否有TensorFlow原生函数可以解卷积网络解开?
我已经在普通的python中写了这个,但是当它想要将它翻译成TensorFlow时变得越来越复杂,因为它的对象目前甚至不支持项目分配,我认为这对TF来说非常不方便.
真的很难理解keras中卷积1d 层的输入维度:
输入形状
具有形状的3D张量:(样本,步骤,input_dim).
输出形状
具有形状的3D张量:(samples,new_steps,nb_filter).由于填充,步骤值可能已更改.
我希望我的网络采用价格的时间序列(按顺序排列101)并输出4个概率.我当前的非卷积网络做得相当好(训练集为28000)看起来像这样:
standardModel = Sequential()
standardModel.add(Dense(input_dim=101, output_dim=100, W_regularizer=l2(0.5), activation='sigmoid'))
standardModel.add(Dense(4, W_regularizer=l2(0.7), activation='softmax'))
Run Code Online (Sandbox Code Playgroud)
为了改善这一点,我想从输入层创建一个特征映射,该映射具有长度为10的本地接收字段(因此具有10个共享权重和1个共享偏差).然后,我想使用最大池并将其馈入40个左右神经元的隐藏层,然后在外层输出4个带有softmax的神经元.
理想情况下,卷积层将采用2d张量维度:
(minibatch_size,101)
并输出3d张量的尺寸
(minibatch_size,91,no_of_featuremaps)
但是,keras层似乎需要输入中称为step的维度.我已经尝试了解这一点,但仍然没有完全理解.在我的情况下,步骤为1,因为向量中的每个步骤都是1的时间增加?另外,new_step是什么?
另外,如何将汇集层的输出(3d张量)转换为适合标准隐藏层(即密集keras层)的输入,形式为2d张量?
更新:在给出非常有用的建议之后,我尝试制作一个卷积网络,如下所示:
conv = Sequential()
conv.add(Convolution1D(64, 10, input_shape=(1,101)))
conv.add(Activation('relu'))
conv.add(MaxPooling1D(2))
conv.add(Flatten())
conv.add(Dense(10))
conv.add(Activation('tanh'))
conv.add(Dense(4))
conv.add(Activation('softmax'))
Run Code Online (Sandbox Code Playgroud)
conv.Add(Flatten())行抛出一个超出有效边界误差的范围.有趣的是,这个代码不会引发此错误:
conv = Sequential()
conv.add(Convolution1D(64, 10, input_shape=(1,101)))
conv.add(Activation('relu'))
conv.add(MaxPooling1D(2))
conv.add(Flatten())
Run Code Online (Sandbox Code Playgroud)
干
print conv.input_shape
print conv.output_shape
Run Code Online (Sandbox Code Playgroud)
结果是
(None, 1, 101
(None, -256)
Run Code Online (Sandbox Code Playgroud)
被退回
更新2:
变
conv.add(Convolution1D(64, 10, input_shape=(1,101)))
Run Code Online (Sandbox Code Playgroud)
至
conv.add(Convolution1D(10, 10, input_shape=(101,1))
Run Code Online (Sandbox Code Playgroud)
它开始工作了.但是,输入(无,101,1)到1d转换层或(无,1,101)之间是否有任何重要的区别?为什么(无,1,101)不起作用?
在本教程中关于对象检测,提到了快速R-CNN.还提到了ROI(感兴趣区域)层.
在数学上,当根据最终卷积层激活函数(在每个单元格中)调整区域提议的大小时,会发生什么?
object-detection computer-vision deep-learning conv-neural-network
TL.DR. 是否有三维友好实施theano.tensor.nnet.neighbours.images2neibs?
我想使用一个接收nxnxn图像的神经网络对体积(NxNxN)进行体素分类,其中N> n.为了对体积中的每个体素进行分类,我必须遍历每个体素.对于每次迭代,我获得并传递邻域体素作为神经网络的输入.这只是一个滑动窗口操作,其操作是神经网络.
虽然我的神经网络在Theano中实现,但滑动窗口实现是python/numpy.由于这不是纯粹的Theano操作,因此分类需要永久(> 3小时)来对一个体积中的所有体素进行分类.对于2d滑动窗口操作,Theano有一个辅助方法theano.tensor.nnet.neighbours.images2neibs,是否有类似的三维图像实现?
编辑:nd滑动窗口现有numpy解决方案(1和2),都使用np.lib.stride_tricks.as_strided来提供"滑动窗口的视图",从而防止内存问题.在我的实现中,滑动窗口数组从numpy(Cython)传递到Python然后传递到Theano.为了提高性能,我可能不得不绕过Python.
据我了解,所有CNN都非常相似.它们都有一个卷积层,然后是池和relu层.有些人有像FlowNet和Segnet这样的专门层.我怀疑的是我们应该如何决定使用多少层以及如何为网络中的每个层设置内核大小.我已经找到了这个问题的答案,但我找不到具体的答案.网络是使用反复试验设计的,还是我不了解的一些特定规则?如果你能澄清一下,我将非常感谢你.
convolution neural-network deep-learning caffe conv-neural-network
我注意到在很多地方人们使用这样的东西,通常是在完全卷积网络,自动编码器和类似的东西:
model.add(UpSampling2D(size=(2,2)))
model.add(Conv2DTranspose(kernel_size=k, padding='same', strides=(1,1))
Run Code Online (Sandbox Code Playgroud)
我想知道它之间的区别是什么?
model.add(Conv2DTranspose(kernel_size=k, padding='same', strides=(2,2))
Run Code Online (Sandbox Code Playgroud)
我们欢迎任何解释这种差异的论文链接.
convolution deep-learning conv-neural-network keras deconvolution
我在看InceptionV3(GoogLeNet)架构,无法理解为什么我们需要conv1x1层?
我知道卷积是如何工作的,但我看到补丁大小> 1的利润.
convolution neural-network deep-learning conv-neural-network tensorflow
在这里,在这个代码UpSampling2D并且Conv2DTranspose似乎可以互换使用。我想知道为什么会这样。
# u-net model with up-convolution or up-sampling and weighted binary-crossentropy as loss func
from keras.models import Model
from keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D, concatenate, Conv2DTranspose, BatchNormalization, Dropout
from keras.optimizers import Adam
from keras.utils import plot_model
from keras import backend as K
def unet_model(n_classes=5, im_sz=160, n_channels=8, n_filters_start=32, growth_factor=2, upconv=True,
class_weights=[0.2, 0.3, 0.1, 0.1, 0.3]):
droprate=0.25
n_filters = n_filters_start
inputs = Input((im_sz, im_sz, n_channels))
#inputs = BatchNormalization()(inputs)
conv1 = Conv2D(n_filters, (3, 3), activation='relu', padding='same')(inputs)
conv1 = …Run Code Online (Sandbox Code Playgroud) machine-learning convolution computer-vision conv-neural-network deconvolution
convolution ×4
keras ×3
python ×3
tensorflow ×2
theano ×2
caffe ×1
cython ×1
image ×1
numpy ×1